Unstable 1.1.14.0

This commit is contained in:
Markus Isberg
2023-10-02 16:43:54 +03:00
parent 94f5a93a0c
commit cf8f0de659
606 changed files with 21906 additions and 11456 deletions
@@ -286,17 +286,32 @@ namespace Barotrauma
public void UpdateUseItem(bool allowMovement, Vector2 handWorldPos)
{
useItemTimer = 0.5f;
useItemTimer = 0.05f;
StartUsingItem();
if (!allowMovement)
{
TargetMovement = Vector2.Zero;
TargetDir = handWorldPos.X > character.WorldPosition.X ? Direction.Right : Direction.Left;
float sqrDist = Vector2.DistanceSquared(character.WorldPosition, handWorldPos);
if (sqrDist > MathUtils.Pow(ConvertUnits.ToDisplayUnits(upperArmLength + forearmLength), 2))
if (InWater)
{
TargetMovement = Vector2.Normalize(handWorldPos - character.WorldPosition) * GetCurrentSpeed(false) * Math.Max(character.SpeedMultiplier, 1);
float sqrDist = Vector2.DistanceSquared(character.WorldPosition, handWorldPos);
if (sqrDist > MathUtils.Pow(ConvertUnits.ToDisplayUnits(upperArmLength + forearmLength), 2))
{
TargetMovement = GetTargetMovement(Vector2.Normalize(handWorldPos - character.WorldPosition));
}
}
else
{
float distX = Math.Abs(handWorldPos.X - character.WorldPosition.X);
if (distX > ConvertUnits.ToDisplayUnits(upperArmLength + forearmLength))
{
TargetMovement = GetTargetMovement(Vector2.UnitX * Math.Sign(handWorldPos.X - character.WorldPosition.X));
}
}
Vector2 GetTargetMovement(Vector2 dir)
{
return dir * GetCurrentSpeed(false) * Math.Max(character.SpeedMultiplier, 1);
}
}
@@ -308,6 +323,15 @@ namespace Barotrauma
handSimPos -= character.Submarine.SimPosition;
}
Vector2 refPos = rightShoulder?.WorldAnchorA ?? leftShoulder?.WorldAnchorA ?? MainLimb.SimPosition;
Vector2 diff = handSimPos - refPos;
float dist = diff.Length();
float maxDist = ArmLength * 0.9f;
if (dist > maxDist)
{
handSimPos = refPos + diff / dist * maxDist;
}
var leftHand = GetLimb(LimbType.LeftHand);
if (leftHand != null)
{
@@ -323,6 +347,16 @@ namespace Barotrauma
rightHand.PullJointEnabled = true;
rightHand.PullJointWorldAnchorB = handSimPos;
}
//make the character crouch if using an item some distance below them (= on the floor)
if (!inWater &&
character.WorldPosition.Y - handWorldPos.Y > ConvertUnits.ToDisplayUnits(CurrentGroundedParams.TorsoPosition) / 4 &&
this is HumanoidAnimController humanoidAnimController)
{
humanoidAnimController.Crouching = true;
humanoidAnimController.ForceSelectAnimationType = AnimationType.Crouch;
character.SetInput(InputType.Crouch, hit: false, held: true);
}
}
public void Grab(Vector2 rightHandPos, Vector2 leftHandPos)
@@ -352,13 +386,8 @@ namespace Barotrauma
//calculate the handle positions
Matrix itemTransfrom = Matrix.CreateRotationZ(item.body.Rotation);
float horizontalOffset = ConvertUnits.ToSimUnits((item.Sprite.size.X / 2 - item.Sprite.Origin.X) * item.Scale);
//handlePos[0] = ConvertUnits.ToSimUnits(new Vector2(-45,25) * 0.5f);
//handlePos[1] = ConvertUnits.ToSimUnits(new Vector2(-65,30) * 0.5f);
transformedHandlePos[0] = Vector2.Transform(new Vector2(handlePos[0].X + horizontalOffset, handlePos[0].Y), itemTransfrom);
transformedHandlePos[1] = Vector2.Transform(new Vector2(handlePos[1].X + horizontalOffset, handlePos[1].Y), itemTransfrom);
transformedHandlePos[0] = Vector2.Transform(handlePos[0], itemTransfrom);
transformedHandlePos[1] = Vector2.Transform(handlePos[1], itemTransfrom);
Limb torso = GetLimb(LimbType.Torso) ?? MainLimb;
Limb leftHand = GetLimb(LimbType.LeftHand);
@@ -385,7 +414,9 @@ namespace Barotrauma
if (aim && !isClimbing && !usingController && character.Stun <= 0.0f && itemPos != Vector2.Zero && !character.IsIncapacitated)
{
Vector2 mousePos = ConvertUnits.ToSimUnits(character.SmoothedCursorPosition);
Vector2 diff = holdable.Aimable ? (mousePos - AimSourceSimPos) * Dir : Vector2.UnitX;
Vector2 diff = holdable.Aimable ?
(mousePos - AimSourceSimPos) * Dir :
MathUtils.RotatePoint(Vector2.UnitX, torsoRotation);
holdAngle = MathUtils.VectorToAngle(new Vector2(diff.X, diff.Y * Dir)) - torsoRotation * Dir;
holdAngle += GetAimWobble(rightHand, leftHand, item);
itemAngle = torsoRotation + holdAngle * Dir;
@@ -480,6 +511,16 @@ namespace Barotrauma
return;
}
float targetAngle = MathUtils.WrapAngleTwoPi(itemAngle + itemAngleRelativeToHoldAngle * Dir);
float currentRotation = MathUtils.WrapAngleTwoPi(item.body.Rotation);
float itemRotation = MathHelper.SmoothStep(currentRotation, targetAngle, deltaTime * 25);
if (previousDirection != dir || Math.Abs(targetAngle - currentRotation) > MathHelper.Pi)
{
itemRotation = targetAngle;
}
item.SetTransform(currItemPos, itemRotation, setPrevTransform: false);
previousDirection = dir;
if (holdable.Pusher != null)
{
if (character.Stun > 0.0f || character.IsIncapacitated)
@@ -497,24 +538,11 @@ namespace Barotrauma
else
{
holdable.Pusher.TargetPosition = currItemPos;
holdable.Pusher.TargetRotation = holdAngle * Dir;
holdable.Pusher.TargetRotation = itemRotation;
holdable.Pusher.MoveToTargetPosition(true);
currItemPos = holdable.Pusher.SimPosition;
itemAngle = holdable.Pusher.Rotation;
}
}
}
float targetAngle = MathUtils.WrapAngleTwoPi(itemAngle + itemAngleRelativeToHoldAngle * Dir);
float currentRotation = MathUtils.WrapAngleTwoPi(item.body.Rotation);
float itemRotation = MathHelper.SmoothStep(currentRotation, targetAngle, deltaTime * 25);
if (previousDirection != dir || Math.Abs(targetAngle - currentRotation) > MathHelper.Pi)
{
itemRotation = targetAngle;
}
item.SetTransform(currItemPos, itemRotation, setPrevTransform: false);
previousDirection = dir;
if (!isClimbing && !character.IsIncapacitated && itemPos != Vector2.Zero && (aim || !holdable.UseHandRotationForHoldAngle))
{
@@ -144,7 +144,7 @@ namespace Barotrauma
set { HumanSwimFastParams = value as HumanSwimFastParams; }
}
public bool Crouching;
public bool Crouching { get; set; }
private float upperLegLength = 0.0f, lowerLegLength = 0.0f;
@@ -197,7 +197,7 @@ namespace Barotrauma
public HumanoidAnimController(Character character, string seed, HumanRagdollParams ragdollParams = null) : base(character, seed, ragdollParams)
{
// TODO: load from the character info file?
movementLerp = RagdollParams.MainElement.GetAttributeFloat("movementlerp", 0.4f);
movementLerp = RagdollParams?.MainElement?.GetAttributeFloat("movementlerp", 0.4f) ?? 0f;
}
public override void Recreate(RagdollParams ragdollParams = null)
@@ -243,19 +243,14 @@ namespace Barotrauma
if (MainLimb == null) { return; }
levitatingCollider = !IsHanging;
ColliderIndex = Crouching && !swimming ? 1 : 0;
if ((character.SelectedItem?.GetComponent<Controller>()?.ControlCharacterPose ?? false) ||
(character.SelectedSecondaryItem?.GetComponent<Controller>()?.ControlCharacterPose ?? false) ||
character.SelectedSecondaryItem?.GetComponent<Ladder>() != null ||
(ForceSelectAnimationType != AnimationType.Crouch && ForceSelectAnimationType != AnimationType.NotDefined))
{
Crouching = false;
ColliderIndex = 0;
}
else if (!Crouching && ColliderIndex == 1)
{
Crouching = true;
}
ColliderIndex = Crouching && !swimming ? 1 : 0;
//stun (= disable the animations) if the ragdoll receives a large enough impact
if (strongestImpact > 0.0f)
@@ -417,6 +412,22 @@ namespace Barotrauma
swimming = inWater;
swimmingStateLockTimer = 0.5f;
}
if (character.SelectedItem?.Prefab is { GrabWhenSelected: true } &&
character.SelectedItem.ParentInventory == null &&
character.SelectedItem.body is not { Enabled: true } &&
character.SelectedItem.GetComponent<Repairable>()?.CurrentFixer != character)
{
bool moving = character.IsKeyDown(InputType.Left) || character.IsKeyDown(InputType.Right);
moving |= (character.InWater || character.IsClimbing) && (character.IsKeyDown(InputType.Up) || character.IsKeyDown(InputType.Down));
if (!moving)
{
Vector2 handPos = character.SelectedItem.WorldPosition - Vector2.UnitY * ConvertUnits.ToDisplayUnits(ArmLength / 2);
handPos.Y = Math.Max(handPos.Y, character.SelectedItem.WorldRect.Y - character.SelectedItem.WorldRect.Height);
UpdateUseItem(
allowMovement: false,
handPos);
}
}
if (swimming)
{
UpdateSwimming();
@@ -616,7 +627,7 @@ namespace Barotrauma
if (TorsoAngle.HasValue && !torso.Disabled)
{
float torsoAngle = TorsoAngle.Value;
float herpesStrength = character.CharacterHealth.GetAfflictionStrength(AfflictionPrefab.SpaceHerpesType);
float herpesStrength = character.CharacterHealth.GetAfflictionStrengthByType(AfflictionPrefab.SpaceHerpesType);
if (Crouching && !movingHorizontally && !Aiming) { torsoAngle -= HumanCrouchParams.ExtraTorsoAngleWhenStationary; }
torsoAngle -= herpesStrength / 150.0f;
torso.body.SmoothRotate(torsoAngle * Dir, currentGroundedParams.TorsoTorque);
@@ -744,6 +744,13 @@ namespace Barotrauma
{
if (character.DisableImpactDamageTimer > 0.0f) { return; }
if (f2.Body?.UserData is Item)
{
//no impact damage from items
//items that can impact characters (melee weapons, projectiles) should handle the damage themselves
return;
}
Vector2 normal = localNormal;
float impact = Vector2.Dot(velocity, -normal);
if (f1.Body == Collider.FarseerBody || !Collider.Enabled)
@@ -753,16 +760,18 @@ namespace Barotrauma
if (isNotRemote)
{
if (impact > ImpactTolerance)
float impactTolerance = ImpactTolerance;
if (character.Stun > 0.0f) { impactTolerance *= 0.5f; }
if (impact > impactTolerance)
{
impactPos = ConvertUnits.ToDisplayUnits(impactPos);
if (character.Submarine != null) impactPos += character.Submarine.Position;
if (character.Submarine != null) { impactPos += character.Submarine.Position; }
float impactDamage = Math.Min((impact - ImpactTolerance) * ImpactDamageMultiplayer, character.MaxVitality * MaxImpactDamage);
float impactDamage = GetImpactDamage(impact, impactTolerance);
character.LastDamageSource = null;
character.AddDamage(impactPos, AfflictionPrefab.ImpactDamage.Instantiate(impactDamage).ToEnumerable(), 0.0f, true);
strongestImpact = Math.Max(strongestImpact, impact - ImpactTolerance);
strongestImpact = Math.Max(strongestImpact, impact - impactTolerance);
character.ApplyStatusEffects(ActionType.OnImpact, 1.0f);
//briefly disable impact damage
//otherwise the character will take damage multiple times when for example falling,
@@ -776,6 +785,12 @@ namespace Barotrauma
ImpactProjSpecific(impact, f1.Body);
}
public float GetImpactDamage(float impact, float? impactTolerance = null)
{
float tolerance = impactTolerance ?? ImpactTolerance;
return Math.Min((impact - tolerance) * ImpactDamageMultiplayer, character.MaxVitality * MaxImpactDamage);
}
private readonly List<Limb> connectedLimbs = new List<Limb>();
private readonly List<LimbJoint> checkedJoints = new List<LimbJoint>();
public bool SeverLimbJoint(LimbJoint limbJoint)
@@ -1023,7 +1038,12 @@ namespace Barotrauma
CurrentHull = newHull;
character.Submarine = currentHull?.Submarine;
character.AttachedProjectiles.ForEach(p => p?.Item?.UpdateTransform());
foreach (var attachedProjectile in character.AttachedProjectiles)
{
attachedProjectile.Item.CurrentHull = currentHull;
attachedProjectile.Item.Submarine = character.Submarine;
attachedProjectile.Item.UpdateTransform();
}
}
private void PreventOutsideCollision()
@@ -1323,6 +1343,11 @@ namespace Barotrauma
if (Collider.LinearVelocity == Vector2.Zero)
{
character.IsRagdolled = true;
if (character.IsBot)
{
// Seems to work without this on player controlled characters -> not sure if we should call it always or just for the bots.
character.SetInput(InputType.Ragdoll, hit: false, held: true);
}
}
}
}
@@ -1781,12 +1806,6 @@ namespace Barotrauma
Character.Latchers.ForEachMod(l => l?.DeattachFromBody(reset: true));
Character.Latchers.Clear();
if (detachProjectiles)
{
character.AttachedProjectiles.ForEachMod(p => p?.Unstick());
character.AttachedProjectiles.Clear();
}
Vector2 limbMoveAmount = forceMainLimbToCollider ? simPosition - MainLimb.SimPosition : simPosition - Collider.SimPosition;
if (lerp)
{
@@ -1823,7 +1842,7 @@ namespace Barotrauma
protected void TrySetLimbPosition(Limb limb, Vector2 original, Vector2 simPosition, float rotation, bool lerp = false, bool ignorePlatforms = true)
{
Vector2 movePos = simPosition;
Vector2 prevPosition = limb.body.SimPosition;
if (Vector2.DistanceSquared(original, simPosition) > 0.0001f)
{
Category collisionCategory = Physics.CollisionWall | Physics.CollisionLevel;
@@ -1851,6 +1870,16 @@ namespace Barotrauma
limb.PullJointWorldAnchorB = limb.PullJointWorldAnchorA;
limb.PullJointEnabled = false;
}
foreach (var attachedProjectile in character.AttachedProjectiles)
{
if (attachedProjectile.IsAttachedTo(limb.body))
{
attachedProjectile.Item.SetTransform(
attachedProjectile.Item.SimPosition + (movePos - prevPosition),
attachedProjectile.Item.body.Rotation,
findNewHull: false);
}
}
}