diff --git a/Subsurface/Source/Events/MonsterEvent.cs b/Subsurface/Source/Events/MonsterEvent.cs index 1d5f23f6c..5bc2e8198 100644 --- a/Subsurface/Source/Events/MonsterEvent.cs +++ b/Subsurface/Source/Events/MonsterEvent.cs @@ -1,6 +1,8 @@ using System.Xml.Linq; using Microsoft.Xna.Framework; using System; +using System.Collections.Generic; +using System.Linq; namespace Barotrauma { @@ -49,8 +51,9 @@ namespace Barotrauma { if (GameMain.Server != null) { - string tryKey = GameMain.Server.monsterNames.Find(s => characterFile.ToLower().Contains(s.ToLower())); - if (tryKey != null) + List monsterNames = GameMain.Server.monsterEnabled.Keys.ToList(); + string tryKey = monsterNames.Find(s => characterFile.ToLower().Contains(s.ToLower())); + if (!string.IsNullOrWhiteSpace(tryKey)) { if (!GameMain.Server.monsterEnabled[tryKey]) return; //spawn was disallowed by host } diff --git a/Subsurface/Source/GUI/GUIButton.cs b/Subsurface/Source/GUI/GUIButton.cs index 8545de791..f755578f7 100644 --- a/Subsurface/Source/GUI/GUIButton.cs +++ b/Subsurface/Source/GUI/GUIButton.cs @@ -116,6 +116,20 @@ namespace Barotrauma } } + public override Rectangle Rect + { + get + { + return rect; + } + set + { + frame.Rect = new Rectangle(value.X, value.Y, frame.Rect.Width, frame.Rect.Height); + textBlock.Rect = value; + rect = value; + } + } + public bool Selected { get; set; } public GUIButton(Rectangle rect, string text, GUIStyle style, GUIComponent parent = null) diff --git a/Subsurface/Source/GUI/GUIListBox.cs b/Subsurface/Source/GUI/GUIListBox.cs index 99e60be62..a92391834 100644 --- a/Subsurface/Source/GUI/GUIListBox.cs +++ b/Subsurface/Source/GUI/GUIListBox.cs @@ -185,11 +185,101 @@ namespace Barotrauma } } + private void UpdateChildrenRect(float deltaTime) + { + int x = rect.X, y = rect.Y; + + if (!scrollBarHidden) + { + if (scrollBar.IsHorizontal) + { + x -= (int)((totalSize - rect.Width) * scrollBar.BarScroll); + } + else + { + y -= (int)((totalSize - rect.Height) * scrollBar.BarScroll); + } + } + + for (int i = 0; i < children.Count; i++) + { + GUIComponent child = children[i]; + if (child == frame || !child.Visible) continue; + + child.Rect = new Rectangle(x, y, child.Rect.Width, child.Rect.Height); + if (scrollBar.IsHorizontal) + { + x += child.Rect.Width + spacing; + } + else + { + y += child.Rect.Height + spacing; + } + + + if (scrollBar.IsHorizontal) + { + if (child.Rect.Right < rect.X) continue; + if (child.Rect.Right > rect.Right) break; + + if (child.Rect.X < rect.X && child.Rect.Right >= rect.X) + { + x = rect.X; + continue; + } + } + else + { + if (child.Rect.Y + child.Rect.Height < rect.Y) continue; + if (child.Rect.Y + child.Rect.Height > rect.Y + rect.Height) break; + + if (child.Rect.Y < rect.Y && child.Rect.Y + child.Rect.Height >= rect.Y) + { + y = rect.Y; + continue; + } + } + + if (deltaTime>0.0f) child.Update(deltaTime); + if (enabled && child.CanBeFocused && + (MouseOn == this || (MouseOn != null && this.IsParentOf(MouseOn))) && child.Rect.Contains(PlayerInput.MousePosition)) + { + child.State = ComponentState.Hover; + if (PlayerInput.LeftButtonClicked()) + { + Debug.WriteLine("clicked"); + Select(i); + //selected = child; + //if (OnSelected != null) + //{ + // if (!OnSelected(selected, child.UserData)) selected = null; + //} + + } + } + else if (selected.Contains(child)) + { + child.State = ComponentState.Selected; + + if (CheckSelected != null) + { + if (CheckSelected() != child.UserData) selected.Remove(child); + } + } + else + { + child.State = ComponentState.None; + } + } + } + public override void Update(float deltaTime) { if (!Visible) return; - base.Update(deltaTime); + UpdateChildrenRect(deltaTime); + + //base.Update(deltaTime); if (scrollBarEnabled && !scrollBarHidden) scrollBar.Update(deltaTime); @@ -258,6 +348,7 @@ namespace Barotrauma //float oldScroll = scrollBar.BarScroll; //float oldSize = scrollBar.BarSize; UpdateScrollBarSize(); + UpdateChildrenRect(0.0f); //if (oldSize == 1.0f && scrollBar.BarScroll == 0.0f) scrollBar.BarScroll = 1.0f; @@ -325,7 +416,6 @@ namespace Barotrauma GUIComponent child = children[i]; if (child == frame || !child.Visible) continue; - child.Rect = new Rectangle(x, y, child.Rect.Width, child.Rect.Height); if (scrollBar.IsHorizontal) { x += child.Rect.Width + spacing; @@ -358,36 +448,6 @@ namespace Barotrauma continue; } } - - if (enabled && child.CanBeFocused && - (MouseOn == this || (MouseOn != null && this.IsParentOf(MouseOn))) && child.Rect.Contains(PlayerInput.MousePosition)) - { - child.State = ComponentState.Hover; - if (PlayerInput.LeftButtonClicked()) - { - Debug.WriteLine("clicked"); - Select(i); - //selected = child; - //if (OnSelected != null) - //{ - // if (!OnSelected(selected, child.UserData)) selected = null; - //} - - } - } - else if (selected.Contains(child)) - { - child.State = ComponentState.Selected; - - if (CheckSelected != null) - { - if (CheckSelected() != child.UserData) selected.Remove(child); - } - } - else - { - child.State = ComponentState.None; - } child.Draw(spriteBatch); } diff --git a/Subsurface/Source/GUI/GUITextBlock.cs b/Subsurface/Source/GUI/GUITextBlock.cs index 5e20ad9f7..5e3ef7697 100644 --- a/Subsurface/Source/GUI/GUITextBlock.cs +++ b/Subsurface/Source/GUI/GUITextBlock.cs @@ -61,7 +61,12 @@ namespace Barotrauma set { if (base.Rect == value) return; - base.Rect = value; + foreach (GUIComponent child in children) + { + child.Rect = new Rectangle(child.Rect.X + value.X - rect.X, child.Rect.Y + value.Y - rect.Y, child.Rect.Width, child.Rect.Height); + } + + rect = value; SetTextPos(); } } @@ -163,7 +168,7 @@ namespace Barotrauma } } - private void SetTextPos() + public void SetTextPos() { if (text==null) return; diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index d8f64515c..52c78f158 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -959,6 +959,26 @@ namespace Barotrauma.Networking GameMain.GameSession.CrewManager.characters.Add(myCharacter); } } + + foreach (Submarine sub in Submarine.Loaded) + { + WayPoint cargoSpawnPos = WayPoint.GetRandom(SpawnType.Cargo, null, sub); + var cargoRoom = cargoSpawnPos.CurrentHull; + Vector2 position = new Vector2( + cargoSpawnPos.Position.X + Rand.Range(-20.0f, 20.0f, false), + cargoRoom.Rect.Y - cargoRoom.Rect.Height); + foreach (string s in extraCargo.Keys) + { + ItemPrefab itemPrefab = ItemPrefab.list.Find(ip => ip.Name == s) as ItemPrefab; + for (int i = 0; i < extraCargo[s]; i++) + { + var item = new Item(itemPrefab, position, cargoRoom.Submarine); + item.FindHull(); + + Item.ItemList.Add(item); + } + } + } var startMessage = CreateStartMessage(roundStartSeed, Submarine.MainSub, GameMain.GameSession.gameMode.Preset); diff --git a/Subsurface/Source/Networking/GameServerSettings.cs b/Subsurface/Source/Networking/GameServerSettings.cs index 7f1cd0110..0a9ad41b0 100644 --- a/Subsurface/Source/Networking/GameServerSettings.cs +++ b/Subsurface/Source/Networking/GameServerSettings.cs @@ -45,9 +45,9 @@ namespace Barotrauma.Networking get; private set; } - - public List monsterNames; + public Dictionary monsterEnabled; + public Dictionary extraCargo; public bool ShowNetStats; @@ -258,7 +258,7 @@ namespace Barotrauma.Networking showLogButton.Visible = SaveServerLogs; - monsterNames = Directory.GetDirectories("Content/Characters").ToList(); + List monsterNames = Directory.GetDirectories("Content/Characters").ToList(); for (int i=0;i(); } private void CreateSettingsFrame() @@ -448,9 +449,16 @@ namespace Barotrauma.Networking monsterButton.UserData = monsterFrame; monsterButton.OnClicked = (button, obj) => { + if (gameStarted) + { + ((GUIComponent)obj).Visible = false; + button.Enabled = false; + return true; + } ((GUIComponent)obj).Visible = !((GUIComponent)obj).Visible; return true; }; + List monsterNames = monsterEnabled.Keys.ToList(); foreach (string s in monsterNames) { GUITextBlock textBlock = new GUITextBlock( @@ -466,14 +474,107 @@ namespace Barotrauma.Networking monsterEnabledBox.Selected = monsterEnabled[s]; monsterEnabledBox.OnSelected = (GUITickBox) => { + if (gameStarted) + { + monsterFrame.Visible = false; + monsterButton.Enabled = false; + return true; + } monsterEnabled[s] = !monsterEnabled[s]; return true; }; } - var cargoButton = new GUIButton(new Rectangle(160, y, 130, 20), "Additional Cargo", GUI.Style, settingsTabs[0]); + var cargoButton = new GUIButton(new Rectangle(160, y, 130, 20), "Additional Cargo", GUI.Style, settingsTabs[0]); cargoButton.Enabled = !GameStarted; + var cargoFrame = new GUIListBox(new Rectangle(300, 60, 280, 250), GUI.Style, settingsTabs[0]); + cargoFrame.Visible = false; + cargoButton.UserData = cargoFrame; + cargoButton.OnClicked = (button, obj) => + { + if (gameStarted) + { + ((GUIComponent)obj).Visible = false; + button.Enabled = false; + return true; + } + ((GUIComponent)obj).Visible = !((GUIComponent)obj).Visible; + return true; + }; + + foreach (MapEntityCategory category in Enum.GetValues(typeof(MapEntityCategory))) + { + if (category == MapEntityCategory.Machine || category == MapEntityCategory.Structure) continue; + var items = MapEntityPrefab.list.FindAll(ep => ep.Price > 0.0f && ep.Category.HasFlag(category)); + foreach (MapEntityPrefab pf in items) + { + GUITextBlock textBlock = new GUITextBlock( + new Rectangle(0, 0, 260, 25), + pf.Name, + GUI.Style, + Alignment.Left, Alignment.Left, cargoFrame); + textBlock.Padding = new Vector4(30.0f, 3.0f, 0.0f, 0.0f); + textBlock.UserData = cargoFrame; + textBlock.CanBeFocused = false; + + if (pf.sprite != null) + { + float scale = Math.Min(Math.Min(30.0f / pf.sprite.SourceRect.Width, 30.0f / pf.sprite.SourceRect.Height), 1.0f); + GUIImage img = new GUIImage(new Rectangle(-15-(int)(pf.sprite.SourceRect.Width*scale*0.5f), 12-(int)(pf.sprite.SourceRect.Height*scale*0.5f), 40, 40), pf.sprite, Alignment.Left, textBlock); + img.Color = pf.SpriteColor; + img.Scale = scale; + } + + int cargoVal = 0; + extraCargo.TryGetValue(pf.Name, out cargoVal); + var countText = new GUITextBlock( + new Rectangle(180, 0, 50, 25), + cargoVal.ToString(), + GUI.Style, + Alignment.Left, Alignment.Center, textBlock); + + var incButton = new GUIButton(new Rectangle(220, 5, 10, 15), ">", GUI.Style, textBlock); + incButton.UserData = countText; + incButton.OnClicked = (button, obj) => + { + int val; + if (extraCargo.TryGetValue(pf.Name, out val)) + { + extraCargo[pf.Name]++; val = extraCargo[pf.Name]; + } + else + { + extraCargo.Add(pf.Name,1); val = 1; + } + ((GUITextBlock)obj).Text = val.ToString(); + ((GUITextBlock)obj).SetTextPos(); + return true; + }; + + var decButton = new GUIButton(new Rectangle(180, 5, 10, 15), "<", GUI.Style, textBlock); + decButton.UserData = countText; + decButton.OnClicked = (button, obj) => + { + int val; + if (extraCargo.TryGetValue(pf.Name, out val)) + { + extraCargo[pf.Name]--; + val = extraCargo[pf.Name]; + if (val <= 0) + { + extraCargo.Remove(pf.Name); + val = 0; + } + ((GUITextBlock)obj).Text = val.ToString(); + ((GUITextBlock)obj).SetTextPos(); + } + + return true; + }; + } + } + //-------------------------------------------------------------------------------- // server settings //--------------------------------------------------------------------------------