Unstable 0.1500.0.0

This commit is contained in:
Markus Isberg
2021-08-26 21:08:21 +09:00
parent 265a2e7ab3
commit 501e02c026
245 changed files with 9775 additions and 2034 deletions
@@ -33,7 +33,7 @@ namespace Barotrauma.Items.Components
private bool attachable, attached, attachedByDefault;
private Voronoi2.VoronoiCell attachTargetCell;
private readonly PhysicsBody body;
private PhysicsBody body;
public PhysicsBody Pusher
{
get;
@@ -780,7 +780,19 @@ namespace Barotrauma.Items.Components
DeattachFromWall();
}
}
protected override void RemoveComponentSpecific()
{
base.RemoveComponentSpecific();
attachTargetCell = null;
if (Pusher != null)
{
GameMain.World.Remove(Pusher.FarseerBody);
Pusher = null;
}
body = null;
}
public override XElement Save(XElement parentElement)
{
if (!attachable)
@@ -1,11 +1,29 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace Barotrauma.Items.Components
{
partial class IdCard : Pickable
{
[Serialize(CharacterTeamType.None, true, alwaysUseInstanceValues: true)]
public CharacterTeamType TeamID
{
get;
set;
}
[Serialize(0, true, alwaysUseInstanceValues: true)]
public int SubmarineSpecificID
{
get;
set;
}
private JobPrefab cachedJobPrefab;
private string cachedName;
public IdCard(Item item, XElement element) : base(item, element)
{
@@ -20,6 +38,8 @@ namespace Barotrauma.Items.Components
item.AddTag("jobid:" + info.Job.Prefab.Identifier);
}
TeamID = info.TeamID;
var head = info.Head;
if (info != null && head != null)
@@ -50,5 +70,48 @@ namespace Barotrauma.Items.Components
base.Unequip(character);
character.Info?.CheckDisguiseStatus(true, this);
}
public JobPrefab GetJob()
{
if (cachedJobPrefab != null)
{
return cachedJobPrefab;
}
foreach (string tag in item.GetTags())
{
if (tag.StartsWith("jobid:"))
{
string jobIdentifier = tag.Split(':').Last();
if (JobPrefab.Get(jobIdentifier) is { } jobPrefab)
{
cachedJobPrefab = jobPrefab;
return jobPrefab;
}
}
}
return null;
}
public string GetName()
{
if (cachedName != null)
{
return cachedName;
}
foreach (string tag in item.GetTags())
{
if (tag.StartsWith("name:"))
{
string ownerName = tag.Split(':').Last();
cachedName = ownerName;
return ownerName;
}
}
return null;
}
}
}
@@ -61,7 +61,7 @@ namespace Barotrauma.Items.Components
foreach (XElement subElement in element.Elements())
{
if (!subElement.Name.ToString().Equals("attack", StringComparison.OrdinalIgnoreCase)) { continue; }
Attack = new Attack(subElement, item.Name + ", MeleeWeapon");
Attack = new Attack(subElement, item.Name + ", MeleeWeapon", item);
Attack.DamageRange = item.body == null ? 10.0f : ConvertUnits.ToDisplayUnits(item.body.GetMaxExtent());
}
item.IsShootable = true;
@@ -95,7 +95,7 @@ namespace Barotrauma.Items.Components
if (hitPos < MathHelper.PiOver4) { return false; }
ActivateNearbySleepingCharacters();
reloadTimer = reload;
reloadTimer = reload / (1 + character.GetStatValue(StatTypes.MeleeAttackSpeed));
item.body.FarseerBody.CollisionCategories = Physics.CollisionProjectile;
item.body.FarseerBody.CollidesWith = Physics.CollisionCharacter | Physics.CollisionWall;
@@ -5,6 +5,7 @@ using FarseerPhysics.Dynamics;
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Xml.Linq;
@@ -52,6 +53,21 @@ namespace Barotrauma.Items.Components
set;
}
[Serialize(0f, true, description: "The time required for a charge-type turret to charge up before able to fire.")]
public float MaxChargeTime
{
get;
private set;
}
private enum ChargingState
{
Inactive,
WindingUp,
WindingDown,
}
private ChargingState currentChargingState;
public Vector2 TransformedBarrelPos
{
get
@@ -62,7 +78,10 @@ namespace Barotrauma.Items.Components
return Vector2.Transform(flippedPos, bodyTransform);
}
}
private float currentChargeTime;
private bool tryingToCharge;
public RangedWeapon(Item item, XElement element)
: base(item, element)
{
@@ -88,10 +107,41 @@ namespace Barotrauma.Items.Components
if (ReloadTimer < 0.0f)
{
ReloadTimer = 0.0f;
IsActive = false;
// was this an optimization or related to something else? currently disabled for charge-type weapons
//IsActive = false;
if (MaxChargeTime == 0.0f)
{
IsActive = false;
return;
}
}
float previousChargeTime = currentChargeTime;
float chargeDeltaTime = tryingToCharge ? deltaTime : -deltaTime;
currentChargeTime = Math.Clamp(currentChargeTime + chargeDeltaTime, 0f, MaxChargeTime);
tryingToCharge = false;
if (currentChargeTime == 0f)
{
currentChargingState = ChargingState.Inactive;
}
else if (currentChargeTime < previousChargeTime)
{
currentChargingState = ChargingState.WindingDown;
}
else
{
// if we are charging up or at maxed charge, remain winding up
currentChargingState = ChargingState.WindingUp;
}
UpdateProjSpecific(deltaTime);
}
partial void UpdateProjSpecific(float deltaTime);
private float GetSpread(Character user)
{
float degreeOfFailure = 1.0f - DegreeOfSuccess(user);
@@ -102,11 +152,16 @@ namespace Barotrauma.Items.Components
private readonly List<Body> limbBodies = new List<Body>();
public override bool Use(float deltaTime, Character character = null)
{
tryingToCharge = true;
if (character == null || character.Removed) { return false; }
if ((item.RequireAimToUse && !character.IsKeyDown(InputType.Aim)) || ReloadTimer > 0.0f) { return false; }
if (currentChargeTime < MaxChargeTime) { return false; }
IsActive = true;
ReloadTimer = reload;
ReloadTimer = reload / (1 + character.GetStatValue(StatTypes.RangedAttackSpeed));
currentChargeTime = 0f;
character.CheckTalents(AbilityEffectType.OnUseRangedWeapon, item);
if (item.AiTarget != null)
{