Unstable 0.1400.7.0 (Coronavirus edition)

This commit is contained in:
Markus Isberg
2021-07-23 21:01:17 +03:00
parent ee5308b39f
commit 47707c824a
133 changed files with 1310 additions and 533 deletions
@@ -479,7 +479,7 @@ namespace Barotrauma
{
CalculateLimbDepths();
var controller = character.SelectedConstruction?.GetComponent<Controller>();
if (controller != null && controller.ControlCharacterPose && controller.User == character)
if (controller != null && controller.ControlCharacterPose && controller.User == character && controller.UserInCorrectPosition)
{
if (controller.Item.SpriteDepth <= maxDepth || controller.DrawUserBehind)
{
@@ -174,7 +174,7 @@ namespace Barotrauma
if (!character.IsIncapacitated && character.Stun <= 0.0f && !IsCampaignInterfaceOpen)
{
if (character.Info != null && !character.ShouldLockHud() && character.SelectedCharacter == null)
if (character.Info != null && !character.ShouldLockHud() && character.SelectedCharacter == null && Screen.Selected != GameMain.SubEditorScreen)
{
bool mouseOnPortrait = HUDLayoutSettings.BottomRightInfoArea.Contains(PlayerInput.MousePosition) && GUI.MouseOn == null;
if (mouseOnPortrait && PlayerInput.PrimaryMouseButtonClicked())
@@ -391,7 +391,7 @@ namespace Barotrauma
if (npc.CampaignInteractionType == CampaignMode.InteractionType.None || npc.Submarine != character.Submarine || npc.IsDead || npc.IsIncapacitated) { continue; }
var iconStyle = GUI.Style.GetComponentStyle("CampaignInteractionIcon." + npc.CampaignInteractionType);
GUI.DrawIndicator(spriteBatch, npc.WorldPosition, cam, npc.CurrentHull == Character.Controlled.CurrentHull ? 500.0f : 100.0f, iconStyle.GetDefaultSprite(), iconStyle.Color);
GUI.DrawIndicator(spriteBatch, npc.WorldPosition, cam, npc.CurrentHull == character.CurrentHull ? 500.0f : 100.0f, iconStyle.GetDefaultSprite(), iconStyle.Color);
}
foreach (Item item in Item.ItemList)
@@ -405,17 +405,17 @@ namespace Barotrauma
}
if (character.SelectedConstruction != null &&
(character.CanInteractWith(Character.Controlled.SelectedConstruction) || Screen.Selected == GameMain.SubEditorScreen))
(character.CanInteractWith(character.SelectedConstruction) || Screen.Selected == GameMain.SubEditorScreen))
{
character.SelectedConstruction.DrawHUD(spriteBatch, cam, Character.Controlled);
character.SelectedConstruction.DrawHUD(spriteBatch, cam, character);
}
if (Character.Controlled.Inventory != null)
if (character.Inventory != null)
{
foreach (Item item in Character.Controlled.Inventory.AllItems)
foreach (Item item in character.Inventory.AllItems)
{
if (Character.Controlled.HasEquippedItem(item))
if (character.HasEquippedItem(item))
{
item.DrawHUD(spriteBatch, cam, Character.Controlled);
item.DrawHUD(spriteBatch, cam, character);
}
}
}
@@ -641,6 +641,8 @@ namespace Barotrauma
commands.Add(new Command("wikiimage_sub", "Save an image of the main submarine with a transparent background.", (string[] args) =>
{
if (Submarine.MainSub == null) { return; }
MapEntity.SelectedList.Clear();
MapEntity.mapEntityList.ForEach(me => me.IsHighlighted = false);
WikiImage.Create(Submarine.MainSub);
}));
@@ -741,7 +741,6 @@ namespace Barotrauma
{
float diff = isHorizontal ? scrollToElement.Rect.X - Content.Rect.X : scrollToElement.Rect.Y - Content.Rect.Y;
float speed = MathHelper.Clamp(Math.Abs(diff) * 0.1f, 5.0f, 100.0f);
System.Diagnostics.Debug.WriteLine(speed);
if (Math.Abs(diff) < speed || GUIScrollBar.DraggingBar != null)
{
speed = Math.Abs(diff);
@@ -259,7 +259,11 @@ namespace Barotrauma
public StrikethroughSettings Strikethrough = null;
public readonly List<RichTextData> RichTextData = null;
public List<RichTextData> RichTextData
{
get;
private set;
}
public bool HasColorHighlight => RichTextData != null;
@@ -334,6 +338,12 @@ namespace Barotrauma
if (wrappedText == null) { return; }
RectTransform.Resize(new Point(RectTransform.Rect.Width, (int)Font.MeasureString(wrappedText, removeExtraSpacing).Y + padding));
}
public void SetRichText(string richText)
{
RichTextData = Barotrauma.RichTextData.GetRichTextData(richText, out string sanitizedText);
Text = sanitizedText;
}
public override void ApplyStyle(GUIComponentStyle componentStyle)
{
@@ -485,7 +495,7 @@ namespace Barotrauma
for (int j = 0; j <= line.Length; j++)
{
Vector2 lineTextSize = Font.MeasureString(line.Substring(0, j)) * textScale;
Vector2 indexPos = new Vector2(lineTextSize.X + Padding.X, totalTextHeight + Padding.Y - halfHeight);
Vector2 indexPos = new Vector2(lineTextSize.X, totalTextHeight - halfHeight) + TextPos - Origin * textScale;
//DebugConsole.NewMessage($"index: {index}, pos: {indexPos}", Color.AliceBlue);
positions.Add(new Tuple<Vector2, int>(indexPos, index + j));
}
@@ -498,7 +508,7 @@ namespace Barotrauma
for (int i = 0; i <= Text.Length; i++)
{
Vector2 textSize = Font.MeasureString(textDrawn.Substring(0, i)) * textScale;
Vector2 indexPos = new Vector2(textSize.X + Padding.X, textSize.Y + Padding.Y - halfHeight) + TextPos - Origin * textScale;
Vector2 indexPos = new Vector2(textSize.X, textSize.Y - halfHeight) + TextPos - Origin * textScale;
//DebugConsole.NewMessage($"index: {i}, pos: {indexPos}", Color.WhiteSmoke);
positions.Add(new Tuple<Vector2, int>(indexPos, i));
}
@@ -1131,7 +1131,9 @@ namespace Barotrauma
{
if (x.GUIComponent.UserData is PurchasedItem itemX && y.GUIComponent.UserData is PurchasedItem itemY)
{
var sortResult = itemX.ItemPrefab.Name.CompareTo(itemY.ItemPrefab.Name);
int sortResult = itemX.ItemPrefab.Name != itemY.ItemPrefab.Name ?
itemX.ItemPrefab.Name.CompareTo(itemY.ItemPrefab.Name) :
itemX.ItemPrefab.Identifier.CompareTo(itemY.ItemPrefab.Identifier);
if (sortingMethod == SortingMethod.AlphabeticalDesc) { sortResult *= -1; }
return sortResult;
}
@@ -824,25 +824,34 @@ namespace Barotrauma
currentUpgradeCategory = category;
var entitiesOnSub = submarine.GetItems(true).Where(i => submarine.IsEntityFoundOnThisSub(i, true) && !i.HiddenInGame && i.AllowSwapping && i.Prefab.SwappableItem != null && category.ItemTags.Any(t => i.HasTag(t))).ToList();
int slotIndex = 0;
foreach (Item item in entitiesOnSub)
{
slotIndex++;
CreateSwappableItemSlideDown(parent, slotIndex, item, submarine);
CreateSwappableItemSlideDown(parent, item, entitiesOnSub, submarine);
}
}
private void CreateSwappableItemSlideDown(GUIListBox parent, int slotIndex, Item item, Submarine submarine)
private void CreateSwappableItemSlideDown(GUIListBox parent, Item item, List<Item> swappableEntities, Submarine submarine)
{
if (Campaign == null || submarine == null) { return; }
IEnumerable<ItemPrefab> availableReplacements = MapEntityPrefab.List.Where(p =>
p is ItemPrefab itemPrefab &&
itemPrefab.SwappableItem != null &&
itemPrefab.SwappableItem.CanBeBought &&
itemPrefab.SwappableItem.CanBeBought &&
itemPrefab.SwappableItem.SwapIdentifier.Equals(item.Prefab.SwappableItem.SwapIdentifier, StringComparison.OrdinalIgnoreCase)).Cast<ItemPrefab>();
var linkedItems = Campaign.UpgradeManager.GetLinkedItemsToSwap(item) ?? new List<Item>() { item };
//create the swap entry only for one of the items (the one with the smallest ID)
if (linkedItems.Min(it => it.ID) < item.ID) { return; }
var currentOrPending = item.PendingItemSwap ?? item.Prefab;
string name = currentOrPending.Name;
string quantityText = "";
if (linkedItems.Count > 1)
{
quantityText = " " + TextManager.GetWithVariable("campaignstore.quantity", "[amount]", (linkedItems.Count).ToString());
name += quantityText;
}
bool isOpen = false;
GUIButton toggleButton = new GUIButton(rectT(1f, 0.1f, parent.Content), text: string.Empty, style: "SlideDown")
@@ -850,10 +859,21 @@ namespace Barotrauma
UserData = item
};
GUILayoutGroup buttonLayout = new GUILayoutGroup(rectT(1f, 1f, toggleButton.Frame), isHorizontal: true);
new GUITextBlock(rectT(0.3f, 1f, buttonLayout), text: TextManager.GetWithVariable("weaponslot", "[number]", slotIndex.ToString()), font: GUI.SubHeadingFont);
string slotText = "";
if (linkedItems.Count > 1)
{
slotText = TextManager.GetWithVariable("weaponslot", "[number]", string.Join(", ", linkedItems.Select(it => (swappableEntities.IndexOf(it) + 1).ToString())));
}
else
{
slotText = TextManager.GetWithVariable("weaponslot", "[number]", (swappableEntities.IndexOf(item) + 1).ToString());
}
new GUITextBlock(rectT(0.3f, 1f, buttonLayout), text: slotText, font: GUI.SubHeadingFont);
GUILayoutGroup group = new GUILayoutGroup(rectT(0.7f, 1f, buttonLayout), isHorizontal: true) { Stretch = true };
string title = item.PendingItemSwap != null ? TextManager.GetWithVariable("upgrades.pendingitem", "[itemname]", currentOrPending.Name) : item.Name;
string title = item.PendingItemSwap != null ? TextManager.GetWithVariable("upgrades.pendingitem", "[itemname]", name) : (linkedItems.Count > 1 ? item.Name + quantityText : item.Name);
GUITextBlock text = new GUITextBlock(rectT(0.7f, 1f, group), text: title, font: GUI.SubHeadingFont, textAlignment: Alignment.Right, parseRichText: true)
{
TextColor = GUI.Style.Orange
@@ -876,7 +896,7 @@ namespace Barotrauma
if (isUninstallPending) { canUninstall = false; }
frames.Add(CreateUpgradeEntry(rectT(1f, 0.25f, parent.Content), currentOrPending.UpgradePreviewSprite,
TextManager.GetWithVariable(item.PendingItemSwap != null ? "upgrades.pendingitem" : "upgrades.installeditem", "[itemname]", currentOrPending.Name),
TextManager.GetWithVariable(item.PendingItemSwap != null ? "upgrades.pendingitem" : "upgrades.installeditem", "[itemname]", name),
currentOrPending.Description,
0, null, addBuyButton: canUninstall, addProgressBar: false, buttonStyle: "WeaponUninstallButton"));
@@ -915,7 +935,7 @@ namespace Barotrauma
bool isPurchased = item.AvailableSwaps.Contains(replacement);
int price = isPurchased || replacement == item.Prefab ? 0 : replacement.SwappableItem.GetPrice(Campaign.Map?.CurrentLocation);
int price = isPurchased || replacement == item.Prefab ? 0 : replacement.SwappableItem.GetPrice(Campaign.Map?.CurrentLocation) * linkedItems.Count;
frames.Add(CreateUpgradeEntry(rectT(1f, 0.25f, parent.Content), replacement.UpgradePreviewSprite, replacement.Name, replacement.Description,
price, replacement,
@@ -931,7 +951,7 @@ namespace Barotrauma
{
string promptBody = TextManager.GetWithVariables(isPurchased ? "upgrades.itemswappromptbody" : "upgrades.purchaseitemswappromptbody",
new[] { "[itemtoinstall]", "[amount]" },
new[] { replacement.Name, replacement.SwappableItem.GetPrice(Campaign?.Map?.CurrentLocation).ToString() });
new[] { replacement.Name, (replacement.SwappableItem.GetPrice(Campaign?.Map?.CurrentLocation) * linkedItems.Count).ToString() });
currectConfirmation = EventEditorScreen.AskForConfirmation(TextManager.Get("Upgrades.PurchasePromptTitle"), promptBody, () =>
{
if (GameMain.NetworkMember != null)
@@ -966,6 +986,7 @@ namespace Barotrauma
toggleButton.OnClicked = delegate
{
if (Campaign == null) { return false; }
isOpen = !isOpen;
toggleButton.Selected = !toggleButton.Selected;
foreach (GUIFrame frame in frames)
@@ -974,9 +995,10 @@ namespace Barotrauma
}
if (toggleButton.Selected)
{
var linkedItems = Campaign.UpgradeManager.GetLinkedItemsToSwap(item);
foreach (var itemPreview in itemPreviews)
{
itemPreview.Value.OutlineColor = itemPreview.Value.Color = itemPreview.Key == item ? GUI.Style.Orange : previewWhite;
itemPreview.Value.OutlineColor = itemPreview.Value.Color = linkedItems.Contains(itemPreview.Key) ? GUI.Style.Orange : previewWhite;
}
foreach (GUIComponent otherComponent in toggleButton.Parent.Children)
{
@@ -1145,9 +1167,9 @@ namespace Barotrauma
private void CreateItemTooltip(MapEntity entity)
{
int slotIndex = -1;
if (currentStoreLayout?.SelectedData is CategoryData categoryData)
if (entity is Item swappableItem && swappableItem.Prefab.SwappableItem != null)
{
var entitiesOnSub = Submarine.MainSub.GetItems(true).Where(i => i.Prefab.SwappableItem != null && Submarine.MainSub.IsEntityFoundOnThisSub(i, true) && categoryData.Category.ItemTags.Any(t => i.HasTag(t))).ToList();
var entitiesOnSub = Submarine.MainSub.GetItems(true).Where(i => i.Prefab.SwappableItem != null && Submarine.MainSub.IsEntityFoundOnThisSub(i, true) && i.Prefab.SwappableItem.SwapIdentifier == swappableItem.Prefab.SwappableItem?.SwapIdentifier).ToList();
slotIndex = entitiesOnSub.IndexOf(entity) + 1;
}
@@ -1231,6 +1253,8 @@ namespace Barotrauma
private void UpdateSubmarinePreview(float deltaTime, GUICustomComponent parent)
{
if (Campaign == null) { return; }
if (!parent.Children.Any() || Submarine.MainSub != null && Submarine.MainSub != drawnSubmarine || GameMain.GraphicsWidth != screenResolution.X || GameMain.GraphicsHeight != screenResolution.Y)
{
GameMain.GameSession?.SubmarineInfo?.CheckSubsLeftBehind();
@@ -1279,7 +1303,8 @@ namespace Barotrauma
{
if (selectedUpgradeCategoryLayout != null)
{
if (selectedUpgradeCategoryLayout.FindChild(c => c.UserData as Item == HoveredItem, recursive: true) is GUIButton itemElement)
var linkedItems = HoveredItem is Item ? Campaign.UpgradeManager.GetLinkedItemsToSwap((Item)HoveredItem) : new List<Item>();
if (selectedUpgradeCategoryLayout.FindChild(c => c.UserData as Item == HoveredItem || linkedItems.Contains(c.UserData as Item), recursive: true) is GUIButton itemElement)
{
if (!itemElement.Selected) { itemElement.OnClicked(itemElement, itemElement.UserData); }
(itemElement.Parent?.Parent?.Parent as GUIListBox)?.ScrollToElement(itemElement);
@@ -115,6 +115,7 @@ namespace Barotrauma
if (IsMouseOver || (!RequireMouseOn && selectedWidgets.Contains(this) && PlayerInput.PrimaryMouseButtonHeld()))
{
Hovered?.Invoke();
System.Diagnostics.Debug.WriteLine("hovered");
if (RequireMouseOn || PlayerInput.PrimaryMouseButtonDown())
{
if ((multiselect && !selectedWidgets.Contains(this)) || selectedWidgets.None())
@@ -126,6 +127,7 @@ namespace Barotrauma
}
else if (selectedWidgets.Contains(this))
{
System.Diagnostics.Debug.WriteLine("selectedWidgets.Contains(this) -> remove");
selectedWidgets.Remove(this);
Deselected?.Invoke();
}
@@ -140,8 +140,7 @@ namespace Barotrauma
msg,
((msgCommand == "r" || msgCommand == "radio") && ChatMessage.CanUseRadio(Character.Controlled)) ? ChatMessageType.Radio : ChatMessageType.Default,
Character.Controlled);
var headset = GetHeadset(Character.Controlled, true);
if (headset != null && headset.CanTransmit())
if (ChatMessage.CanUseRadio(Character.Controlled, out WifiComponent headset))
{
Signal s = new Signal(msg, sender: Character.Controlled, source: headset.Item);
headset.TransmitSignal(s, sentFromChat: true);
@@ -610,17 +609,6 @@ namespace Barotrauma
ChatBox.AddMessage(message);
}
private WifiComponent GetHeadset(Character character, bool requireEquipped)
{
if (character?.Inventory == null) { return null; }
var radioItem = character.Inventory.AllItems.FirstOrDefault(it => it.GetComponent<WifiComponent>() != null);
if (radioItem == null) { return null; }
if (requireEquipped && !character.HasEquippedItem(radioItem)) { return null; }
return radioItem.GetComponent<WifiComponent>();
}
partial void CreateRandomConversation()
{
if (GameMain.Client != null)
@@ -1429,7 +1417,7 @@ namespace Barotrauma
}
}
if (closestNode != null && closestNode == selectedNode)
if (closestNode != null && closestNode.CanBeFocused && closestNode == selectedNode)
{
timeSelected += deltaTime;
if (timeSelected >= selectionTime)
@@ -2485,6 +2473,7 @@ namespace Barotrauma
foreach (Order p in Order.PrefabList)
{
targetComponent = null;
if (p.UseController && itemContext.Components.None(c => c is Controller)) { continue; }
if ((p.TargetItems.Length > 0 && (p.TargetItems.Contains(itemContext.Prefab.Identifier) || itemContext.HasTag(p.TargetItems))) ||
p.TryGetTargetItemComponent(itemContext, out targetComponent))
{
@@ -3444,10 +3433,8 @@ namespace Barotrauma
bool canIssueOrders = false;
if (Character.Controlled?.CurrentHull?.Submarine != null && Character.Controlled.SpeechImpediment < 100.0f)
{
WifiComponent radio = GetHeadset(Character.Controlled, true);
canIssueOrders =
radio != null &&
radio.CanTransmit() &&
ChatMessage.CanUseRadio(Character.Controlled) &&
Character.Controlled?.CurrentHull?.Submarine?.TeamID == Character.Controlled.TeamID &&
!Character.Controlled.CurrentHull.Submarine.Info.IsWreck;
}
@@ -224,12 +224,7 @@ namespace Barotrauma
{
endRoundButton.ToolTip = buttonText;
}
if (Character.Controlled?.ViewTarget is Item item)
{
Turret turret = item.GetComponent<Turret>();
endRoundButton.RectTransform.ScreenSpaceOffset = turret == null ? Point.Zero : new Point(0, (int)(turret.UIElementHeight * 1.25f));
}
else if (Character.Controlled?.CharacterHealth?.SuicideButton?.Visible ?? false)
if (Character.Controlled?.CharacterHealth?.SuicideButton?.Visible ?? false)
{
endRoundButton.RectTransform.ScreenSpaceOffset = new Point(0, Character.Controlled.CharacterHealth.SuicideButton.Rect.Height);
}
@@ -552,7 +552,7 @@ namespace Barotrauma
if (Vector2.DistanceSquared(Character.Controlled.WorldPosition, gap.ConnectedDoor.Item.WorldPosition) > 400 * 400) { continue; }
if (!gap.IsRoomToRoom)
{
if (!(Character.Controlled.GetEquippedItem("deepdiving") is Item)) { continue; }
if (!(Character.Controlled.GetEquippedItem("deepdiving", InvSlotType.OuterClothes) is Item)) { continue; }
if (Character.Controlled.IsProtectedFromPressure()) { continue; }
if (DisplayHint("divingsuitwarning", extendTextTag: false)) { return; }
continue;
@@ -167,6 +167,13 @@ namespace Barotrauma.Items.Components
private set;
}
[Serialize(0, false)]
public int HudLayer
{
get;
private set;
}
private bool useAlternativeLayout;
public bool UseAlternativeLayout
{
@@ -443,6 +450,8 @@ namespace Barotrauma.Items.Components
public virtual void UpdateHUD(Character character, float deltaTime, Camera cam) { }
public virtual void UpdateEditing(float deltaTime) { }
public virtual void CreateEditingHUD(SerializableEntityEditor editor)
{
}
@@ -44,20 +44,6 @@ namespace Barotrauma.Items.Components
private set;
}
#if DEBUG
[Editable]
#endif
[Serialize("0.0,0.0", false, description: "The position where the contained items get drawn at (offset from the upper left corner of the sprite in pixels).")]
public Vector2 ItemPos { get; set; }
#if DEBUG
[Editable]
#endif
[Serialize("0.0,0.0", false, description: "The interval at which the contained items are spaced apart from each other (in pixels).")]
public Vector2 ItemInterval { get; set; }
[Serialize(100, false, description: "How many items are placed in a row before starting a new row.")]
public int ItemsPerRow { get; set; }
/// <summary>
/// Depth at which the contained sprites are drawn. If not set, the original depth of the item sprites is used.
/// </summary>
@@ -291,7 +277,6 @@ namespace Barotrauma.Items.Components
transformedItemPos = Vector2.Transform(transformedItemPos, transform);
transformedItemInterval = Vector2.Transform(transformedItemInterval, transform);
transformedItemIntervalHorizontal = Vector2.Transform(transformedItemIntervalHorizontal, transform);
transformedItemPos += item.DrawPosition;
}
@@ -21,6 +21,10 @@ namespace Barotrauma.Items.Components
private float[] charWidths;
private float prevScale;
private Rectangle prevRect;
private StringBuilder sb;
private Vector4 padding;
[Serialize("0,0,0,0", true, description: "The amount of padding around the text in pixels (left,top,right,bottom).")]
@@ -49,7 +53,8 @@ namespace Barotrauma.Items.Components
}
text = value;
SetDisplayText(value);
SetDisplayText(value);
UpdateScrollingText();
}
}
@@ -205,9 +210,16 @@ namespace Barotrauma.Items.Components
if (!needsScrolling) { return; }
scrollAmount -= deltaTime * ScrollSpeed;
UpdateScrollingText();
}
private void UpdateScrollingText()
{
if (!scrollable || !needsScrolling) { return; }
float currLength = 0;
StringBuilder sb = new StringBuilder();
sb ??= new StringBuilder();
sb.Clear();
float textAreaWidth = textBlock.Rect.Width - textBlock.Padding.X - textBlock.Padding.Z;
for (int i = scrollIndex; i < scrollingText.Length; i++)
{
@@ -246,10 +258,7 @@ namespace Barotrauma.Items.Components
prevScale = item.Scale;
prevRect = item.Rect;
}
private float prevScale;
private Rectangle prevRect;
public void Draw(SpriteBatch spriteBatch, bool editing = false, float itemDepth = -1)
{
if (editing)
@@ -267,15 +276,6 @@ namespace Barotrauma.Items.Components
item.DrawPosition.X - item.Rect.Width / 2.0f,
-(item.DrawPosition.Y + item.Rect.Height / 2.0f));
Rectangle worldRect = item.WorldRect;
if (worldRect.X > Screen.Selected.Cam.WorldView.Right ||
worldRect.Right < Screen.Selected.Cam.WorldView.X ||
worldRect.Y < Screen.Selected.Cam.WorldView.Y - Screen.Selected.Cam.WorldView.Height ||
worldRect.Y - worldRect.Height > Screen.Selected.Cam.WorldView.Y)
{
return;
}
textBlock.TextDepth = item.SpriteDepth - 0.0001f;
textBlock.TextOffset = drawPos - textBlock.Rect.Location.ToVector2() + (editing ? Vector2.Zero : new Vector2(scrollAmount + scrollPadding, 0.0f));
textBlock.DrawManually(spriteBatch);
@@ -561,7 +561,8 @@ namespace Barotrauma.Items.Components
private bool StartButtonClicked(GUIButton button, object obj)
{
if (selectedItem == null) { return false; }
if (fabricatedItem == null && !outputContainer.Inventory.CanBePut(selectedItem.TargetItem))
if (fabricatedItem == null &&
!outputContainer.Inventory.CanBePut(selectedItem.TargetItem, selectedItem.OutCondition))
{
outputSlot.Flash(GUI.Style.Red);
return false;
@@ -23,6 +23,10 @@ namespace Barotrauma.Items.Components
public static void DrawConnections(SpriteBatch spriteBatch, ConnectionPanel panel, Character character)
{
if (DraggingConnected?.Item.Removed ?? false)
{
DraggingConnected = null;
}
Rectangle panelRect = panel.GuiFrame.Rect;
int x = panelRect.X, y = panelRect.Y;
int width = panelRect.Width, height = panelRect.Height;
@@ -304,6 +304,21 @@ namespace Barotrauma.Items.Components
}
}
public override void UpdateEditing(float deltaTime)
{
if (Screen.Selected == GameMain.SubEditorScreen && item.IsSelected)
{
if (widgets.ContainsKey("maxrotation"))
{
widgets["maxrotation"].Update(deltaTime);
}
if (widgets.ContainsKey("minrotation"))
{
widgets["minrotation"].Update(deltaTime);
}
}
}
public override void UpdateHUD(Character character, float deltaTime, Camera cam)
{
if (crosshairSprite != null)
@@ -469,7 +484,6 @@ namespace Barotrauma.Items.Components
{
widget.tooltip = "Min: " + (int)MathHelper.ToDegrees(minRotation);
widget.DrawPos = GetDrawPos() + new Vector2((float)Math.Cos(minRotation), (float)Math.Sin(minRotation)) * coneRadius / Screen.Selected.Cam.Zoom * GUI.Scale;
widget.Update(deltaTime);
};
});
@@ -1104,6 +1104,8 @@ namespace Barotrauma
public static void UpdateDragging()
{
DraggingItems.RemoveAll(it => !Character.Controlled.CanInteractWith(it));
if (DraggingItems.Any() && PlayerInput.PrimaryMouseButtonReleased())
{
Character.Controlled.ClearInputs();
@@ -22,6 +22,8 @@ namespace Barotrauma
private readonly List<ItemComponent> activeHUDs = new List<ItemComponent>();
private readonly List<SerializableEntityEditor> activeEditors = new List<SerializableEntityEditor>();
public GUIComponentStyle IconStyle { get; private set; } = null;
partial void AssignCampaignInteractionTypeProjSpecific(CampaignMode.InteractionType interactionType)
{
@@ -40,7 +42,6 @@ namespace Barotrauma
public float LastImpactSoundTime;
public const float ImpactSoundInterval = 0.2f;
private bool editingHUDRefreshPending;
private float editingHUDRefreshTimer;
private ContainedItemSprite activeContainedSprite;
@@ -581,14 +582,18 @@ namespace Barotrauma
}
}
public override void UpdateEditing(Camera cam)
public override void UpdateEditing(Camera cam, float deltaTime)
{
if (editingHUD == null || editingHUD.UserData as Item != this ||
(editingHUDRefreshPending && editingHUDRefreshTimer <= 0.0f))
if (editingHUD == null || editingHUD.UserData as Item != this)
{
editingHUD = CreateEditingHUD(Screen.Selected != GameMain.SubEditorScreen);
editingHUDRefreshTimer = 1.0f;
}
if (editingHUDRefreshTimer <= 0.0f)
{
activeEditors.ForEach(e => e?.RefreshValues());
editingHUDRefreshTimer = 1.0f;
}
if (Screen.Selected != GameMain.SubEditorScreen) { return; }
@@ -606,6 +611,11 @@ namespace Barotrauma
if (Character.Controlled == null) { activeHUDs.Clear(); }
foreach (ItemComponent ic in components)
{
ic.UpdateEditing(deltaTime);
}
if (!Linkable) { return; }
if (!PlayerInput.KeyDown(Keys.Space)) { return; }
@@ -632,7 +642,7 @@ namespace Barotrauma
public GUIComponent CreateEditingHUD(bool inGame = false)
{
editingHUDRefreshPending = false;
activeEditors.Clear();
int heightScaled = (int)(20 * GUI.Scale);
editingHUD = new GUIFrame(new RectTransform(new Vector2(0.3f, 0.25f), GUI.Canvas, Anchor.CenterRight) { MinSize = new Point(400, 0) }) { UserData = this };
@@ -643,6 +653,7 @@ namespace Barotrauma
};
var itemEditor = new SerializableEntityEditor(listBox.Content.RectTransform, this, inGame, showName: true, titleFont: GUI.LargeFont) { UserData = this };
activeEditors.Add(itemEditor);
itemEditor.Children.First().Color = Color.Black * 0.7f;
if (!inGame)
{
@@ -782,6 +793,7 @@ namespace Barotrauma
var componentEditor = new SerializableEntityEditor(listBox.Content.RectTransform, ic, inGame, showName: !inGame, titleFont: GUI.SubHeadingFont) { UserData = ic };
componentEditor.Children.First().Color = Color.Black * 0.7f;
activeEditors.Add(componentEditor);
if (inGame)
{
@@ -976,7 +988,7 @@ namespace Barotrauma
Screen.Selected == GameMain.SubEditorScreen)
{
GUIComponent prevEditingHUD = editingHUD;
UpdateEditing(cam);
UpdateEditing(cam, deltaTime);
editingHUDCreated = editingHUD != null && editingHUD != prevEditingHUD;
}
@@ -996,7 +1008,7 @@ namespace Barotrauma
{
if (prefab.IsLinkAllowed(entity.prefab) && entity is Item i)
{
if (!i.DisplaySideBySideWhenLinked) continue;
if (!i.DisplaySideBySideWhenLinked) { continue; }
activeComponents.AddRange(i.components);
}
}
@@ -1030,6 +1042,8 @@ namespace Barotrauma
}
}
activeHUDs.Sort((h1, h2) => { return h2.HudLayer.CompareTo(h1.HudLayer); });
//active HUDs have changed, need to reposition
if (!prevActiveHUDs.SequenceEqual(activeHUDs) || editingHUDCreated)
{
@@ -1132,8 +1146,6 @@ namespace Barotrauma
}
texts.Add(new ColoredText(nameText, GUI.Style.TextColor, false, false));
bool noComponentText = true;
if (CampaignInteractionType != CampaignMode.InteractionType.None)
{
texts.Add(new ColoredText(TextManager.GetWithVariable($"CampaignInteraction.{CampaignInteractionType}", "[key]", GameMain.Config.KeyBindText(InputType.Use)), Color.Cyan, false, false));
@@ -1159,7 +1171,6 @@ namespace Barotrauma
}
}
texts.Add(new ColoredText(ic.DisplayMsg, color, false, false));
noComponentText = false;
}
}
if (PlayerInput.IsShiftDown() && CrewManager.DoesItemHaveContextualOrders(this))
@@ -1295,7 +1306,6 @@ namespace Barotrauma
break;
case NetEntityEvent.Type.ChangeProperty:
ReadPropertyChange(msg, false);
editingHUDRefreshPending = true;
break;
case NetEntityEvent.Type.Upgrade:
string identifier = msg.ReadString();
@@ -101,7 +101,7 @@ namespace Barotrauma
return editingHUD;
}
public override void UpdateEditing(Camera cam)
public override void UpdateEditing(Camera cam, float deltaTime)
{
if (editingHUD == null || editingHUD.UserData as Hull != this)
{
@@ -23,6 +23,14 @@ namespace Barotrauma
public LevelWallVertexBuffer(VertexPositionTexture[] wallVertices, VertexPositionTexture[] wallEdgeVertices, Texture2D wallTexture, Texture2D edgeTexture, Color color)
{
if (wallVertices.Length == 0)
{
throw new ArgumentException("Failed to instantiate a LevelWallVertexBuffer (no wall vertices).");
}
if (wallVertices.Length == 0)
{
throw new ArgumentException("Failed to instantiate a LevelWallVertexBuffer (no wall edge vertices).");
}
this.wallVertices = LevelRenderer.GetColoredVertices(wallVertices, color);
WallBuffer = new VertexBuffer(GameMain.Instance.GraphicsDevice, VertexPositionColorTexture.VertexDeclaration, wallVertices.Length, BufferUsage.WriteOnly);
WallBuffer.SetData(this.wallVertices);
@@ -617,14 +617,10 @@ namespace Barotrauma.Lights
private List<Vector2> FindRaycastHits()
{
if (!CastShadows)
{
return null;
}
if (Range < 1.0f || Color.A < 1) { return null; }
if (!CastShadows || Range < 1.0f || Color.A < 1) { return null; }
Vector2 drawPos = position;
if (ParentSub != null) drawPos += ParentSub.DrawPosition;
if (ParentSub != null) { drawPos += ParentSub.DrawPosition; }
var hulls = new List<ConvexHull>();
foreach (ConvexHullList chList in hullsInRange)
@@ -826,13 +822,13 @@ namespace Barotrauma.Lights
Vector2 dirNormal = new Vector2(-dir.Y, dir.X) * 3;
//do two slightly offset raycasts to hit the segment itself and whatever's behind it
Pair<int,Vector2> intersection1 = RayCast(drawPos, drawPos + dir * boundsExtended * 2 - dirNormal, visibleSegments);
Pair<int,Vector2> intersection2 = RayCast(drawPos, drawPos + dir * boundsExtended * 2 + dirNormal, visibleSegments);
var intersection1 = RayCast(drawPos, drawPos + dir * boundsExtended * 2 - dirNormal, visibleSegments);
var intersection2 = RayCast(drawPos, drawPos + dir * boundsExtended * 2 + dirNormal, visibleSegments);
if (intersection1.First < 0) return null;
if (intersection2.First < 0) return null;
Segment seg1 = visibleSegments[intersection1.First];
Segment seg2 = visibleSegments[intersection2.First];
if (intersection1.index < 0) return null;
if (intersection2.index < 0) return null;
Segment seg1 = visibleSegments[intersection1.index];
Segment seg2 = visibleSegments[intersection2.index];
bool isPoint1 = MathUtils.LineToPointDistanceSquared(seg1.Start.WorldPos, seg1.End.WorldPos, p.WorldPos) < 25.0f;
bool isPoint2 = MathUtils.LineToPointDistanceSquared(seg2.Start.WorldPos, seg2.End.WorldPos, p.WorldPos) < 25.0f;
@@ -849,12 +845,12 @@ namespace Barotrauma.Lights
hullList.IsHidden.Remove(seg2.ConvexHull);
}
}
else if (intersection1.First != intersection2.First)
else if (intersection1.index != intersection2.index)
{
//the raycasts landed on different segments
//we definitely want to generate new geometry here
output.Add(isPoint1 ? p.WorldPos : intersection1.Second);
output.Add(isPoint2 ? p.WorldPos : intersection2.Second);
output.Add(isPoint1 ? p.WorldPos : intersection1.pos);
output.Add(isPoint2 ? p.WorldPos : intersection2.pos);
foreach (ConvexHullList hullList in hullsInRange)
{
@@ -884,7 +880,7 @@ namespace Barotrauma.Lights
return output;
}
private Pair<int, Vector2> RayCast(Vector2 rayStart, Vector2 rayEnd, List<Segment> segments)
private (int index, Vector2 pos) RayCast(Vector2 rayStart, Vector2 rayEnd, List<Segment> segments)
{
Vector2? closestIntersection = null;
int segment = -1;
@@ -943,8 +939,7 @@ namespace Barotrauma.Lights
}
}
Pair<int, Vector2> retVal = new Pair<int, Vector2>(segment, closestIntersection == null ? rayEnd : (Vector2)closestIntersection);
return retVal;
return (segment, closestIntersection == null ? rayEnd : (Vector2)closestIntersection);
}
@@ -1281,11 +1276,6 @@ namespace Barotrauma.Lights
{
if (Range < 1.0f || Color.A < 1 || CurrentBrightness <= 0.0f) { return; }
if (CastShadows)
{
CheckHullsInRange();
}
//if the light doesn't cast shadows, we can simply render the texture without having to calculate the light volume
if (!CastShadows)
{
@@ -1298,16 +1288,27 @@ namespace Barotrauma.Lights
float scale = Range / (currentTexture.Width / 2.0f);
Vector2 drawPos = position;
if (ParentSub != null) drawPos += ParentSub.DrawPosition;
if (ParentSub != null) { drawPos += ParentSub.DrawPosition; }
drawPos.Y = -drawPos.Y;
spriteBatch.Draw(currentTexture, drawPos, null, Color.Multiply(CurrentBrightness), -rotation, center, scale, SpriteEffects.None, 1);
return;
}
CheckHullsInRange();
if (NeedsRecalculation)
{
var verts = FindRaycastHits();
if (verts == null)
{
#if DEBUG
DebugConsole.ThrowError($"Failed to generate vertices for a light source. Range: {Range}, color: {Color}, brightness: {CurrentBrightness}, parent: {ParentBody?.UserData ?? "Unknown"}");
#endif
Enabled = false;
return;
}
CalculateLightVertices(verts);
lastRecalculationTime = (float)Timing.TotalTime;
@@ -55,23 +55,23 @@ namespace Barotrauma
GUI.DrawLine(spriteBatch, pos + Vector2.UnitX * 50.0f, pos - Vector2.UnitX * 50.0f, color * alpha, 0.0f, 5);
}
public override void UpdateEditing(Camera cam)
public override void UpdateEditing(Camera cam, float deltaTime)
{
if (editingHUD == null || editingHUD.UserData as LinkedSubmarine != this)
{
editingHUD = CreateEditingHUD();
}
editingHUD.UpdateManually((float)Timing.Step);
editingHUD.UpdateManually(deltaTime);
if (!PlayerInput.PrimaryMouseButtonClicked() || !PlayerInput.KeyDown(Keys.Space)) return;
if (!PlayerInput.PrimaryMouseButtonClicked() || !PlayerInput.KeyDown(Keys.Space)) { return; }
Vector2 position = cam.ScreenToWorld(PlayerInput.MousePosition);
foreach (MapEntity entity in mapEntityList)
{
if (entity == this || !entity.IsHighlighted || !(entity is Item) || !entity.IsMouseOn(position)) continue;
if (((Item)entity).GetComponent<DockingPort>() == null) continue;
if (entity == this || !entity.IsHighlighted || !(entity is Item) || !entity.IsMouseOn(position)) { continue; }
if (((Item)entity).GetComponent<DockingPort>() == null) { continue; }
if (linkedTo.Contains(entity))
{
linkedTo.Remove(entity);
@@ -838,9 +838,9 @@ namespace Barotrauma
public static List<MapEntity> FilteredSelectedList { get; private set; } = new List<MapEntity>();
public static void UpdateEditor(Camera cam)
public static void UpdateEditor(Camera cam, float deltaTime)
{
if (highlightedListBox != null) highlightedListBox.UpdateManually((float)Timing.Step);
if (highlightedListBox != null) { highlightedListBox.UpdateManually(deltaTime); }
if (editingHUD != null)
{
@@ -865,7 +865,7 @@ namespace Barotrauma
var first = FilteredSelectedList.FirstOrDefault();
if (first != null)
{
first.UpdateEditing(cam);
first.UpdateEditing(cam, deltaTime);
if (first.ResizeHorizontal || first.ResizeVertical)
{
first.UpdateResizing(cam);
@@ -1017,7 +1017,7 @@ namespace Barotrauma
if (editingHUD != null && editingHUD.UserData == this) editingHUD.AddToGUIUpdateList();
}
public virtual void UpdateEditing(Camera cam) { }
public virtual void UpdateEditing(Camera cam, float deltaTime) { }
protected static void PositionEditingHUD()
{
@@ -83,7 +83,7 @@ namespace Barotrauma
convexHulls.Add(h);
}
public override void UpdateEditing(Camera cam)
public override void UpdateEditing(Camera cam, float deltaTime)
{
if (editingHUD == null || editingHUD.UserData as Structure != this)
{
@@ -53,8 +53,8 @@ namespace Barotrauma
}
}
private Dictionary<string,HullCollection> hullCollections;
private List<Door> doors;
private readonly Dictionary<string, HullCollection> hullCollections;
private readonly List<Door> doors;
private static SubmarinePreview instance = null;
@@ -104,7 +104,7 @@ namespace Barotrauma
(spriteBatch, component) => {
camera.UpdateTransform(interpolate: true, updateListener: false);
Rectangle drawRect = new Rectangle(component.Rect.X + 1, component.Rect.Y + 1, component.Rect.Width - 2, component.Rect.Height - 2);
RenderSubmarine(spriteBatch, drawRect);
RenderSubmarine(spriteBatch, drawRect, component);
},
(deltaTime, component) => {
bool isMouseOnComponent = GUI.MouseOn == component;
@@ -121,6 +121,10 @@ namespace Barotrauma
{
specsContainer.Visible = GUI.IsMouseOn(titleText);
}
if (PlayerInput.KeyHit(Microsoft.Xna.Framework.Input.Keys.Escape))
{
Dispose();
}
});
var topContainer = new GUIFrame(new RectTransform(new Vector2(1f, 0.07f), innerPadded.RectTransform, Anchor.TopLeft), style: null)
@@ -225,6 +229,7 @@ namespace Barotrauma
foreach (var subElement in submarineInfo.SubmarineElement.Elements())
{
if (subElement.GetAttributeBool("hiddeningame", false)) { continue; }
switch (subElement.Name.LocalName.ToLowerInvariant())
{
case "item":
@@ -240,8 +245,7 @@ namespace Barotrauma
string identifier = subElement.GetAttributeString("roomname", "").ToLowerInvariant();
if (!string.IsNullOrEmpty(identifier))
{
HullCollection hullCollection = null;
if (!hullCollections.TryGetValue(identifier, out hullCollection))
if (!hullCollections.TryGetValue(identifier, out HullCollection hullCollection))
{
hullCollection = new HullCollection(identifier);
hullCollections.Add(identifier, hullCollection);
@@ -476,12 +480,14 @@ namespace Barotrauma
}
}
var transformedBarrelPos = MathUtils.RotatePointAroundTarget(
subElement.GetAttributeVector2("barrelpos", Vector2.Zero) * scale,
new Vector2(rect.Width / 2, rect.Height / 2),
Vector2 barrelPos = subElement.GetAttributeVector2("barrelpos", Vector2.Zero);
Vector2 relativeBarrelPos = barrelPos * prefab.Scale - new Vector2(rect.Width / 2, rect.Height / 2);
var transformedBarrelPos = MathUtils.RotatePoint(
relativeBarrelPos,
MathHelper.ToRadians(rotation));
Vector2 drawPos = new Vector2(rect.X + transformedBarrelPos.X, rect.Y - transformedBarrelPos.Y);
float relativeScale = scale / prefab.Scale;
Vector2 drawPos = new Vector2(rect.X + rect.Width * relativeScale / 2 + transformedBarrelPos.X * relativeScale, rect.Y - rect.Height * relativeScale / 2 - transformedBarrelPos.Y * relativeScale);
drawPos.Y = -drawPos.Y;
railSprite?.Draw(spriteRecorder,
@@ -491,7 +497,7 @@ namespace Barotrauma
SpriteEffects.None, depth + (railSprite.Depth - prefab.sprite.Depth));
barrelSprite?.Draw(spriteRecorder,
drawPos - new Vector2((float)Math.Cos(MathHelper.ToRadians(rotation)), (float)Math.Sin(MathHelper.ToRadians(rotation))) * scale,
drawPos,
color,
rotation + MathHelper.PiOver2, scale,
SpriteEffects.None, depth + (barrelSprite.Depth - prefab.sprite.Depth));
@@ -564,7 +570,7 @@ namespace Barotrauma
}
}
private void RenderSubmarine(SpriteBatch spriteBatch, Rectangle scissorRectangle)
private void RenderSubmarine(SpriteBatch spriteBatch, Rectangle scissorRectangle, GUIComponent component)
{
if (spriteRecorder == null) { return; }
@@ -605,11 +611,13 @@ namespace Barotrauma
foreach (var hullCollection in hullCollections.Values)
{
bool mouseOver = false;
foreach (var rect in hullCollection.Rects)
if (GUI.MouseOn == null || GUI.MouseOn == component)
{
mouseOver = rect.Contains(mousePos);
if (mouseOver) { break; }
foreach (var rect in hullCollection.Rects)
{
mouseOver = rect.Contains(mousePos);
if (mouseOver) { break; }
}
}
foreach (var rect in hullCollection.Rects)
@@ -149,7 +149,7 @@ namespace Barotrauma
}
}
public override void UpdateEditing(Camera cam)
public override void UpdateEditing(Camera cam, float deltaTime)
{
if (editingHUD == null || editingHUD.UserData != this)
{
@@ -318,9 +318,10 @@ namespace Barotrauma
if (MapGenerationParams.Instance.RadiationParams != null)
{
bool prevRadiationToggleEnabled = EnableRadiationToggle?.Selected ?? true;
EnableRadiationToggle = new GUITickBox(new RectTransform(new Vector2(0.3f, 0.3f), CampaignSettingsContent.RectTransform), TextManager.Get("CampaignOption.EnableRadiation"), font: GUI.Style.Font)
{
Selected = true,
Selected = prevRadiationToggleEnabled,
ToolTip = TextManager.Get("campaignoption.enableradiation.tooltip")
};
}
@@ -340,7 +341,9 @@ namespace Barotrauma
return true;
}
};
MaxMissionCountText = new GUITextBlock(new RectTransform(new Vector2(0.7f, 1.0f), maxMissionCountContainer.RectTransform), CampaignSettings.DefaultMaxMissionCount.ToString(), textAlignment: Alignment.Center, style: "GUITextBox");
string prevMaxMissionCountText = MaxMissionCountText?.Text ?? CampaignSettings.DefaultMaxMissionCount.ToString();
MaxMissionCountText = new GUITextBlock(new RectTransform(new Vector2(0.7f, 1.0f), maxMissionCountContainer.RectTransform), prevMaxMissionCountText, textAlignment: Alignment.Center, style: "GUITextBox");
maxMissionCountButtons[1] = new GUIButton(new RectTransform(new Vector2(0.15f, 0.8f), maxMissionCountContainer.RectTransform), style: "GUIButtonToggleRight")
{
OnClicked = (button, obj) =>
@@ -806,11 +809,12 @@ namespace Barotrauma
UserData = "savefileframe"
};
new GUITextBlock(new RectTransform(new Vector2(1, 0.2f), saveFileFrame.RectTransform, Anchor.TopCenter)
var titleText = new GUITextBlock(new RectTransform(new Vector2(0.9f, 0.2f), saveFileFrame.RectTransform, Anchor.TopCenter)
{
RelativeOffset = new Vector2(0, 0.05f)
},
Path.GetFileNameWithoutExtension(fileName), font: GUI.LargeFont, textAlignment: Alignment.Center);
titleText.Text = ToolBox.LimitString(titleText.Text, titleText.Font, titleText.Rect.Width);
var layoutGroup = new GUILayoutGroup(new RectTransform(new Vector2(0.8f, 0.5f), saveFileFrame.RectTransform, Anchor.Center)
{
@@ -22,6 +22,7 @@ namespace Barotrauma
private GUIListBox missionList;
private readonly List<GUITickBox> missionTickBoxes = new List<GUITickBox>();
private readonly List<GUITextBlock> missionRewardTexts = new List<GUITextBlock>();
private bool hasMaxMissions;
@@ -368,6 +369,7 @@ namespace Barotrauma
public void SelectLocation(Location location, LocationConnection connection)
{
missionTickBoxes.Clear();
missionRewardTexts.Clear();
locationInfoPanel.ClearChildren();
//don't select the map panel if we're looking at some other tab
if (selectedTab == CampaignMode.InteractionType.Map)
@@ -524,6 +526,12 @@ namespace Barotrauma
Campaign.Map.CurrentLocation.DeselectMission(mission);
}
foreach (GUITextBlock rewardText in missionRewardTexts)
{
Mission otherMission = rewardText.UserData as Mission;
rewardText.SetRichText(otherMission.GetMissionRewardText(Submarine.MainSub));
}
UpdateMaxMissions(connection.OtherLocation(currentDisplayLocation));
if ((Campaign is MultiPlayerCampaign multiPlayerCampaign) && !multiPlayerCampaign.SuppressStateSending &&
@@ -567,7 +575,11 @@ namespace Barotrauma
//spacing
new GUIFrame(new RectTransform(new Vector2(1.0f, 0.0f), missionTextContent.RectTransform) { MinSize = new Point(0, GUI.IntScale(10)) }, style: null);
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), missionTextContent.RectTransform), mission.GetMissionRewardText(Submarine.MainSub), wrap: true, parseRichText: true);
var rewardText = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), missionTextContent.RectTransform), mission.GetMissionRewardText(Submarine.MainSub), wrap: true, parseRichText: true)
{
UserData = mission
};
missionRewardTexts.Add(rewardText);
string reputationText = mission.GetReputationRewardText(mission.Locations[0]);
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), missionTextContent.RectTransform), reputationText, wrap: true, parseRichText: true);
@@ -119,6 +119,7 @@ namespace Barotrauma
addValueDropdown.AddItem(nameof(LimbType), typeof(LimbType));
addValueDropdown.AddItem(nameof(ReputationAction.ReputationType), typeof(ReputationAction.ReputationType));
addValueDropdown.AddItem(nameof(SpawnAction.SpawnLocationType), typeof(SpawnAction.SpawnLocationType));
addValueDropdown.AddItem(nameof(CharacterTeamType), typeof(CharacterTeamType));
loadButton.OnClicked += (button, o) => Load(loadDropdown.SelectedData as EventPrefab);
addActionButton.OnClicked += (button, o) => AddAction(addActionDropdown.SelectedData as Type);
@@ -1089,6 +1089,7 @@ namespace Barotrauma
itemContentPackage = ContentPackage.CreatePackage(sub.Name, Path.Combine(destinationFolder, SteamManager.MetadataFileName), corePackage: false);
SteamManager.CreateWorkshopItemStaging(itemContentPackage, out itemEditor);
bool fileMoved = false;
string submarineDir = Path.GetDirectoryName(sub.FilePath);
if (submarineDir != Path.GetDirectoryName(destinationFolder))
{
@@ -1097,14 +1098,18 @@ namespace Barotrauma
{
File.Move(sub.FilePath, destinationPath);
}
fileMoved = true;
sub.FilePath = destinationPath;
}
itemContentPackage.AddFile(sub.FilePath, ContentType.Submarine);
itemContentPackage.Name = sub.Name;
itemContentPackage.Save(itemContentPackage.Path);
//ContentPackage.List.Add(itemContentPackage);
//GameMain.Config.SelectContentPackage(itemContentPackage);
if (fileMoved)
{
GameMain.Config.EnableRegularPackage(itemContentPackage);
}
itemEditor = itemEditor?.WithTitle(sub.Name).WithTag("Submarine").WithDescription(sub.Description);
@@ -4696,7 +4696,7 @@ namespace Barotrauma
CloseItem();
}
}
MapEntity.UpdateEditor(cam);
MapEntity.UpdateEditor(cam, (float)deltaTime);
}
entityMenuOpenState = entityMenuOpen && !WiringMode ?
@@ -10,10 +10,10 @@ namespace Barotrauma
{
class SerializableEntityEditor : GUIComponent
{
private int elementHeight;
private GUILayoutGroup layoutGroup;
private float inputFieldWidth = 0.5f;
private float largeInputFieldWidth = 0.8f;
private readonly int elementHeight;
private readonly GUILayoutGroup layoutGroup;
private readonly float inputFieldWidth = 0.5f;
private readonly float largeInputFieldWidth = 0.8f;
#if DEBUG
public static List<string> MissingLocalizations = new List<string>();
#endif
@@ -23,6 +23,8 @@ namespace Barotrauma
public static DateTime NextCommandPush;
public static Tuple<SerializableProperty, PropertyCommand> CommandBuffer;
private Action refresh;
public int ContentHeight
{
get
@@ -312,6 +314,11 @@ namespace Barotrauma
Recalculate();
}
public void RefreshValues()
{
refresh?.Invoke();
}
public void Recalculate() => RectTransform.Resize(new Point(RectTransform.NonScaledSize.X, ContentHeight));
public GUIComponent CreateNewField(SerializableProperty property, ISerializableEntity entity)
@@ -459,6 +466,10 @@ namespace Barotrauma
return true;
}
};
refresh += () =>
{
propertyTickBox.Selected = (bool)property.GetValue(entity);
};
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, new GUIComponent[] { propertyTickBox }); }
return propertyTickBox;
}
@@ -480,7 +491,7 @@ namespace Barotrauma
ToolTip = toolTip,
Font = GUI.SmallFont
};
field = numberInput as GUIComponent;
field = numberInput;
}
else
{
@@ -499,7 +510,11 @@ namespace Barotrauma
TrySendNetworkUpdate(entity, property);
}
};
field = numberInput as GUIComponent;
refresh += () =>
{
if (!numberInput.TextBox.Selected) { numberInput.IntValue = (int)property.GetValue(entity); }
};
field = numberInput;
}
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, new GUIComponent[] { field }); }
return frame;
@@ -538,6 +553,10 @@ namespace Barotrauma
TrySendNetworkUpdate(entity, property);
}
};
refresh += () =>
{
if (!numberInput.TextBox.Selected) { numberInput.FloatValue = (float)property.GetValue(entity); }
};
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, new GUIComponent[] { numberInput }); }
return frame;
}
@@ -567,6 +586,10 @@ namespace Barotrauma
}
return true;
};
refresh += () =>
{
if (!enumDropDown.Dropped) { enumDropDown.SelectItem(property.GetValue(entity)); }
};
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, new GUIComponent[] { enumDropDown }); }
return frame;
}
@@ -635,6 +658,10 @@ namespace Barotrauma
propertyBox.OnDeselected += (textBox, keys) => OnApply(textBox);
propertyBox.OnEnterPressed += (box, text) => OnApply(box);
refresh += () =>
{
if (!propertyBox.Selected) { propertyBox.Text = (string)property.GetValue(entity); }
};
bool OnApply(GUITextBox textBox)
{
@@ -730,6 +757,15 @@ namespace Barotrauma
};
fields[i] = numberInput;
}
refresh += () =>
{
if (!fields.Any(f => ((GUINumberInput)f).TextBox.Selected))
{
Point value = (Point)property.GetValue(entity);
((GUINumberInput)fields[0]).IntValue = value.X;
((GUINumberInput)fields[1]).IntValue = value.Y;
}
};
frame.RectTransform.MinSize = new Point(0, frame.RectTransform.Children.Max(c => c.MinSize.Y));
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, fields); }
return frame;
@@ -791,6 +827,15 @@ namespace Barotrauma
};
fields[i] = numberInput;
}
refresh += () =>
{
if (!fields.Any(f => ((GUINumberInput)f).TextBox.Selected))
{
Vector2 value = (Vector2)property.GetValue(entity);
((GUINumberInput)fields[0]).FloatValue = value.X;
((GUINumberInput)fields[1]).FloatValue = value.Y;
}
};
frame.RectTransform.MinSize = new Point(0, frame.RectTransform.Children.Max(c => c.MinSize.Y));
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, fields); }
return frame;
@@ -857,6 +902,16 @@ namespace Barotrauma
};
fields[i] = numberInput;
}
refresh += () =>
{
if (!fields.Any(f => ((GUINumberInput)f).TextBox.Selected))
{
Vector3 value = (Vector3)property.GetValue(entity);
((GUINumberInput)fields[0]).FloatValue = value.X;
((GUINumberInput)fields[1]).FloatValue = value.Y;
((GUINumberInput)fields[2]).FloatValue = value.Z;
}
};
frame.RectTransform.MinSize = new Point(0, frame.RectTransform.Children.Max(c => c.MinSize.Y));
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, fields); }
return frame;
@@ -927,6 +982,17 @@ namespace Barotrauma
};
fields[i] = numberInput;
}
refresh += () =>
{
if (!fields.Any(f => ((GUINumberInput)f).TextBox.Selected))
{
Vector4 value = (Vector4)property.GetValue(entity);
((GUINumberInput)fields[0]).FloatValue = value.X;
((GUINumberInput)fields[1]).FloatValue = value.Y;
((GUINumberInput)fields[2]).FloatValue = value.Z;
((GUINumberInput)fields[3]).FloatValue = value.W;
}
};
frame.RectTransform.MinSize = new Point(0, frame.RectTransform.Children.Max(c => c.MinSize.Y));
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, fields); }
return frame;
@@ -993,13 +1059,13 @@ namespace Barotrauma
{
Color newVal = (Color)property.GetValue(entity);
if (comp == 0)
newVal.R = (byte)(numInput.IntValue);
newVal.R = (byte)numInput.IntValue;
else if (comp == 1)
newVal.G = (byte)(numInput.IntValue);
newVal.G = (byte)numInput.IntValue;
else if (comp == 2)
newVal.B = (byte)(numInput.IntValue);
newVal.B = (byte)numInput.IntValue;
else
newVal.A = (byte)(numInput.IntValue);
newVal.A = (byte)numInput.IntValue;
if (SetPropertyValue(property, entity, newVal))
{
@@ -1010,6 +1076,17 @@ namespace Barotrauma
colorBox.Color = colorBox.HoverColor = colorBox.PressedColor = colorBox.SelectedTextColor = (Color)property.GetValue(entity);
fields[i] = numberInput;
}
refresh += () =>
{
if (!fields.Any(f => ((GUINumberInput)f).TextBox.Selected))
{
Color value = (Color)property.GetValue(entity);
((GUINumberInput)fields[0]).IntValue = value.R;
((GUINumberInput)fields[1]).IntValue = value.G;
((GUINumberInput)fields[2]).IntValue = value.B;
((GUINumberInput)fields[3]).IntValue = value.A;
}
};
frame.RectTransform.MinSize = new Point(0, frame.RectTransform.Children.Max(c => c.MinSize.Y));
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, fields); }
return frame;
@@ -1072,6 +1149,17 @@ namespace Barotrauma
};
fields[i] = numberInput;
}
refresh += () =>
{
if (!fields.Any(f => ((GUINumberInput)f).TextBox.Selected))
{
Rectangle value = (Rectangle)property.GetValue(entity);
((GUINumberInput)fields[0]).IntValue = value.X;
((GUINumberInput)fields[1]).IntValue = value.Y;
((GUINumberInput)fields[2]).IntValue = value.Width;
((GUINumberInput)fields[3]).IntValue = value.Height;
}
};
if (!Fields.ContainsKey(property.Name)) { Fields.Add(property.Name, fields); }
return frame;
}
@@ -9,14 +9,14 @@ namespace Barotrauma.Sounds
{
public class SoundBuffers : IDisposable
{
private static HashSet<uint> bufferPool = new HashSet<uint>();
private static readonly HashSet<uint> bufferPool = new HashSet<uint>();
#if OSX
public const int MaxBuffers = 400; //TODO: check that this value works for macOS
#else
public const int MaxBuffers = 32000;
#endif
public static int BuffersGenerated { get; private set; } = 0;
private Sound sound;
private readonly Sound sound;
public uint AlBuffer { get; private set; } = 0;
public uint AlMuffledBuffer { get; private set; } = 0;
@@ -24,55 +24,73 @@ namespace Barotrauma.Sounds
public SoundBuffers(Sound sound) { this.sound = sound; }
public void Dispose()
{
if (AlBuffer != 0) { bufferPool.Add(AlBuffer); }
if (AlMuffledBuffer != 0) { bufferPool.Add(AlMuffledBuffer); }
if (AlBuffer != 0)
{
lock (bufferPool)
{
bufferPool.Add(AlBuffer);
}
}
if (AlMuffledBuffer != 0)
{
lock (bufferPool)
{
bufferPool.Add(AlMuffledBuffer);
}
}
AlBuffer = 0;
AlMuffledBuffer = 0;
}
public static void ClearPool()
{
bufferPool.ForEach(b => Al.DeleteBuffer(b));
bufferPool.Clear();
lock (bufferPool)
{
bufferPool.ForEach(b => Al.DeleteBuffer(b));
bufferPool.Clear();
}
BuffersGenerated = 0;
}
public bool RequestAlBuffers()
{
if (AlBuffer != 0) { return false; }
int alError = 0;
while (bufferPool.Count < 2 && BuffersGenerated < MaxBuffers)
int alError;
lock (bufferPool)
{
Al.GenBuffer(out uint newBuffer);
alError = Al.GetError();
if (alError != Al.NoError)
while (bufferPool.Count < 2 && BuffersGenerated < MaxBuffers)
{
DebugConsole.AddWarning($"Error when generating sound buffer: {Al.GetErrorString(alError)}. {BuffersGenerated} buffer(s) were generated. No more sound buffers will be generated.");
BuffersGenerated = MaxBuffers;
}
else if (!Al.IsBuffer(newBuffer))
{
DebugConsole.AddWarning($"Error when generating sound buffer: result is not a valid buffer. {BuffersGenerated} buffer(s) were generated. No more sound buffers will be generated.");
BuffersGenerated = MaxBuffers;
}
else
{
bufferPool.Add(newBuffer);
BuffersGenerated++;
if (BuffersGenerated >= MaxBuffers)
Al.GenBuffer(out uint newBuffer);
alError = Al.GetError();
if (alError != Al.NoError)
{
DebugConsole.AddWarning($"{BuffersGenerated} buffer(s) were generated. No more sound buffers will be generated.");
DebugConsole.AddWarning($"Error when generating sound buffer: {Al.GetErrorString(alError)}. {BuffersGenerated} buffer(s) were generated. No more sound buffers will be generated.");
BuffersGenerated = MaxBuffers;
}
else if (!Al.IsBuffer(newBuffer))
{
DebugConsole.AddWarning($"Error when generating sound buffer: result is not a valid buffer. {BuffersGenerated} buffer(s) were generated. No more sound buffers will be generated.");
BuffersGenerated = MaxBuffers;
}
else
{
bufferPool.Add(newBuffer);
BuffersGenerated++;
if (BuffersGenerated >= MaxBuffers)
{
DebugConsole.AddWarning($"{BuffersGenerated} buffer(s) were generated. No more sound buffers will be generated.");
}
}
}
}
if (bufferPool.Count >= 2)
{
AlBuffer = bufferPool.First();
bufferPool.Remove(AlBuffer);
AlMuffledBuffer = bufferPool.First();
bufferPool.Remove(AlMuffledBuffer);
return true;
if (bufferPool.Count >= 2)
{
AlBuffer = bufferPool.First();
bufferPool.Remove(AlBuffer);
AlMuffledBuffer = bufferPool.First();
bufferPool.Remove(AlMuffledBuffer);
return true;
}
}
//can't generate any more OpenAL buffers! we'll have to steal a buffer from someone...
@@ -112,7 +130,6 @@ namespace Barotrauma.Sounds
throw new Exception(sound.Filename + " has an invalid muffled buffer!");
}
return true;
}
@@ -167,10 +167,10 @@ namespace Barotrauma.Sounds
public CategoryModifier(int gainMultiplierIndex, float gain, bool muffle)
{
Muffle = muffle;
GainMultipliers = new float[gainMultiplierIndex+1];
for (int i=0;i<GainMultipliers.Length;i++)
GainMultipliers = new float[gainMultiplierIndex + 1];
for (int i = 0; i < GainMultipliers.Length; i++)
{
if (i==gainMultiplierIndex)
if (i == gainMultiplierIndex)
{
GainMultipliers[i] = gain;
}
@@ -183,11 +183,11 @@ namespace Barotrauma.Sounds
public void SetGainMultiplier(int index, float gain)
{
if (GainMultipliers.Length < index+1)
if (GainMultipliers.Length < index + 1)
{
int oldLength = GainMultipliers.Length;
Array.Resize(ref GainMultipliers, index + 1);
for (int i=oldLength;i<GainMultipliers.Length;i++)
for (int i = oldLength; i < GainMultipliers.Length; i++)
{
GainMultipliers[i] = 1.0f;
}
@@ -149,7 +149,7 @@ namespace Barotrauma
{
OverrideMusicType = null;
var soundFiles = GameMain.Instance.GetFilesOfType(ContentType.Sounds);
var soundFiles = GameMain.Instance.GetFilesOfType(ContentType.Sounds).ToList();
List<XElement> soundElements = new List<XElement>();
foreach (ContentFile soundFile in soundFiles)