(23df6915f) Added: Possibility of having a status effect trigger if a requiredItem is missing

This commit is contained in:
Joonas Rikkonen
2019-06-12 16:45:02 +03:00
parent b598459179
commit dce98349ea
16 changed files with 87 additions and 120 deletions
@@ -449,11 +449,12 @@ namespace Barotrauma
{ {
float depth = ActiveSprite.Depth - 0.0000015f; float depth = ActiveSprite.Depth - 0.0000015f;
DamagedSprite.Draw(spriteBatch, // TODO: enable when the damage overlay textures have been remade.
new Vector2(body.DrawPosition.X, -body.DrawPosition.Y), //DamagedSprite.Draw(spriteBatch,
color * Math.Min(damageOverlayStrength, 1.0f), ActiveSprite.Origin, // new Vector2(body.DrawPosition.X, -body.DrawPosition.Y),
-body.DrawRotation, // color * Math.Min(damageOverlayStrength, 1.0f), ActiveSprite.Origin,
1.0f, spriteEffect, depth); // -body.DrawRotation,
// 1.0f, spriteEffect, depth);
} }
if (GameMain.DebugDraw) if (GameMain.DebugDraw)
@@ -20,8 +20,8 @@ namespace Barotrauma
/// </summary> /// </summary>
const float CharacterWaitOnSwitch = 10.0f; const float CharacterWaitOnSwitch = 10.0f;
private readonly List<CharacterInfo> characterInfos = new List<CharacterInfo>(); private List<CharacterInfo> characterInfos = new List<CharacterInfo>();
private readonly List<Character> characters = new List<Character>(); private List<Character> characters = new List<Character>();
private Point screenResolution; private Point screenResolution;
@@ -256,18 +256,6 @@ namespace Barotrauma
{ {
if (c.Info == null || c.Inventory == null) { continue; } if (c.Info == null || c.Inventory == null) { continue; }
var inventoryElement = new XElement("inventory"); var inventoryElement = new XElement("inventory");
// Recharge headset batteries
var headset = c.Inventory.FindItemByIdentifier("headset");
if (headset != null)
{
var battery = headset.OwnInventory.FindItemByTag("loadable");
if (battery != null)
{
battery.Condition = battery.MaxCondition;
}
}
c.SaveInventory(c.Inventory, inventoryElement); c.SaveInventory(c.Inventory, inventoryElement);
c.Info.InventoryData = inventoryElement; c.Info.InventoryData = inventoryElement;
c.Inventory?.DeleteAllItems(); c.Inventory?.DeleteAllItems();
@@ -620,7 +620,6 @@ namespace Barotrauma
{ {
if (DraggingItemToWorld && if (DraggingItemToWorld &&
Character.Controlled.FocusedItem?.OwnInventory != null && Character.Controlled.FocusedItem?.OwnInventory != null &&
Character.Controlled.FocusedItem.OwnInventory.CanBePut(draggingItem) &&
Character.Controlled.FocusedItem.OwnInventory.TryPutItem(draggingItem, Character.Controlled)) Character.Controlled.FocusedItem.OwnInventory.TryPutItem(draggingItem, Character.Controlled))
{ {
GUI.PlayUISound(GUISoundType.PickItem); GUI.PlayUISound(GUISoundType.PickItem);
@@ -142,27 +142,24 @@ namespace Barotrauma
backgroundPos.Y = -backgroundPos.Y; backgroundPos.Y = -backgroundPos.Y;
backgroundPos *= 0.05f; backgroundPos *= 0.05f;
if (level.GenerationParams.BackgroundTopSprite != null)
if (backgroundPos.Y < 1024)
{ {
int backgroundSize = (int)level.GenerationParams.BackgroundTopSprite.size.Y; if (backgroundPos.Y < 0 && level.GenerationParams.BackgroundTopSprite != null)
if (backgroundPos.Y < backgroundSize)
{ {
if (backgroundPos.Y < 0) var backgroundTop = level.GenerationParams.BackgroundTopSprite;
{ backgroundTop.SourceRect = new Rectangle((int)backgroundPos.X, (int)backgroundPos.Y, 1024, (int)Math.Min(-backgroundPos.Y, 1024));
var backgroundTop = level.GenerationParams.BackgroundTopSprite; backgroundTop.DrawTiled(spriteBatch, Vector2.Zero, new Vector2(GameMain.GraphicsWidth, Math.Min(-backgroundPos.Y, GameMain.GraphicsHeight)),
backgroundTop.SourceRect = new Rectangle((int)backgroundPos.X, (int)backgroundPos.Y, backgroundSize, (int)Math.Min(-backgroundPos.Y, backgroundSize)); color: level.BackgroundTextureColor);
backgroundTop.DrawTiled(spriteBatch, Vector2.Zero, new Vector2(GameMain.GraphicsWidth, Math.Min(-backgroundPos.Y, GameMain.GraphicsHeight)), }
color: level.BackgroundTextureColor); if (backgroundPos.Y > -1024 && level.GenerationParams.BackgroundSprite != null)
} {
if (-backgroundPos.Y < GameMain.GraphicsHeight && level.GenerationParams.BackgroundSprite != null) var background = level.GenerationParams.BackgroundSprite;
{ background.SourceRect = new Rectangle((int)backgroundPos.X, (int)Math.Max(backgroundPos.Y, 0), 1024, 1024);
var background = level.GenerationParams.BackgroundSprite; background.DrawTiled(spriteBatch,
background.SourceRect = new Rectangle((int)backgroundPos.X, (int)Math.Max(backgroundPos.Y, 0), backgroundSize, backgroundSize); (backgroundPos.Y < 0) ? new Vector2(0.0f, (int)-backgroundPos.Y) : Vector2.Zero,
background.DrawTiled(spriteBatch, new Vector2(GameMain.GraphicsWidth, (int)Math.Ceiling(1024 - backgroundPos.Y)),
(backgroundPos.Y < 0) ? new Vector2(0.0f, (int)-backgroundPos.Y) : Vector2.Zero, color: level.BackgroundTextureColor);
new Vector2(GameMain.GraphicsWidth, (int)Math.Min(Math.Ceiling(backgroundSize - backgroundPos.Y), backgroundSize)),
color: level.BackgroundTextureColor);
}
} }
} }
@@ -483,26 +483,6 @@ namespace Barotrauma
{ {
if (selectedList.Contains(entity)) { return; } if (selectedList.Contains(entity)) { return; }
selectedList.Add(entity); selectedList.Add(entity);
HandleDoorGapLinks(entity,
onGapFound: (door, gap) =>
{
door.RefreshLinkedGap();
if (!selectedList.Contains(gap))
{
selectedList.Add(gap);
}
},
onDoorFound: (door, gap) =>
{
if (!selectedList.Contains(door.Item))
{
selectedList.Add(door.Item);
}
});
}
private static void HandleDoorGapLinks(MapEntity entity, Action<Door, Gap> onGapFound, Action<Door, Gap> onDoorFound)
{
if (entity is Item i) if (entity is Item i)
{ {
var door = i.GetComponent<Door>(); var door = i.GetComponent<Door>();
@@ -511,26 +491,31 @@ namespace Barotrauma
var gap = door.LinkedGap; var gap = door.LinkedGap;
if (gap != null) if (gap != null)
{ {
onGapFound(door, gap); door.RefreshLinkedGap();
if (!selectedList.Contains(gap))
{
selectedList.Add(gap);
}
} }
} }
} }
else if (entity is Gap gap)
{
var door = gap.ConnectedDoor;
if (door != null)
{
onDoorFound(door, gap);
}
}
} }
public static void RemoveSelection(MapEntity entity) public static void RemoveSelection(MapEntity entity)
{ {
selectedList.Remove(entity); selectedList.Remove(entity);
HandleDoorGapLinks(entity, if (entity is Item i)
onGapFound: (door, gap) => selectedList.Remove(gap), {
onDoorFound: (door, gap) => selectedList.Remove(door.Item)); var door = i.GetComponent<Door>();
if (door != null)
{
var gap = door.LinkedGap;
if (gap != null)
{
selectedList.Remove(gap);
}
}
}
} }
static partial void UpdateAllProjSpecific(float deltaTime) static partial void UpdateAllProjSpecific(float deltaTime)
@@ -600,11 +585,12 @@ namespace Barotrauma
public static void UpdateEditor(Camera cam) public static void UpdateEditor(Camera cam)
{ {
FilteredSelectedList.Clear();
if (highlightedListBox != null) highlightedListBox.UpdateManually((float)Timing.Step); if (highlightedListBox != null) highlightedListBox.UpdateManually((float)Timing.Step);
if (editingHUD != null) if (editingHUD != null)
{ {
if (FilteredSelectedList.Count == 0 || editingHUD.UserData != FilteredSelectedList[0]) if (selectedList.Count == 0 || editingHUD.UserData != selectedList[0])
{ {
foreach (GUIComponent component in editingHUD.Children) foreach (GUIComponent component in editingHUD.Children)
{ {
@@ -615,7 +601,7 @@ namespace Barotrauma
editingHUD = null; editingHUD = null;
} }
} }
FilteredSelectedList.Clear();
if (selectedList.Count == 0) return; if (selectedList.Count == 0) return;
foreach (var e in selectedList) foreach (var e in selectedList)
{ {
@@ -441,43 +441,36 @@ namespace Barotrauma
characterPreviewFrame = null; characterPreviewFrame = null;
} }
if (characterList != null) if (Campaign is SinglePlayerCampaign)
{ {
if (Campaign is SinglePlayerCampaign) var hireableCharacters = location.GetHireableCharacters();
foreach (GUIComponent child in characterList.Content.Children.ToList())
{ {
var hireableCharacters = location.GetHireableCharacters(); if (child.UserData is CharacterInfo character)
foreach (GUIComponent child in characterList.Content.Children.ToList())
{ {
if (child.UserData is CharacterInfo character) if (GameMain.GameSession.CrewManager.GetCharacterInfos().Contains(character)) { continue; }
{
if (GameMain.GameSession.CrewManager != null)
{
if (GameMain.GameSession.CrewManager.GetCharacterInfos().Contains(character)) { continue; }
}
}
else if (child.UserData as string == "mycrew" || child.UserData as string == "hire")
{
continue;
}
characterList.RemoveChild(child);
} }
if (!hireableCharacters.Any()) else if (child.UserData as string == "mycrew" || child.UserData as string == "hire")
{ {
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.2f), characterList.Content.RectTransform), TextManager.Get("HireUnavailable"), textAlignment: Alignment.Center) continue;
{
CanBeFocused = false
};
} }
else characterList.RemoveChild(child);
}
if (!hireableCharacters.Any())
{
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.2f), characterList.Content.RectTransform), TextManager.Get("HireUnavailable"), textAlignment: Alignment.Center)
{ {
foreach (CharacterInfo c in hireableCharacters) CanBeFocused = false
{ };
var frame = c.CreateCharacterFrame(characterList.Content, c.Name + " (" + c.Job.Name + ")", c); }
new GUITextBlock(new RectTransform(Vector2.One, frame.RectTransform, Anchor.TopRight), c.Salary.ToString(), textAlignment: Alignment.CenterRight); else
} {
foreach (CharacterInfo c in hireableCharacters)
{
var frame = c.CreateCharacterFrame(characterList.Content, c.Name + " (" + c.Job.Name + ")", c);
new GUITextBlock(new RectTransform(Vector2.One, frame.RectTransform, Anchor.TopRight), c.Salary.ToString(), textAlignment: Alignment.CenterRight);
} }
} }
characterList.UpdateScrollBarSize();
} }
characterList.UpdateScrollBarSize(); characterList.UpdateScrollBarSize();
@@ -948,11 +948,7 @@ namespace Barotrauma
new GUITextBlock(new RectTransform(textLabelSize, parent.RectTransform), TextManager.Get("HostServerButton"), textAlignment: Alignment.Center, font: GUI.LargeFont) { ForceUpperCase = true }; new GUITextBlock(new RectTransform(textLabelSize, parent.RectTransform), TextManager.Get("HostServerButton"), textAlignment: Alignment.Center, font: GUI.LargeFont) { ForceUpperCase = true };
var label = new GUITextBlock(new RectTransform(textLabelSize, parent.RectTransform), TextManager.Get("ServerName"), textAlignment: textAlignment); var label = new GUITextBlock(new RectTransform(textLabelSize, parent.RectTransform), TextManager.Get("ServerName"), textAlignment: textAlignment);
serverNameBox = new GUITextBox(new RectTransform(textFieldSize, label.RectTransform, Anchor.CenterRight), textAlignment: textAlignment) serverNameBox = new GUITextBox(new RectTransform(textFieldSize, label.RectTransform, Anchor.CenterRight), textAlignment: textAlignment);
{
MaxTextLength = NetConfig.ServerNameMaxLength,
OverflowClip = true
};
label = new GUITextBlock(new RectTransform(textLabelSize, parent.RectTransform), TextManager.Get("ServerPort"), textAlignment: textAlignment); label = new GUITextBlock(new RectTransform(textLabelSize, parent.RectTransform), TextManager.Get("ServerPort"), textAlignment: textAlignment);
portBox = new GUITextBox(new RectTransform(textFieldSize, label.RectTransform, Anchor.CenterRight), textAlignment: textAlignment) portBox = new GUITextBox(new RectTransform(textFieldSize, label.RectTransform, Anchor.CenterRight), textAlignment: textAlignment)
@@ -336,11 +336,7 @@ namespace Barotrauma
//server info ------------------------------------------------------------------ //server info ------------------------------------------------------------------
ServerName = new GUITextBox(new RectTransform(new Vector2(infoColumnContainer.RectTransform.RelativeSize.X, 0.05f), infoFrameContent.RectTransform)) ServerName = new GUITextBox(new RectTransform(new Vector2(0.3f, 0.05f), infoFrameContent.RectTransform));
{
MaxTextLength = NetConfig.ServerNameMaxLength,
OverflowClip = true
};
ServerName.OnDeselected += (textBox, key) => ServerName.OnDeselected += (textBox, key) =>
{ {
GameMain.Client.ServerSettings.ClientAdminWrite(ServerSettings.NetFlags.Name); GameMain.Client.ServerSettings.ClientAdminWrite(ServerSettings.NetFlags.Name);
@@ -35,7 +35,6 @@ namespace Barotrauma.Networking
public bool CompareTo(string ipCompare) public bool CompareTo(string ipCompare)
{ {
if (string.IsNullOrEmpty(IP)) { return false; }
if (!IsRangeBan) if (!IsRangeBan)
{ {
return ipCompare == IP; return ipCompare == IP;
@@ -50,7 +49,6 @@ namespace Barotrauma.Networking
public bool CompareTo(IPAddress ipCompare) public bool CompareTo(IPAddress ipCompare)
{ {
if (string.IsNullOrEmpty(IP)) { return false; }
if (ipCompare.IsIPv4MappedToIPv6 && CompareTo(ipCompare.MapToIPv4().ToString())) if (ipCompare.IsIPv4MappedToIPv6 && CompareTo(ipCompare.MapToIPv4().ToString()))
{ {
return true; return true;
@@ -93,10 +93,6 @@ namespace Barotrauma.Networking
{ {
name = name.Replace(":", ""); name = name.Replace(":", "");
name = name.Replace(";", ""); name = name.Replace(";", "");
if (name.Length > NetConfig.ServerNameMaxLength)
{
name = name.Substring(0, NetConfig.ServerNameMaxLength);
}
this.name = name; this.name = name;
@@ -1295,6 +1295,15 @@
<Content Include="$(MSBuildThisFileDirectory)Content\Characters\Fractalguardian\fractalguardian.png"> <Content Include="$(MSBuildThisFileDirectory)Content\Characters\Fractalguardian\fractalguardian.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="$(MSBuildThisFileDirectory)Content\Characters\Human\damagedhead.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="$(MSBuildThisFileDirectory)Content\Characters\Human\damagedlegs.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="$(MSBuildThisFileDirectory)Content\Characters\Human\damagedtorso.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="$(MSBuildThisFileDirectory)Content\Characters\Human\firstnames_female.txt"> <Content Include="$(MSBuildThisFileDirectory)Content\Characters\Human\firstnames_female.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@@ -1553,7 +1553,7 @@ namespace Barotrauma
public void Use(float deltaTime, Character character = null, Limb targetLimb = null) public void Use(float deltaTime, Character character = null, Limb targetLimb = null)
{ {
if (RequireAimToUse && (character == null || !character.IsKeyDown(InputType.Aim))) if (RequireAimToUse && !character.IsKeyDown(InputType.Aim))
{ {
return; return;
} }
@@ -17,6 +17,7 @@ namespace Barotrauma
} }
public bool IsOptional { get; set; } public bool IsOptional { get; set; }
public bool MatchOnEmpty { get; set; }
public bool IgnoreInEditor { get; set; } public bool IgnoreInEditor { get; set; }
@@ -99,6 +100,11 @@ namespace Barotrauma
var containedItems = parentItem.ContainedItems; var containedItems = parentItem.ContainedItems;
if (containedItems == null) return false; if (containedItems == null) return false;
if (MatchOnEmpty && !containedItems.Any(ci => ci != null))
{
return true;
}
foreach (Item contained in containedItems) foreach (Item contained in containedItems)
{ {
if (contained.Condition > 0.0f && MatchesItem(contained)) return true; if (contained.Condition > 0.0f && MatchesItem(contained)) return true;
@@ -222,6 +228,7 @@ namespace Barotrauma
ri.IsOptional = element.GetAttributeBool("optional", false); ri.IsOptional = element.GetAttributeBool("optional", false);
ri.IgnoreInEditor = element.GetAttributeBool("ignoreineditor", false); ri.IgnoreInEditor = element.GetAttributeBool("ignoreineditor", false);
ri.MatchOnEmpty = element.GetAttributeBool("matchonempty", false);
return ri; return ri;
} }
} }
@@ -424,6 +424,7 @@ namespace Barotrauma
public virtual bool HasRequiredConditions(List<ISerializableEntity> targets) public virtual bool HasRequiredConditions(List<ISerializableEntity> targets)
{ {
if (!propertyConditionals.Any()) return true; if (!propertyConditionals.Any()) return true;
if (requiredItems.All(ri => ri.MatchOnEmpty) && targets.Count == 0) return true;
switch (conditionalComparison) switch (conditionalComparison)
{ {
case PropertyConditional.Comparison.Or: case PropertyConditional.Comparison.Or:
Binary file not shown.