diff --git a/.gitignore b/.gitignore
index 49930d4bc..181e352c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,11 +12,11 @@ bld/
[Dd]ebug*/
[Rr]elease*/
-# Barotrauma content folder
-BarotraumaShared/Content/
-
+# Misc vs crap
*.v12.suo
*.suo
+*.csproj.user
+*.shproj.user
#performance reports & sessions
*.vsp
@@ -25,3 +25,6 @@ BarotraumaShared/Content/
# Mac
*.DS_Store
+
+#Merge script
+temp.txt
diff --git a/Barotrauma/BarotraumaClient/ClientCode.projitems b/Barotrauma/BarotraumaClient/ClientCode.projitems
index dddac413d..8b57735b9 100644
--- a/Barotrauma/BarotraumaClient/ClientCode.projitems
+++ b/Barotrauma/BarotraumaClient/ClientCode.projitems
@@ -160,6 +160,7 @@
+
diff --git a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs
index 82dea8e96..6509147bc 100644
--- a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs
+++ b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs
@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.9.1.0")]
+[assembly: AssemblyVersion("0.9.200.0")]
[assembly: AssemblyFileVersion("0.9.1.0")]
diff --git a/Barotrauma/BarotraumaClient/Source/Camera.cs b/Barotrauma/BarotraumaClient/Source/Camera.cs
index e16142fe4..fe79671b4 100644
--- a/Barotrauma/BarotraumaClient/Source/Camera.cs
+++ b/Barotrauma/BarotraumaClient/Source/Camera.cs
@@ -1,4 +1,6 @@
-using Microsoft.Xna.Framework;
+using Barotrauma.Networking;
+using Lidgren.Network;
+using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using System;
@@ -171,6 +173,11 @@ namespace Barotrauma
get { return targetPos; }
set { targetPos = value; }
}
+
+ public Vector2 GetPosition()
+ {
+ return position;
+ }
// Auxiliary function to move the camera
public void Translate(Vector2 amount)
@@ -178,6 +185,15 @@ namespace Barotrauma
position += amount;
}
+ public void ClientWrite(NetOutgoingMessage msg)
+ {
+ if (Character.Controlled != null && !Character.Controlled.IsDead) return;
+
+ msg.Write((byte)ClientNetObject.SPECTATING_POS);
+ msg.Write(position.X);
+ msg.Write(position.Y);
+ }
+
private void CreateMatrices()
{
resolution = new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight);
diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs
index 406452aab..5ad1a4063 100644
--- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs
+++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs
@@ -14,6 +14,13 @@ namespace Barotrauma
{
if (this != Controlled)
{
+ if (GameMain.Client.EndCinematic != null) // Freezes the characters during the ending cinematic
+ {
+ AnimController.Frozen = true;
+ memState.Clear();
+ return;
+ }
+
//freeze AI characters if more than 1 seconds have passed since last update from the server
if (lastRecvPositionUpdateTime < NetTime.Now - 1.0f)
{
diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs b/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs
index 846e82d39..af335ceb0 100644
--- a/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs
+++ b/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs
@@ -128,6 +128,7 @@ namespace Barotrauma
}
public WearableSprite HuskSprite { get; private set; }
+ public WearableSprite HerpesSprite { get; private set; }
public void LoadHuskSprite()
{
@@ -139,6 +140,16 @@ namespace Barotrauma
HuskSprite = new WearableSprite(element.Element("sprite"), WearableType.Husk);
}
}
+ public void LoadHerpesSprite()
+ {
+ var info = character.Info;
+ if (info == null) { return; }
+ var element = info.FilterByTypeAndHeadID(character.Info.FilterElementsByGenderAndRace(character.Info.Wearables), WearableType.Herpes).FirstOrDefault();
+ if (element != null)
+ {
+ HerpesSprite = new WearableSprite(element.Element("sprite"), WearableType.Herpes);
+ }
+ }
public float TextureScale => limbParams.Ragdoll.TextureScale;
@@ -387,7 +398,7 @@ namespace Barotrauma
color *= SeveredFadeOutTime - severedFadeOutTimer;
}
}
-
+
body.Dir = Dir;
bool hideLimb = wearingItems.Any(w => w != null && w.HideLimb);
@@ -425,10 +436,20 @@ namespace Barotrauma
SpriteEffects spriteEffect = (dir == Direction.Right) ? SpriteEffects.None : SpriteEffects.FlipHorizontally;
if (onlyDrawable == null)
{
+ if (HerpesSprite != null)
+ {
+ float herpesStrength = character.CharacterHealth.GetAfflictionStrength("spaceherpes");
+ if (herpesStrength > 0.0f)
+ {
+ DrawWearable(HerpesSprite, depthStep, spriteBatch, color * (herpesStrength / 100.0f), spriteEffect);
+ depthStep += 0.000001f;
+ }
+ }
if (HuskSprite != null && (character.SpeciesName == "Humanhusk" || (character.SpeciesName == "Human" &&
character.CharacterHealth.GetAffliction("huskinfection")?.State == AfflictionHusk.InfectionState.Active)))
{
DrawWearable(HuskSprite, depthStep, spriteBatch, color, spriteEffect);
+ depthStep += 0.000001f;
}
foreach (WearableSprite wearable in OtherWearables)
{
@@ -585,6 +606,9 @@ namespace Barotrauma
HuskSprite?.Sprite.Remove();
HuskSprite = null;
+
+ HerpesSprite?.Sprite.Remove();
+ HerpesSprite = null;
}
}
}
diff --git a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs
index 17fc3b0f6..429bb51f2 100644
--- a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs
+++ b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs
@@ -133,17 +133,7 @@ namespace Barotrauma
if (PlayerInput.KeyHit(Keys.F3))
{
- isOpen = !isOpen;
- if (isOpen)
- {
- textBox.Select();
- AddToGUIUpdateList();
- }
- else
- {
- GUI.ForceMouseOn(null);
- textBox.Deselect();
- }
+ Toggle();
}
else if (isOpen && PlayerInput.KeyHit(Keys.Escape))
{
@@ -179,6 +169,21 @@ namespace Barotrauma
}
}
+ public static void Toggle()
+ {
+ isOpen = !isOpen;
+ if (isOpen)
+ {
+ textBox.Select();
+ AddToGUIUpdateList();
+ }
+ else
+ {
+ GUI.ForceMouseOn(null);
+ textBox.Deselect();
+ }
+ }
+
public static void Draw(SpriteBatch spriteBatch)
{
if (!isOpen) return;
@@ -298,9 +303,16 @@ namespace Barotrauma
private static void AssignOnClientExecute(string names, Action onClientExecute)
{
- Command command = commands.First(c => c.names.Intersect(names.Split('|')).Count() > 0);
- command.OnClientExecute = onClientExecute;
- command.RelayToServer = false;
+ Command command = commands.Find(c => c.names.Intersect(names.Split('|')).Count() > 0);
+ if (command == null)
+ {
+ throw new Exception("AssignOnClientExecute failed. Command matching the name(s) \"" + names + "\" not found.");
+ }
+ else
+ {
+ command.OnClientExecute = onClientExecute;
+ command.RelayToServer = false;
+ }
}
private static void AssignRelayToServer(string names, bool relay)
@@ -1797,6 +1809,11 @@ namespace Barotrauma
limb.HuskSprite.Sprite.ReloadXML();
limb.HuskSprite.Sprite.ReloadTexture();
}
+ if (limb.HerpesSprite != null)
+ {
+ limb.HerpesSprite.Sprite.ReloadXML();
+ limb.HerpesSprite.Sprite.ReloadTexture();
+ }
}
}
diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs
index 3418d020e..4585a78d4 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUI.cs
@@ -278,7 +278,7 @@ namespace Barotrauma
Color.White, Color.Black * 0.5f, 0, SmallFont);
DrawString(spriteBatch, new Vector2(10, 40),
- "Bodies: " + GameMain.World.BodyList.Count + " (" + GameMain.World.BodyList.FindAll(b => b.Awake && b.Enabled).Count + " awake)",
+ $"Bodies: {GameMain.World.BodyList.Count} ({GameMain.World.BodyList.FindAll(b => b.Awake && b.Enabled).Count} awake, {GameMain.World.BodyList.FindAll(b => b.Awake && b.BodyType == FarseerPhysics.Dynamics.BodyType.Dynamic && b.Enabled).Count} dynamic)",
Color.White, Color.Black * 0.5f, 0, SmallFont);
if (Screen.Selected.Cam != null)
@@ -1040,6 +1040,8 @@ namespace Barotrauma
public static Texture2D CreateRectangle(int width, int height)
{
+ width = Math.Max(width, 1);
+ height = Math.Max(height, 1);
Color[] data = new Color[width * height];
for (int i = 0; i < data.Length; i++)
@@ -1057,7 +1059,6 @@ namespace Barotrauma
TrySetArray(data, (height - 1) * width + x, Color.White);
}
-
Texture2D texture = null;
CrossThread.RequestExecutionOnMainThread(() =>
{
diff --git a/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs b/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs
index d84e9a2dd..52b571a7c 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs
@@ -178,25 +178,27 @@ namespace Barotrauma
}
else if (DrawLoadingText)
{
- string loadText = "";
- if (LoadState == 100.0f)
+ if (TextManager.Initialized)
{
- loadText = TextManager.Get("PressAnyKey");
- }
- else
- {
- loadText = TextManager.Get("Loading");
- if (LoadState != null)
+ string loadText;
+ if (LoadState == 100.0f)
{
- loadText += " " + (int)LoadState + " %";
+ loadText = TextManager.Get("PressAnyKey");
+ }
+ else
+ {
+ loadText = TextManager.Get("Loading");
+ if (LoadState != null)
+ {
+ loadText += " " + (int)LoadState + " %";
+ }
+ }
+ if (GUI.LargeFont != null)
+ {
+ GUI.LargeFont.DrawString(spriteBatch, loadText.ToUpper(),
+ new Vector2(GameMain.GraphicsWidth / 2.0f - GUI.LargeFont.MeasureString(loadText).X / 2.0f, GameMain.GraphicsHeight * 0.7f),
+ Color.White);
}
- }
-
- if (GUI.LargeFont != null)
- {
- GUI.LargeFont.DrawString(spriteBatch, loadText.ToUpper(),
- new Vector2(GameMain.GraphicsWidth / 2.0f - GUI.LargeFont.MeasureString(loadText).X / 2.0f, GameMain.GraphicsHeight * 0.7f),
- Color.White);
}
if (GUI.Font != null && selectedTip != null)
diff --git a/Barotrauma/BarotraumaClient/Source/GUI/Widget.cs b/Barotrauma/BarotraumaClient/Source/GUI/Widget.cs
index bd4206e00..9fe9ca365 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/Widget.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/Widget.cs
@@ -58,6 +58,8 @@ namespace Barotrauma
public event Action PreDraw;
public event Action PostDraw;
+ public bool RequireMouseOn = true;
+
public Action refresh;
public object data;
@@ -109,7 +111,7 @@ namespace Barotrauma
{
PreUpdate?.Invoke(deltaTime);
if (!enabled) { return; }
- if (IsMouseOver)
+ if (IsMouseOver || (!RequireMouseOn && selectedWidgets.Contains(this) && PlayerInput.LeftButtonHeld()))
{
Hovered?.Invoke();
if ((multiselect && !selectedWidgets.Contains(this)) || selectedWidgets.None())
diff --git a/Barotrauma/BarotraumaClient/Source/GameMain.cs b/Barotrauma/BarotraumaClient/Source/GameMain.cs
index 92e524f18..13fdede06 100644
--- a/Barotrauma/BarotraumaClient/Source/GameMain.cs
+++ b/Barotrauma/BarotraumaClient/Source/GameMain.cs
@@ -404,54 +404,13 @@ namespace Barotrauma
DebugConsole.Log("Selected content packages: " + string.Join(", ", SelectedPackages.Select(cp => cp.Name)));
}
-/*#if DEBUG
+#if DEBUG
GameSettings.ShowUserStatisticsPrompt = false;
GameSettings.SendUserStatistics = false;
-#endif*/
+#endif
InitUserStats();
- yield return CoroutineStatus.Running;
-
- LightManager = new Lights.LightManager(base.GraphicsDevice, Content);
-
- TitleScreen.LoadState = 1.0f;
- yield return CoroutineStatus.Running;
-
- GUI.LoadContent();
- TitleScreen.LoadState = 2.0f;
-
- yield return CoroutineStatus.Running;
-
- MissionPrefab.Init();
- MapEntityPrefab.Init();
- Tutorials.Tutorial.Init();
- MapGenerationParams.Init();
- LevelGenerationParams.LoadPresets();
- ScriptedEventSet.LoadPrefabs();
- AfflictionPrefab.LoadAll(GetFilesOfType(ContentType.Afflictions));
- TitleScreen.LoadState = 10.0f;
- yield return CoroutineStatus.Running;
-
- StructurePrefab.LoadAll(GetFilesOfType(ContentType.Structure));
- TitleScreen.LoadState = 15.0f;
- yield return CoroutineStatus.Running;
-
- ItemPrefab.LoadAll(GetFilesOfType(ContentType.Item));
- TitleScreen.LoadState = 25.0f;
- yield return CoroutineStatus.Running;
-
- JobPrefab.LoadAll(GetFilesOfType(ContentType.Jobs));
- // Add any missing jobs from the prefab into Config.JobNamePreferences.
- foreach (JobPrefab job in JobPrefab.List)
- {
- if (!Config.JobPreferences.Contains(job.Identifier)) { Config.JobPreferences.Add(job.Identifier); }
- }
-
- NPCConversation.LoadAll(GetFilesOfType(ContentType.NPCConversations));
-
- ItemAssemblyPrefab.LoadAll();
- TitleScreen.LoadState = 30.0f;
yield return CoroutineStatus.Running;
Debug.WriteLine("sounds");
@@ -464,55 +423,105 @@ namespace Barotrauma
i++;
TitleScreen.LoadState = SoundPlayer.SoundCount == 0 ?
- 30.0f :
- Math.Min(30.0f + 40.0f * i / Math.Max(SoundPlayer.SoundCount, 1), 70.0f);
+ 1.0f :
+ Math.Min(40.0f * i / Math.Max(SoundPlayer.SoundCount, 1), 40.0f);
yield return CoroutineStatus.Running;
}
- TitleScreen.LoadState = 70.0f;
+ TitleScreen.LoadState = 40.0f;
yield return CoroutineStatus.Running;
+ LightManager = new Lights.LightManager(base.GraphicsDevice, Content);
+
+ TitleScreen.LoadState = 41.0f;
+ yield return CoroutineStatus.Running;
+
+ GUI.LoadContent();
+ TitleScreen.LoadState = 42.0f;
+
+ yield return CoroutineStatus.Running;
+
+ MissionPrefab.Init();
+ MapEntityPrefab.Init();
+ Tutorials.Tutorial.Init();
+ MapGenerationParams.Init();
+ LevelGenerationParams.LoadPresets();
+ ScriptedEventSet.LoadPrefabs();
+ AfflictionPrefab.LoadAll(GetFilesOfType(ContentType.Afflictions));
+ TitleScreen.LoadState = 50.0f;
+ yield return CoroutineStatus.Running;
+
+ StructurePrefab.LoadAll(GetFilesOfType(ContentType.Structure));
+ TitleScreen.LoadState = 53.0f;
+ yield return CoroutineStatus.Running;
+
+ ItemPrefab.LoadAll(GetFilesOfType(ContentType.Item));
+ TitleScreen.LoadState = 55.0f;
+ yield return CoroutineStatus.Running;
+
+ JobPrefab.LoadAll(GetFilesOfType(ContentType.Jobs));
+ // Add any missing jobs from the prefab into Config.JobNamePreferences.
+ foreach (JobPrefab job in JobPrefab.List)
+ {
+ if (!Config.JobPreferences.Contains(job.Identifier)) { Config.JobPreferences.Add(job.Identifier); }
+ }
+
+ NPCConversation.LoadAll(GetFilesOfType(ContentType.NPCConversations));
+
+ ItemAssemblyPrefab.LoadAll();
+ TitleScreen.LoadState = 60.0f;
+ yield return CoroutineStatus.Running;
+
GameModePreset.Init();
Submarine.RefreshSavedSubs();
- TitleScreen.LoadState = 80.0f;
-
+ TitleScreen.LoadState = 65.0f;
yield return CoroutineStatus.Running;
GameScreen = new GameScreen(GraphicsDeviceManager.GraphicsDevice, Content);
- TitleScreen.LoadState = 90.0f;
-
+ TitleScreen.LoadState = 68.0f;
yield return CoroutineStatus.Running;
MainMenuScreen = new MainMenuScreen(this);
LobbyScreen = new LobbyScreen();
ServerListScreen = new ServerListScreen();
+ TitleScreen.LoadState = 70.0f;
+ yield return CoroutineStatus.Running;
+
if (SteamManager.USE_STEAM)
{
SteamWorkshopScreen = new SteamWorkshopScreen();
}
-
SubEditorScreen = new SubEditorScreen();
+
+ TitleScreen.LoadState = 75.0f;
+ yield return CoroutineStatus.Running;
+
ParticleEditorScreen = new ParticleEditorScreen();
+
+ TitleScreen.LoadState = 80.0f;
+ yield return CoroutineStatus.Running;
+
LevelEditorScreen = new LevelEditorScreen();
SpriteEditorScreen = new SpriteEditorScreen();
CharacterEditorScreen = new CharacterEditorScreen();
yield return CoroutineStatus.Running;
- TitleScreen.LoadState = 95.0f;
+ TitleScreen.LoadState = 85.0f;
ParticleManager = new ParticleManager(GameScreen.Cam);
ParticleManager.LoadPrefabs();
- TitleScreen.LoadState = 97.0f;
+ TitleScreen.LoadState = 88.0f;
LevelObjectPrefab.LoadAll();
- DecalManager = new DecalManager();
- TitleScreen.LoadState = 99.0f;
+
+ TitleScreen.LoadState = 90.0f;
yield return CoroutineStatus.Running;
+ DecalManager = new DecalManager();
LocationType.Init();
MainMenuScreen.Select();
@@ -634,6 +643,7 @@ namespace Barotrauma
PlayerInput.Update(Timing.Step);
+
if (loadingScreenOpen)
{
//reset accumulator if loading
@@ -641,6 +651,11 @@ namespace Barotrauma
// -> no pause caused by leftover time in the accumulator when starting a new shift
GameMain.ResetFrameTime();
+ if (!TitleScreen.PlayingSplashScreen)
+ {
+ SoundPlayer.Update((float)Timing.Step);
+ }
+
if (TitleScreen.LoadState >= 100.0f && !TitleScreen.PlayingSplashScreen &&
(!waitForKeyHit || ((PlayerInput.GetKeyboardState.GetPressedKeys().Length > 0 || PlayerInput.LeftButtonClicked()) && WindowActive)))
{
diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
index 647871bfa..ab40ee75f 100644
--- a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
+++ b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
@@ -455,10 +455,14 @@ namespace Barotrauma
isHorizontal: true, childAnchor: Anchor.CenterLeft)
{
AbsoluteSpacing = (int)(10 * GUI.Scale),
- UserData = "orderbuttons",
- CanBeFocused = false
+ UserData = "orderbuttons"
};
+ var spacer = new GUIFrame(new RectTransform(new Point(spacing, orderButtonFrame.Rect.Height), frame.RectTransform)
+ {
+ AbsoluteOffset = new Point(characterInfoWidth, 0)
+ });
+
//listbox for holding the orders inappropriate for this character
//(so we can easily toggle their visibility)
var wrongOrderList = new GUIListBox(new RectTransform(new Point(50, orderButtonFrame.Rect.Height), orderButtonFrame.RectTransform), isHorizontal: true, style: null)
diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/MechanicTutorial.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/MechanicTutorial.cs
index 7eebb036c..4b04bd01e 100644
--- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/MechanicTutorial.cs
+++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/Tutorials/MechanicTutorial.cs
@@ -32,7 +32,6 @@ namespace Barotrauma.Tutorials
private LightComponent mechanic_thirdDoorLight;
private Structure mechanic_brokenWall_1;
private Hull mechanic_brokenhull_1;
- private MotionSensor mechanic_ladderSensor;
// Room 4
private MotionSensor mechanic_craftingObjectiveSensor;
diff --git a/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs b/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs
index b79bd9c75..0acf7811a 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs
@@ -752,11 +752,11 @@ namespace Barotrauma
character.SelectedBy.Inventory != null)
{
//item is in the inventory of another character -> attempt to get the item from there
- success = character.SelectedBy.Inventory.TryPutItem(item, Character.Controlled, item.AllowedSlots, true);
+ success = character.SelectedBy.Inventory.TryPutItemWithAutoEquipCheck(item, Character.Controlled, item.AllowedSlots, true);
}
break;
case QuickUseAction.TakeFromContainer:
- success = TryPutItem(item, Character.Controlled, item.AllowedSlots, true);
+ success = TryPutItemWithAutoEquipCheck(item, Character.Controlled, item.AllowedSlots, true);
break;
}
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs
index 24571071e..e624d8ab5 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs
@@ -182,7 +182,7 @@ namespace Barotrauma.Items.Components
}
- partial void SetState(bool open, bool isNetworkMessage, bool sendNetworkMessage)
+ partial void SetState(bool open, bool isNetworkMessage, bool sendNetworkMessage, bool forcedOpen)
{
if (isStuck ||
(PredictedState == null && isOpen == open) ||
@@ -200,12 +200,16 @@ namespace Barotrauma.Items.Components
//sent by the server, or reverting it back to its old state if no msg from server was received
PredictedState = open;
resetPredictionTimer = CorrectionDelay;
- if (stateChanged) PlaySound(ActionType.OnUse, item.WorldPosition);
+ if (stateChanged) PlaySound(forcedOpen ? ActionType.OnPicked : ActionType.OnUse, item.WorldPosition);
}
else
{
isOpen = open;
- if (!isNetworkMessage || open != PredictedState) PlaySound(ActionType.OnUse, item.WorldPosition);
+ if (!isNetworkMessage || open != PredictedState)
+ {
+ StopPicking(null);
+ PlaySound(forcedOpen ? ActionType.OnPicked : ActionType.OnUse, item.WorldPosition);
+ }
}
//opening a partially stuck door makes it less stuck
@@ -217,7 +221,9 @@ namespace Barotrauma.Items.Components
{
base.ClientRead(type, msg, sendingTime);
- SetState(msg.ReadBoolean(), isNetworkMessage: true, sendNetworkMessage: false);
+ bool open = msg.ReadBoolean();
+ bool forcedOpen = msg.ReadBoolean();
+ SetState(open, isNetworkMessage: true, sendNetworkMessage: false, forcedOpen: forcedOpen);
Stuck = msg.ReadRangedSingle(0.0f, 100.0f, 8);
PredictedState = null;
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs
index c5ecaf754..3ff365527 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs
@@ -291,16 +291,16 @@ namespace Barotrauma.Items.Components
else
{
float volume = GetSoundVolume(itemSound);
- if (volume <= 0.0f) return;
+ if (volume <= 0.0f) { return; }
SoundPlayer.PlaySound(itemSound.RoundSound.Sound, position, volume, itemSound.Range, item.CurrentHull);
}
}
public void StopSounds(ActionType type)
{
- if (loopingSound == null) return;
+ if (loopingSound == null) { return; }
- if (loopingSound.Type != type) return;
+ if (loopingSound.Type != type) { return; }
if (loopingSoundChannel != null)
{
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/MiniMap.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/MiniMap.cs
index d1f6f9ad4..a6d4c56d4 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/MiniMap.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/MiniMap.cs
@@ -25,12 +25,12 @@ namespace Barotrauma.Items.Components
{
noPowerTip = TextManager.Get("SteeringNoPowerTip");
- GuiFrame.RectTransform.RelativeOffset = new Vector2(0.4f, 0.0f);
- new GUICustomComponent(new RectTransform(new Vector2(0.9f, 0.85f), GuiFrame.RectTransform, Anchor.Center),
+ GuiFrame.RectTransform.RelativeOffset = new Vector2(0.05f, 0.0f);
+ new GUICustomComponent(new RectTransform(new Vector2(0.95f, 0.9f), GuiFrame.RectTransform, Anchor.Center),
DrawHUDBack, null);
- submarineContainer = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.85f), GuiFrame.RectTransform, Anchor.Center), style: null);
+ submarineContainer = new GUIFrame(new RectTransform(new Vector2(0.95f, 0.9f), GuiFrame.RectTransform, Anchor.Center), style: null);
- new GUICustomComponent(new RectTransform(new Vector2(0.9f, 0.85f), GuiFrame.RectTransform, Anchor.Center),
+ new GUICustomComponent(new RectTransform(new Vector2(0.95f, 0.9f), GuiFrame.RectTransform, Anchor.Center),
DrawHUDFront, null)
{
CanBeFocused = false
@@ -179,11 +179,21 @@ namespace Barotrauma.Items.Components
GetLinkedHulls(hull, hullData.LinkedHulls);
hullDatas.Add(hull, hullData);
}
+
+ Color neutralColor = Color.DarkCyan;
+ if (hull.RoomName != null)
+ {
+ if (hull.RoomName.Contains("ballast") || hull.RoomName.Contains("Ballast") ||
+ hull.RoomName.Contains("airlock") || hull.RoomName.Contains("Airlock"))
+ {
+ neutralColor = new Color(9, 80, 159);
+ }
+ }
if (hullData.Distort)
{
hullFrame.Children.First().Color = Color.Lerp(Color.Black, Color.DarkGray * 0.5f, Rand.Range(0.0f, 1.0f));
- hullFrame.Color = Color.DarkGray * 0.5f;
+ hullFrame.Color = neutralColor * 0.5f;
continue;
}
@@ -192,20 +202,23 @@ namespace Barotrauma.Items.Components
hullFrame.Parent.Rect.Width / (float)hull.Submarine.Borders.Width,
hullFrame.Parent.Rect.Height / (float)hull.Submarine.Borders.Height);
- Color borderColor = Color.DarkCyan;
+ Color borderColor = neutralColor;
float? gapOpenSum = 0.0f;
if (ShowHullIntegrity)
{
gapOpenSum = hull.ConnectedGaps.Where(g => !g.IsRoomToRoom).Sum(g => g.Open);
- borderColor = Color.Lerp(Color.DarkCyan, Color.Red, Math.Min((float)gapOpenSum, 1.0f));
+ borderColor = Color.Lerp(neutralColor, Color.Red, Math.Min((float)gapOpenSum, 1.0f));
}
float? oxygenAmount = null;
if (!RequireOxygenDetectors || hullData?.Oxygen != null)
{
oxygenAmount = RequireOxygenDetectors ? hullData.Oxygen : hull.OxygenPercentage;
- GUI.DrawRectangle(spriteBatch, hullFrame.Rect, Color.Lerp(Color.Red * 0.5f, Color.Green * 0.3f, (float)oxygenAmount / 100.0f), true);
+ GUI.DrawRectangle(
+ spriteBatch, hullFrame.Rect,
+ Color.Lerp(Color.Red * 0.5f, Color.Green * 0.3f, (float)oxygenAmount / 100.0f),
+ true);
}
float? waterAmount = null;
@@ -234,7 +247,7 @@ namespace Barotrauma.Items.Components
}
else
{
- hullFrame.Children.First().Color = Color.DarkCyan * 0.8f;
+ hullFrame.Children.First().Color = neutralColor * 0.8f;
}
if (mouseOnHull == hull)
@@ -291,8 +304,6 @@ namespace Barotrauma.Items.Components
GUI.DrawLine(spriteBatch, center + start, center + end, Color.DarkCyan * Rand.Range(0.3f, 0.35f), width: (int)(10 * GUI.Scale));
}
}
-
-
}
private void GetLinkedHulls(Hull hull, List linkedHulls)
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs
index b361c951f..dcaff5bb2 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs
@@ -58,6 +58,10 @@ namespace Barotrauma.Items.Components
private GUIFrame inventoryContainer;
private GUIComponent leftHUDColumn;
+ private GUIComponent midHUDColumn;
+ private GUIComponent rightHUDColumn;
+
+ private GUILayoutGroup sliderControlsContainer;
private Dictionary warningButtons = new Dictionary();
@@ -107,11 +111,13 @@ namespace Barotrauma.Items.Components
RelativeSpacing = 0.012f,
Stretch = true
};
-
+
GUIFrame columnLeft = new GUIFrame(new RectTransform(new Vector2(0.25f, 1.0f), paddedFrame.RectTransform), style: null);
- leftHUDColumn = columnLeft;
GUIFrame columnMid = new GUIFrame(new RectTransform(new Vector2(0.45f, 1.0f), paddedFrame.RectTransform), style: null);
GUIFrame columnRight = new GUIFrame(new RectTransform(new Vector2(0.3f, 1.0f), paddedFrame.RectTransform), style: null);
+ leftHUDColumn = columnLeft;
+ midHUDColumn = columnMid;
+ rightHUDColumn = columnRight;
//----------------------------------------------------------
//left column
@@ -180,9 +186,16 @@ namespace Barotrauma.Items.Components
ToolTip = TextManager.Get("ReactorTipTurbineOutput")
};
- new GUITextBlock(new RectTransform(new Point(0, (int)(20 * GUI.Scale)), columnMid.RectTransform, Anchor.BottomLeft) { AbsoluteOffset = new Point(0, (int)(90 * GUI.Scale)) },
+ GUILayoutGroup sliderControls = new GUILayoutGroup(new RectTransform(new Point(columnMid.Rect.Width, (int)(114 * GUI.Scale)), columnMid.RectTransform, Anchor.BottomCenter))
+ {
+ Stretch = true,
+ AbsoluteSpacing = (int)(5 * GUI.Scale)
+ };
+ sliderControlsContainer = sliderControls;
+
+ new GUITextBlock(new RectTransform(new Point(0, (int)(20 * GUI.Scale)), sliderControls.RectTransform, Anchor.TopLeft),
TextManager.Get("ReactorFissionRate"));
- fissionRateScrollBar = new GUIScrollBar(new RectTransform(new Point(columnMid.Rect.Width, (int)(30 * GUI.Scale)), columnMid.RectTransform, Anchor.BottomCenter) { AbsoluteOffset = new Point(0, (int)(60 * GUI.Scale)) },
+ fissionRateScrollBar = new GUIScrollBar(new RectTransform(new Point(sliderControls.Rect.Width, (int)(30 * GUI.Scale)), sliderControls.RectTransform, Anchor.TopCenter),
style: "GUISlider", barSize: 0.1f)
{
OnMoved = (GUIScrollBar bar, float scrollAmount) =>
@@ -194,10 +207,10 @@ namespace Barotrauma.Items.Components
return false;
}
};
-
- new GUITextBlock(new RectTransform(new Point(0, (int)(20 * GUI.Scale)), columnMid.RectTransform, Anchor.BottomLeft) { AbsoluteOffset = new Point(0, (int)(30 * GUI.Scale)) },
+
+ new GUITextBlock(new RectTransform(new Point(0, (int)(20 * GUI.Scale)), sliderControls.RectTransform, Anchor.BottomLeft),
TextManager.Get("ReactorTurbineOutput"));
- turbineOutputScrollBar = new GUIScrollBar(new RectTransform(new Point(columnMid.Rect.Width, (int)(30 * GUI.Scale)), columnMid.RectTransform, Anchor.BottomCenter),
+ turbineOutputScrollBar = new GUIScrollBar(new RectTransform(new Point(sliderControls.Rect.Width, (int)(30 * GUI.Scale)), sliderControls.RectTransform, Anchor.BottomCenter),
style: "GUISlider", barSize: 0.1f, isHorizontal: true)
{
OnMoved = (GUIScrollBar bar, float scrollAmount) =>
@@ -263,11 +276,11 @@ namespace Barotrauma.Items.Components
"Load", textColor: Color.LightBlue, textAlignment: Alignment.CenterLeft)
{
ToolTip = TextManager.Get("ReactorTipLoad")
- };
+ };
string loadStr = TextManager.Get("ReactorLoad");
loadText.TextGetter += () => { return loadStr.Replace("[kw]", ((int)load).ToString()); };
- var outputText = new GUITextBlock(new RectTransform(textSize, graphArea.RectTransform, Anchor.BottomLeft, Pivot.TopLeft),
+ var outputText = new GUITextBlock(new RectTransform(textSize, graphArea.RectTransform, Anchor.BottomLeft, Pivot.TopLeft),
"Output", textColor: Color.LightGreen, textAlignment: Alignment.CenterLeft)
{
ToolTip = TextManager.Get("ReactorTipPower")
@@ -321,9 +334,9 @@ namespace Barotrauma.Items.Components
if (temperature > optimalTemperature.Y)
{
- GUI.DrawRectangle(spriteBatch,
- new Vector2(graphArea.X - 30, graphArea.Y),
- new Vector2(tempMeterFrame.SourceRect.Width, (graphArea.Bottom - graphArea.Height * optimalTemperature.Y / 100.0f) - graphArea.Y),
+ GUI.DrawRectangle(spriteBatch,
+ new Vector2(graphArea.X - 30, graphArea.Y),
+ new Vector2(tempMeterFrame.SourceRect.Width, (graphArea.Bottom - graphArea.Height * optimalTemperature.Y / 100.0f) - graphArea.Y),
Color.Red * (float)Math.Sin(Timing.TotalTime * 5.0f) * 0.7f, isFilled: true);
}
if (temperature < optimalTemperature.X)
@@ -415,15 +428,52 @@ namespace Barotrauma.Items.Components
warningButtons["ReactorWarningLowFuel"].Selected = prevAvailableFuel < fissionRate && lightOn;
warningButtons["ReactorWarningMeltdown"].Selected = meltDownTimer > MeltdownDelay * 0.5f || item.Condition == 0.0f && lightOn;
warningButtons["ReactorWarningSCRAM"].Selected = temperature > 0.1f && onOffSwitch.BarScroll > 0.5f;
-
+
AutoTemp = autoTempSlider.BarScroll < 0.5f;
shutDown = onOffSwitch.BarScroll > 0.5f;
+ if ((sliderControlsContainer.Rect.Contains(PlayerInput.MousePosition) || sliderControlsContainer.Children.Contains(GUIScrollBar.draggingBar)) &&
+ !PlayerInput.KeyDown(InputType.Deselect) && !PlayerInput.KeyHit(InputType.Deselect))
+ {
+ Character.DisableControls = true;
+ }
+
if (shutDown)
{
fissionRateScrollBar.BarScroll = FissionRate / 100.0f;
turbineOutputScrollBar.BarScroll = TurbineOutput / 100.0f;
- }
+ }
+ else if (!autoTemp && Character.DisableControls && GUI.KeyboardDispatcher.Subscriber == null)
+ {
+ Vector2 input = Vector2.Zero;
+ float rate = 50.0f; //percentage per second
+
+ if (PlayerInput.KeyDown(InputType.Left)) input.X += -1.0f;
+ if (PlayerInput.KeyDown(InputType.Right)) input.X += 1.0f;
+ if (PlayerInput.KeyDown(InputType.Up)) input.Y += 1.0f;
+ if (PlayerInput.KeyDown(InputType.Down)) input.Y += -1.0f;
+ if (PlayerInput.KeyDown(InputType.Run)) rate = 200.0f;
+
+ rate *= deltaTime;
+ input.X *= rate;
+ input.Y *= rate;
+
+ if (input.LengthSquared() > 0)
+ {
+ LastUser = Character.Controlled;
+ unsentChanges = true;
+ if (input.X != 0.0f && GUIScrollBar.draggingBar != fissionRateScrollBar)
+ {
+ targetFissionRate = MathHelper.Clamp(targetFissionRate + input.X, 0.0f, 100.0f);
+ fissionRateScrollBar.BarScroll += input.X / 100.0f;
+ }
+ if (input.Y != 0.0f && GUIScrollBar.draggingBar != turbineOutputScrollBar)
+ {
+ targetTurbineOutput = MathHelper.Clamp(targetTurbineOutput + input.Y, 0.0f, 100.0f);
+ turbineOutputScrollBar.BarScroll += input.Y / 100.0f;
+ }
+ }
+ }
}
private bool ToggleAutoTemp(GUITickBox tickBox)
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs
index 4b9fe65a0..105536133 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Sonar.cs
@@ -11,12 +11,6 @@ namespace Barotrauma.Items.Components
{
partial class Sonar : Powered, IServerSerializable, IClientSerializable
{
- enum Mode
- {
- Active,
- Passive
- };
-
private bool dynamicDockingIndicator = true;
private bool unsentChanges;
@@ -43,8 +37,6 @@ namespace Barotrauma.Items.Components
private List sonarBlips;
- private float prevPingRadius;
-
private float prevPassivePingRadius;
private Vector2 center;
@@ -102,7 +94,7 @@ namespace Barotrauma.Items.Components
ToolTip = TextManager.Get("SonarTipActive"),
OnSelected = (GUITickBox box) =>
{
- IsActive = box.Selected;
+ CurrentMode = box.Selected ? Mode.Active : Mode.Passive;
if (GameMain.Client != null)
{
unsentChanges = true;
@@ -262,7 +254,7 @@ namespace Barotrauma.Items.Components
{
if (component is GUITextBlock textBlock)
{
- textBlock.TextColor = IsActive ? textBlock.Style.textColor : textBlock.Style.textColor * 0.5f;
+ textBlock.TextColor = currentMode == Mode.Active ? textBlock.Style.textColor : textBlock.Style.textColor * 0.5f;
}
}
@@ -281,14 +273,21 @@ namespace Barotrauma.Items.Components
if (Level.Loaded != null)
{
Dictionary levelTriggerFlows = new Dictionary();
- foreach (LevelObject levelObject in Level.Loaded.LevelObjectManager.GetAllObjects(transducerCenter, range * pingState / zoom))
+ for (var pingIndex = 0; pingIndex < activePingsCount; ++pingIndex)
{
- //gather all nearby triggers that are causing the water to flow into the dictionary
- foreach (LevelTrigger trigger in levelObject.Triggers)
+ var activePing = activePings[pingIndex];
+ foreach (LevelObject levelObject in Level.Loaded.LevelObjectManager.GetAllObjects(transducerCenter, range * activePing.State / zoom))
{
- Vector2 flow = trigger.GetWaterFlowVelocity();
- //ignore ones that are barely doing anything (flow^2 < 1)
- if (flow.LengthSquared() > 1.0f) levelTriggerFlows.Add(trigger, flow);
+ //gather all nearby triggers that are causing the water to flow into the dictionary
+ foreach (LevelTrigger trigger in levelObject.Triggers)
+ {
+ Vector2 flow = trigger.GetWaterFlowVelocity();
+ //ignore ones that are barely doing anything (flow^2 < 1)
+ if (flow.LengthSquared() > 1.0f && !levelTriggerFlows.ContainsKey(trigger))
+ {
+ levelTriggerFlows.Add(trigger, flow);
+ }
+ }
}
}
@@ -350,13 +349,18 @@ namespace Barotrauma.Items.Components
prevDockingDist = float.MaxValue;
}
- if (IsActive)
+ for (var pingIndex = 0; pingIndex < activePingsCount; ++pingIndex)
+ {
+ var activePing = activePings[pingIndex];
+ float pingRadius = DisplayRadius * activePing.State / zoom;
+ UpdateDisruptions(transducerCenter, pingRadius / displayScale, activePing.PrevPingRadius / displayScale);
+ Ping(transducerCenter, transducerCenter,
+ pingRadius, activePing.PrevPingRadius, displayScale, range / zoom, passive: false, pingStrength: 2.0f);
+ activePing.PrevPingRadius = pingRadius;
+
+ }
+ if (currentMode == Mode.Active && currentPingIndex != -1)
{
- float pingRadius = DisplayRadius * pingState / zoom;
- UpdateDisruptions(transducerCenter, pingRadius / displayScale, prevPingRadius / displayScale);
- Ping(transducerCenter, transducerCenter,
- pingRadius, prevPingRadius, displayScale, range / zoom, passive: false, pingStrength: 2.0f);
- prevPingRadius = pingRadius;
return;
}
@@ -396,17 +400,18 @@ namespace Barotrauma.Items.Components
screenBackground.Draw(spriteBatch, center, 0.0f, rect.Width / screenBackground.size.X);
}
- if (IsActive)
+ if (currentMode == Mode.Active && currentPingIndex != -1)
{
- if (isLastPingDirectional && directionalPingCircle != null)
+ var activePing = activePings[currentPingIndex];
+ if (activePing.IsDirectional && directionalPingCircle != null)
{
- directionalPingCircle.Draw(spriteBatch, center, Color.White * (1.0f - pingState),
- rotate: MathUtils.VectorToAngle(lastPingDirection),
- scale: (DisplayRadius / directionalPingCircle.size.X) * pingState);
+ directionalPingCircle.Draw(spriteBatch, center, Color.White * (1.0f - activePing.State),
+ rotate: MathUtils.VectorToAngle(activePing.Direction),
+ scale: (DisplayRadius / directionalPingCircle.size.X) * activePing.State);
}
else
{
- pingCircle.Draw(spriteBatch, center, Color.White * (1.0f - pingState), 0.0f, (DisplayRadius * 2 / pingCircle.size.X) * pingState);
+ pingCircle.Draw(spriteBatch, center, Color.White * (1.0f - activePing.State), 0.0f, (DisplayRadius * 2 / pingCircle.size.X) * activePing.State);
}
}
@@ -448,7 +453,7 @@ namespace Barotrauma.Items.Components
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
}
- float directionalPingVisibility = useDirectionalPing && IsActive ? 1.0f : showDirectionalIndicatorTimer;
+ float directionalPingVisibility = useDirectionalPing && currentMode == Mode.Active ? 1.0f : showDirectionalIndicatorTimer;
if (directionalPingVisibility > 0.0f)
{
Vector2 sector1 = MathUtils.RotatePointAroundTarget(pingDirection * DisplayRadius, Vector2.Zero, DirectionalPingSector * 0.5f);
@@ -753,24 +758,47 @@ namespace Barotrauma.Items.Components
disruptedDirections.Clear();
if (Level.Loaded == null) { return; }
- foreach (LevelObject levelObject in Level.Loaded.LevelObjectManager.GetAllObjects(pingSource, range * pingState))
+ for (var pingIndex = 0; pingIndex < activePingsCount; ++pingIndex)
{
- if (levelObject.ActivePrefab?.SonarDisruption <= 0.0f) { continue; }
-
- float disruptionStrength = levelObject.ActivePrefab.SonarDisruption;
- Vector2 disruptionPos = new Vector2(levelObject.Position.X, levelObject.Position.Y);
-
- float disruptionDist = Vector2.Distance(pingSource, disruptionPos);
- disruptedDirections.Add(new Pair((disruptionPos - pingSource) / disruptionDist, disruptionStrength));
-
- if (disruptionDist > worldPrevPingRadius && disruptionDist <= worldPingRadius)
+ var activePing = activePings[pingIndex];
+ foreach (LevelObject levelObject in Level.Loaded.LevelObjectManager.GetAllObjects(pingSource, range * activePing.State))
{
- for (int i = 0; i < disruptionStrength * Level.GridCellSize * 0.02f; i++)
+ if (levelObject.ActivePrefab?.SonarDisruption <= 0.0f) { continue; }
+
+ float disruptionStrength = levelObject.ActivePrefab.SonarDisruption;
+ Vector2 disruptionPos = new Vector2(levelObject.Position.X, levelObject.Position.Y);
+
+ float disruptionDist = Vector2.Distance(pingSource, disruptionPos);
+ disruptedDirections.Add(new Pair((disruptionPos - pingSource) / disruptionDist, disruptionStrength));
+
+ if (disruptionDist > worldPrevPingRadius && disruptionDist <= worldPingRadius)
{
- var blip = new SonarBlip(disruptionPos + Rand.Vector(Rand.Range(0.0f, Level.GridCellSize * 4 * disruptionStrength)), MathHelper.Lerp(1.0f, 1.5f, disruptionStrength), Rand.Range(1.0f, 2.0f + disruptionStrength));
- sonarBlips.Add(blip);
+ CreateBlipsForDisruption(disruptionPos, disruptionStrength);
}
}
+ foreach (AITarget aiTarget in AITarget.List)
+ {
+ if (aiTarget.SonarDisruption <= 0.0f || !aiTarget.Enabled) { continue; }
+ float distSqr = Vector2.DistanceSquared(aiTarget.WorldPosition, pingSource);
+ if (distSqr > worldPingRadiusSqr) { continue; }
+
+ float disruptionDist = (float)Math.Sqrt(distSqr);
+ disruptedDirections.Add(new Pair((aiTarget.WorldPosition - pingSource) / disruptionDist, aiTarget.SonarDisruption));
+
+ if (disruptionDist > worldPrevPingRadius && disruptionDist <= worldPingRadius)
+ {
+ CreateBlipsForDisruption(aiTarget.WorldPosition, aiTarget.SonarDisruption);
+ }
+ }
+ }
+
+ void CreateBlipsForDisruption(Vector2 disruptionPos, float disruptionStrength)
+ {
+ for (int i = 0; i < disruptionStrength * Level.GridCellSize * 0.02f; i++)
+ {
+ var blip = new SonarBlip(disruptionPos + Rand.Vector(Rand.Range(0.0f, Level.GridCellSize * 4 * disruptionStrength)), MathHelper.Lerp(1.0f, 1.5f, disruptionStrength), Rand.Range(1.0f, 2.0f + disruptionStrength));
+ sonarBlips.Add(blip);
+ }
}
}
@@ -1045,9 +1073,9 @@ namespace Barotrauma.Items.Components
}
Vector2 dir = pos / (float)Math.Sqrt(posDistSqr);
- if (isLastPingDirectional)
+ if (currentPingIndex != -1 && activePings[currentPingIndex].IsDirectional)
{
- if (Vector2.Dot(lastPingDirection, dir) < DirectionalPingDotProduct)
+ if (Vector2.Dot(activePings[currentPingIndex].Direction, dir) < DirectionalPingDotProduct)
{
blip.FadeTimer = 0.0f;
return false;
@@ -1155,8 +1183,8 @@ namespace Barotrauma.Items.Components
public void ClientWrite(Lidgren.Network.NetBuffer msg, object[] extraData = null)
{
- msg.Write(IsActive);
- if (IsActive)
+ msg.Write(currentMode == Mode.Active);
+ if (currentMode == Mode.Active)
{
msg.WriteRangedSingle(zoom, MinZoom, MaxZoom, 8);
msg.Write(useDirectionalPing);
@@ -1192,8 +1220,8 @@ namespace Barotrauma.Items.Components
StartDelayedCorrection(type, msg.ExtractBits(msgLength), sendingTime);
return;
}
-
- IsActive = isActive;
+
+ CurrentMode = isActive ? Mode.Active : Mode.Passive;
if (isActive)
{
activeTickBox.Selected = true;
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Steering.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Steering.cs
index 0f57fa4da..caec0c63e 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Steering.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Steering.cs
@@ -735,9 +735,7 @@ namespace Barotrauma.Items.Components
if (sourcePort.Docked || sourcePort.Item.Submarine == null) { continue; }
if (sourcePort.Item.Submarine != controlledSub) { continue; }
- int sourceDir = sourcePort.IsHorizontal ?
- Math.Sign(sourcePort.Item.WorldPosition.X - sourcePort.Item.Submarine.WorldPosition.X) :
- Math.Sign(sourcePort.Item.WorldPosition.Y - sourcePort.Item.Submarine.WorldPosition.Y);
+ int sourceDir = sourcePort.GetDir();
foreach (DockingPort targetPort in DockingPort.List)
{
@@ -745,9 +743,7 @@ namespace Barotrauma.Items.Components
if (targetPort.Item.Submarine == controlledSub || targetPort.IsHorizontal != sourcePort.IsHorizontal) { continue; }
if (Level.Loaded != null && targetPort.Item.Submarine.WorldPosition.Y > Level.Loaded.Size.Y) { continue; }
- int targetDir = targetPort.IsHorizontal ?
- Math.Sign(targetPort.Item.WorldPosition.X - targetPort.Item.Submarine.WorldPosition.X) :
- Math.Sign(targetPort.Item.WorldPosition.Y - targetPort.Item.Submarine.WorldPosition.Y);
+ int targetDir = targetPort.GetDir();
if (sourceDir == targetDir) { continue; }
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Power/Powered.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Power/Powered.cs
index c92d0aec9..acf4b27c2 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Power/Powered.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Power/Powered.cs
@@ -1,19 +1,16 @@
-using System.Collections.Generic;
+using Barotrauma.Sounds;
+using System.Collections.Generic;
using System.Xml.Linq;
-using Barotrauma.Sounds;
namespace Barotrauma.Items.Components
{
partial class Powered : ItemComponent
{
- protected List sparkSounds;
-
private RoundSound powerOnSound;
private bool powerOnSoundPlayed;
partial void InitProjectSpecific(XElement element)
{
- sparkSounds = new List();
foreach (XElement subElement in element.Elements())
{
switch (subElement.Name.ToString().ToLowerInvariant())
@@ -21,10 +18,6 @@ namespace Barotrauma.Items.Components
case "poweronsound":
powerOnSound = Submarine.LoadRoundSound(subElement, false);
break;
- case "sparksound":
- var sparkSound = Submarine.LoadRoundSound(subElement, false);
- if (sparkSound != null) { sparkSounds.Add(sparkSound); }
- break;
}
}
}
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/RepairTool.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/RepairTool.cs
index f8f82df50..8c65373b2 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/RepairTool.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/RepairTool.cs
@@ -32,6 +32,8 @@ namespace Barotrauma.Items.Components
private List ParticleEmitterHitCharacter = new List();
private List> ParticleEmitterHitItem = new List>();
+ private float prevProgressBarState;
+
partial void InitProjSpecific(XElement element)
{
foreach (XElement subElement in element.Elements())
@@ -70,7 +72,7 @@ namespace Barotrauma.Items.Components
float particleAngle = item.body.Rotation + ((item.body.Dir > 0.0f) ? 0.0f : MathHelper.Pi);
ParticleEmitter.Emit(
deltaTime, item.WorldPosition + TransformedBarrelPos,
- item.CurrentHull, particleAngle, -particleAngle);
+ item.CurrentHull, particleAngle, ParticleEmitter.Prefab.CopyEntityAngle ? -particleAngle : 0);
}
}
@@ -110,19 +112,22 @@ namespace Barotrauma.Items.Components
}
}
- partial void FixItemProjSpecific(Character user, float deltaTime, Item targetItem, float prevCondition)
+ partial void FixItemProjSpecific(Character user, float deltaTime, Item targetItem)
{
- if (prevCondition != targetItem.Condition)
+ float progressBarState = targetItem.ConditionPercentage / 100.0f;
+ if (!MathUtils.NearlyEqual(progressBarState, prevProgressBarState))
{
Vector2 progressBarPos = targetItem.DrawPosition;
var progressBar = user.UpdateHUDProgressBar(
targetItem,
progressBarPos,
- targetItem.Condition / item.MaxCondition,
+ progressBarState,
Color.Red, Color.Green);
if (progressBar != null) { progressBar.Size = new Vector2(60.0f, 20.0f); }
}
+ prevProgressBarState = progressBarState;
+
Vector2 particlePos = ConvertUnits.ToDisplayUnits(pickedPosition);
if (targetItem.Submarine != null) particlePos += targetItem.Submarine.DrawPosition;
foreach (var emitter in ParticleEmitterHitItem)
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs
index ba5580dc7..ba26adbd4 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs
@@ -74,10 +74,16 @@ namespace Barotrauma.Items.Components
//dropped or dragged from the panel to the players inventory
if (draggingConnected != null)
{
- int linkIndex = c.FindWireIndex(draggingConnected.Item);
- if (linkIndex > -1)
+ //the wire can only be dragged out if it's not connected to anything at the other end
+ if (Screen.Selected == GameMain.SubEditorScreen ||
+ (draggingConnected.Connections[0] == null && draggingConnected.Connections[1] == null) ||
+ (draggingConnected.Connections.Contains(c) && draggingConnected.Connections.Contains(null)))
{
- Inventory.draggingItem = c.wires[linkIndex].Item;
+ int linkIndex = c.FindWireIndex(draggingConnected.Item);
+ if (linkIndex > -1 || panel.DisconnectedWires.Contains(draggingConnected))
+ {
+ Inventory.draggingItem = draggingConnected.Item;
+ }
}
}
@@ -109,59 +115,79 @@ namespace Barotrauma.Items.Components
if (draggingConnected != null)
{
- DrawWire(spriteBatch, draggingConnected, draggingConnected.Item, PlayerInput.MousePosition, new Vector2(x + width / 2, y + height - 10), mouseInRect, null, panel, "");
+ if (mouseInRect)
+ {
+ DrawWire(spriteBatch, draggingConnected, PlayerInput.MousePosition, new Vector2(x + width / 2, y + height - 10), null, panel, "");
+ }
if (!PlayerInput.LeftButtonHeld())
{
- if (GameMain.Client != null)
+ if (draggingConnected.Connections[0]?.ConnectionPanel == panel ||
+ draggingConnected.Connections[1]?.ConnectionPanel == panel)
{
- panel.Item.CreateClientEvent(panel);
+ draggingConnected.RemoveConnection(panel.Item);
+ panel.DisconnectedWires.Add(draggingConnected);
}
+ if (GameMain.Client != null) { panel.Item.CreateClientEvent(panel); }
draggingConnected = null;
}
}
//if the Character using the panel has a wire item equipped
//and the wire hasn't been connected yet, draw it on the panel
- if (equippedWire != null)
+ if (equippedWire != null && (draggingConnected != equippedWire || !mouseInRect))
{
if (panel.Connections.Find(c => c.Wires.Contains(equippedWire)) == null)
{
- DrawWire(spriteBatch, equippedWire, equippedWire.Item,
- new Vector2(x + width / 2, y + height - 100),
- new Vector2(x + width / 2, y + height), mouseInRect, null, panel, "");
+ DrawWire(spriteBatch, equippedWire, new Vector2(x + width / 2, y + height - 150 * GUI.Scale),
+ new Vector2(x + width / 2, y + height),
+ null, panel, "");
- if (draggingConnected == equippedWire) Inventory.draggingItem = equippedWire.Item;
+ if (draggingConnected == equippedWire) { Inventory.draggingItem = equippedWire.Item; }
}
}
-
+
+
+ float step = (width * 0.75f) / panel.DisconnectedWires.Count();
+ x = (int)(x + width / 2 - step * (panel.DisconnectedWires.Count() - 1) / 2);
+ foreach (Wire wire in panel.DisconnectedWires)
+ {
+ if (wire == draggingConnected && mouseInRect) { continue; }
+
+ Connection recipient = wire.OtherConnection(null);
+ string label = recipient == null ? "" : recipient.item.Name + $" ({recipient.DisplayName})";
+ if (wire.Locked) { label += "\n" + TextManager.Get("ConnectionLocked"); }
+ DrawWire(spriteBatch, wire, new Vector2(x, y + height - 100 * GUI.Scale),
+ new Vector2(x, y + height),
+ null, panel, label);
+ x += (int)step;
+ }
+
//stop dragging a wire item if the cursor is within any connection panel
//(so we don't drop the item when dropping the wire on a connection)
- if (mouseInRect || GUI.MouseOn?.UserData is ConnectionPanel) Inventory.draggingItem = null;
+ if (mouseInRect || GUI.MouseOn?.UserData is ConnectionPanel) { Inventory.draggingItem = null; }
}
private void Draw(SpriteBatch spriteBatch, ConnectionPanel panel, Vector2 position, Vector2 labelPos, Vector2 wirePosition, bool mouseIn, Wire equippedWire, float wireInterval)
{
- //spriteBatch.DrawString(GUI.SmallFont, Name, new Vector2(labelPos.X, labelPos.Y-10), Color.White);
GUI.DrawString(spriteBatch, labelPos, DisplayName, IsPower ? Color.Red : Color.White, Color.Black, 0, GUI.SmallFont);
-
+
connectionSprite.Draw(spriteBatch, position);
for (int i = 0; i < MaxLinked; i++)
{
- if (wires[i] == null || wires[i].Hidden || draggingConnected == wires[i]) continue;
+ if (wires[i] == null || wires[i].Hidden || (draggingConnected == wires[i] && (mouseIn || Screen.Selected == GameMain.SubEditorScreen))) { continue; }
Connection recipient = wires[i].OtherConnection(this);
-
- string label = recipient == null ? "" :
- wires[i].Locked ? recipient.item.Name + "\n" + TextManager.Get("ConnectionLocked") : recipient.item.Name;
- DrawWire(spriteBatch, wires[i], (recipient == null) ? wires[i].Item : recipient.item, position, wirePosition, mouseIn, equippedWire, panel, label);
+ string label = recipient == null ? "" : recipient.item.Name + $" ({recipient.DisplayName})";
+ if (wires[i].Locked) { label += "\n" + TextManager.Get("ConnectionLocked"); }
+ DrawWire(spriteBatch, wires[i], position, wirePosition, equippedWire, panel, label);
wirePosition.Y += wireInterval;
}
- if (draggingConnected != null && Vector2.Distance(position, PlayerInput.MousePosition) < 13.0f)
+ if (draggingConnected != null && Vector2.Distance(position, PlayerInput.MousePosition) < (20.0f * GUI.Scale))
{
connectionSpriteHighlight.Draw(spriteBatch, position);
@@ -172,15 +198,15 @@ namespace Barotrauma.Items.Components
if (index > -1 && !Wires.Contains(draggingConnected))
{
bool alreadyConnected = draggingConnected.IsConnectedTo(panel.Item);
-
draggingConnected.RemoveConnection(panel.Item);
-
if (draggingConnected.Connect(this, !alreadyConnected, true))
{
var otherConnection = draggingConnected.OtherConnection(this);
SetWire(index, draggingConnected);
}
}
+ if (GameMain.Client != null) { panel.Item.CreateClientEvent(panel); }
+ draggingConnected = null;
}
}
@@ -215,15 +241,8 @@ namespace Barotrauma.Items.Components
flashTimer -= deltaTime;
}
- private static void DrawWire(SpriteBatch spriteBatch, Wire wire, Item item, Vector2 end, Vector2 start, bool mouseIn, Wire equippedWire, ConnectionPanel panel, string label)
+ private static void DrawWire(SpriteBatch spriteBatch, Wire wire, Vector2 end, Vector2 start, Wire equippedWire, ConnectionPanel panel, string label)
{
- if (draggingConnected == wire)
- {
- if (!mouseIn) return;
- end = PlayerInput.MousePosition;
- start.X = (start.X + end.X) / 2.0f;
- }
-
int textX = (int)start.X;
if (start.X < end.X)
textX -= 10;
@@ -244,11 +263,19 @@ namespace Barotrauma.Items.Components
if (!string.IsNullOrEmpty(label))
{
- GUI.DrawString(spriteBatch,
- new Vector2(start.X < end.X ? textX - GUI.SmallFont.MeasureString(label).X : textX, start.Y - 5.0f),
- label,
- (mouseOn ? Color.Gold : Color.White) * (wire.Locked ? 0.6f : 1.0f), Color.Black * 0.8f,
- 3, GUI.SmallFont);
+ if (start.Y > panel.GuiFrame.Rect.Bottom - 1.0f)
+ {
+ //wire at the bottom of the panel -> draw the text below the panel, tilted 45 degrees
+ GUI.SmallFont.DrawString(spriteBatch, label, start + Vector2.UnitY * 20 * GUI.Scale, Color.White, 45.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.0f);
+ }
+ else
+ {
+ GUI.DrawString(spriteBatch,
+ new Vector2(start.X < end.X ? textX - GUI.SmallFont.MeasureString(label).X : textX, start.Y - 5.0f),
+ label,
+ (mouseOn ? Color.Gold : Color.White) * (wire.Locked ? 0.6f : 1.0f), Color.Black * 0.8f,
+ 3, GUI.SmallFont);
+ }
}
var wireEnd = end + Vector2.Normalize(start - end) * 30.0f;
@@ -259,14 +286,14 @@ namespace Barotrauma.Items.Components
{
spriteBatch.Draw(wireVertical.Texture, new Rectangle(wireEnd.ToPoint(), new Point(18, (int)dist)), wireVertical.SourceRect,
Color.Gold,
- MathUtils.VectorToAngle(end - start) + MathHelper.PiOver2, //angle of line (calulated above)
+ MathUtils.VectorToAngle(end - start) + MathHelper.PiOver2,
new Vector2(6, 0), // point in line about which to rotate
SpriteEffects.None,
0.0f);
}
spriteBatch.Draw(wireVertical.Texture, new Rectangle(wireEnd.ToPoint(), new Point(12, (int)dist)), wireVertical.SourceRect,
wire.Item.Color * alpha,
- MathUtils.VectorToAngle(end - start) + MathHelper.PiOver2, //angle of line (calulated above)
+ MathUtils.VectorToAngle(end - start) + MathHelper.PiOver2,
new Vector2(6, 0), // point in line about which to rotate
SpriteEffects.None,
0.0f);
@@ -283,7 +310,7 @@ namespace Barotrauma.Items.Components
if (allowRewiring && !wire.Locked && (!panel.Locked || Screen.Selected == GameMain.SubEditorScreen))
{
//start dragging the wire
- if (PlayerInput.LeftButtonHeld()) draggingConnected = wire;
+ if (PlayerInput.LeftButtonHeld()) { draggingConnected = wire; }
}
}
}
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs
index 3a0748e73..cefe12ae5 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs
@@ -52,7 +52,7 @@ namespace Barotrauma.Items.Components
private void DrawConnections(SpriteBatch spriteBatch, GUICustomComponent container)
{
- if (user != Character.Controlled || user == null) return;
+ if (user != Character.Controlled || user == null) { return; }
HighlightedWire = null;
Connection.DrawConnections(spriteBatch, this, user);
@@ -70,8 +70,22 @@ namespace Barotrauma.Items.Components
{
//delay reading the state until midround syncing is done
//because some of the wires connected to the panel may not exist yet
- int bitsToRead = Connections.Count * Connection.MaxLinked * 16;
- StartDelayedCorrection(type, msg.ExtractBits(bitsToRead), sendingTime, waitForMidRoundSync: true);
+ long msgStartPos = msg.Position;
+ foreach (Connection connection in Connections)
+ {
+ for (int i = 0; i < Connection.MaxLinked; i++)
+ {
+ msg.ReadUInt16();
+ }
+ }
+ ushort disconnectedWireCount = msg.ReadUInt16();
+ for (int i = 0; i < disconnectedWireCount; i++)
+ {
+ msg.ReadUInt16();
+ }
+ int msgLength = (int)(msg.Position - msgStartPos);
+ msg.Position = msgStartPos;
+ StartDelayedCorrection(type, msg.ExtractBits(msgLength), sendingTime, waitForMidRoundSync: true);
}
else
{
@@ -95,11 +109,9 @@ namespace Barotrauma.Items.Components
{
ushort wireId = msg.ReadUInt16();
- Item wireItem = Entity.FindEntityByID(wireId) as Item;
- if (wireItem == null) continue;
-
+ if (!(Entity.FindEntityByID(wireId) is Item wireItem)) { continue; }
Wire wireComponent = wireItem.GetComponent();
- if (wireComponent == null) continue;
+ if (wireComponent == null) { continue; }
newWires.Add(wireComponent);
@@ -108,18 +120,46 @@ namespace Barotrauma.Items.Components
}
}
+ List previousDisconnectedWires = new List(DisconnectedWires);
+ DisconnectedWires.Clear();
+ ushort disconnectedWireCount = msg.ReadUInt16();
+ for (int i = 0; i < disconnectedWireCount; i++)
+ {
+ ushort wireId = msg.ReadUInt16();
+ if (!(Entity.FindEntityByID(wireId) is Item wireItem)) { continue; }
+ Wire wireComponent = wireItem.GetComponent();
+ if (wireComponent == null) { continue; }
+ DisconnectedWires.Add(wireComponent);
+ }
+
foreach (Wire wire in prevWires)
{
- if (wire.Connections[0] == null && wire.Connections[1] == null)
+ bool connected = wire.Connections[0] != null || wire.Connections[1] != null;
+ if (!connected)
+ {
+ foreach (Item item in Item.ItemList)
+ {
+ var connectionPanel = item.GetComponent();
+ if (connectionPanel != null && connectionPanel.DisconnectedWires.Contains(wire))
+ {
+ connected = true;
+ break;
+ }
+ }
+ }
+ if (wire.Item.ParentInventory == null && !connected)
{
wire.Item.Drop(null);
}
- //wires that are not in anyone's inventory (i.e. not currently being rewired) can never be connected to only one connection
- // -> someone must have dropped the wire from the connection panel
- else if (wire.Item.ParentInventory == null &&
- (wire.Connections[0] != null ^ wire.Connections[1] != null))
+ }
+
+ foreach (Wire disconnectedWire in previousDisconnectedWires)
+ {
+ if (disconnectedWire.Connections[0] == null &&
+ disconnectedWire.Connections[1] == null &&
+ !DisconnectedWires.Contains(disconnectedWire))
{
- wire.Item.Drop(null);
+ disconnectedWire.Item.Drop(dropper: null);
}
}
}
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Wire.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Wire.cs
index 61d5bcc62..2d1ca769f 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Wire.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Wire.cs
@@ -2,6 +2,7 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
+using System;
using System.Collections.Generic;
using System.Linq;
@@ -90,18 +91,26 @@ namespace Barotrauma.Items.Components
section.Draw(spriteBatch, item.Color, drawOffset, depth, 0.3f);
}
- if (IsActive && nodes.Count > 0 && Vector2.Distance(newNodePos, nodes[nodes.Count - 1]) > nodeDistance)
+ if (nodes.Count > 0)
{
- WireSection.Draw(
- spriteBatch,
- new Vector2(nodes[nodes.Count - 1].X, nodes[nodes.Count - 1].Y) + drawOffset,
- new Vector2(newNodePos.X, newNodePos.Y) + drawOffset,
- item.Color * 0.5f,
- depth,
- 0.3f);
+ if (!IsActive)
+ {
+ if (connections[0] == null) { DrawHangingWire(spriteBatch, nodes[0] + drawOffset, depth); }
+ if (connections[1] == null) { DrawHangingWire(spriteBatch, nodes.Last() + drawOffset, depth); }
+ }
+ if (IsActive && Vector2.Distance(newNodePos, nodes[nodes.Count - 1]) > nodeDistance)
+ {
+ WireSection.Draw(
+ spriteBatch,
+ new Vector2(nodes[nodes.Count - 1].X, nodes[nodes.Count - 1].Y) + drawOffset,
+ new Vector2(newNodePos.X, newNodePos.Y) + drawOffset,
+ item.Color * 0.5f,
+ depth,
+ 0.3f);
+ }
}
- if (!editing || !GameMain.SubEditorScreen.WiringMode) return;
+ if (!editing || !GameMain.SubEditorScreen.WiringMode) { return; }
for (int i = 0; i < nodes.Count; i++)
{
@@ -126,6 +135,23 @@ namespace Barotrauma.Items.Components
}
}
+ private void DrawHangingWire(SpriteBatch spriteBatch, Vector2 start, float depth)
+ {
+ float angle = (float)Math.Sin(GameMain.GameScreen.GameTime * 2.0f + item.ID) * 0.2f;
+ Vector2 endPos = start + new Vector2((float)Math.Sin(angle), -(float)Math.Cos(angle)) * 50.0f;
+
+ WireSection.Draw(
+ spriteBatch,
+ start, endPos,
+ Color.Orange, depth + 0.00001f, 0.2f);
+
+ WireSection.Draw(
+ spriteBatch,
+ start, start + (endPos - start) * 0.7f,
+ item.Color, depth, 0.3f);
+ }
+
+
public static void UpdateEditing(List wires)
{
//dragging a node of some wire
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs
index 03adc3207..8795b1dad 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs
@@ -25,6 +25,9 @@ namespace Barotrauma.Items.Components
private SoundChannel moveSoundChannel;
private Vector2 crosshairPos, crosshairPointerPos;
+
+ private Dictionary widgets = new Dictionary();
+ private float prevAngle;
private bool flashLowPower;
private bool flashNoAmmo;
@@ -117,6 +120,25 @@ namespace Barotrauma.Items.Components
barSize: 0.0f);
}
+ private void InitializeRotationLimitWidget(Widget widget)
+ {
+ widget.Hovered += () =>
+ {
+ widget.secondaryColor = Color.Green;
+ };
+ widget.Selected += () =>
+ {
+ widget.color = Color.Green;
+ };
+ widget.MouseHeld += (deltaTime) =>
+ {
+ widget.DrawPos = PlayerInput.MousePosition;
+ };
+ widget.Deselected += () =>
+ {
+ widget.color = Color.Red;
+ };
+ }
partial void LaunchProjSpecific()
{
@@ -246,24 +268,153 @@ namespace Barotrauma.Items.Components
item.SpriteColor,
rotation + MathHelper.PiOver2, item.Scale,
SpriteEffects.None, item.SpriteDepth + (barrelSprite.Depth - item.Sprite.Depth));
-
-
- if (!editing) return;
+
+ if (!editing) { return; }
+
+ float widgetRadius = 60.0f;
GUI.DrawLine(spriteBatch,
drawPos,
- drawPos + new Vector2((float)Math.Cos(minRotation), (float)Math.Sin(minRotation)) * 60.0f,
+ drawPos + new Vector2((float)Math.Cos(minRotation), (float)Math.Sin(minRotation)) * widgetRadius,
Color.Green);
GUI.DrawLine(spriteBatch,
drawPos,
- drawPos + new Vector2((float)Math.Cos(maxRotation), (float)Math.Sin(maxRotation)) * 60.0f,
+ drawPos + new Vector2((float)Math.Cos(maxRotation), (float)Math.Sin(maxRotation)) * widgetRadius,
Color.Green);
GUI.DrawLine(spriteBatch,
drawPos,
- drawPos + new Vector2((float)Math.Cos((maxRotation + minRotation) / 2), (float)Math.Sin((maxRotation + minRotation) / 2)) * 60.0f,
+ drawPos + new Vector2((float)Math.Cos((maxRotation + minRotation) / 2), (float)Math.Sin((maxRotation + minRotation) / 2)) * widgetRadius,
Color.LightGreen);
+
+ if (!item.IsSelected) { return; }
+
+ Widget minRotationWidget = GetWidget("minrotation", spriteBatch, size: 10, initMethod: (widget) =>
+ {
+ widget.MouseDown += () =>
+ {
+ widget.color = Color.Green;
+ prevAngle = minRotation;
+ };
+ widget.Deselected += () =>
+ {
+ widget.color = Color.Yellow;
+ item.CreateEditingHUD();
+ };
+ widget.MouseHeld += (deltaTime) =>
+ {
+ minRotation = GetRotationAngle(drawPos);
+ if (minRotation > maxRotation)
+ {
+ float temp = minRotation;
+ minRotation = maxRotation;
+ maxRotation = temp;
+ }
+ MapEntity.DisableSelect = true;
+ };
+ widget.PreUpdate += (deltaTime) =>
+ {
+ widget.DrawPos = new Vector2(widget.DrawPos.X, -widget.DrawPos.Y);
+ widget.DrawPos = Screen.Selected.Cam.WorldToScreen(widget.DrawPos);
+ };
+ widget.PostUpdate += (deltaTime) =>
+ {
+ widget.DrawPos = Screen.Selected.Cam.ScreenToWorld(widget.DrawPos);
+ widget.DrawPos = new Vector2(widget.DrawPos.X, -widget.DrawPos.Y);
+ };
+ widget.PreDraw += (sprtBtch, deltaTime) =>
+ {
+ widget.tooltip = "Min: " + (int)MathHelper.ToDegrees(minRotation);
+ widget.DrawPos = drawPos + new Vector2((float)Math.Cos(minRotation), (float)Math.Sin(minRotation)) * widgetRadius;
+ widget.Update(deltaTime);
+ };
+ });
+
+ Widget maxRotationWidget = GetWidget("maxrotation", spriteBatch, size: 10, initMethod: (widget) =>
+ {
+ widget.MouseDown += () =>
+ {
+ widget.color = Color.Green;
+ prevAngle = minRotation;
+ };
+ widget.Deselected += () =>
+ {
+ widget.color = Color.Yellow;
+ item.CreateEditingHUD();
+ };
+ widget.MouseHeld += (deltaTime) =>
+ {
+ maxRotation = GetRotationAngle(drawPos);
+ if (minRotation > maxRotation)
+ {
+ float temp = minRotation;
+ minRotation = maxRotation;
+ maxRotation = temp;
+ }
+ MapEntity.DisableSelect = true;
+ };
+ widget.PreUpdate += (deltaTime) =>
+ {
+ widget.DrawPos = new Vector2(widget.DrawPos.X, -widget.DrawPos.Y);
+ widget.DrawPos = Screen.Selected.Cam.WorldToScreen(widget.DrawPos);
+ };
+ widget.PostUpdate += (deltaTime) =>
+ {
+ widget.DrawPos = Screen.Selected.Cam.ScreenToWorld(widget.DrawPos);
+ widget.DrawPos = new Vector2(widget.DrawPos.X, -widget.DrawPos.Y);
+ };
+ widget.PreDraw += (sprtBtch, deltaTime) =>
+ {
+ widget.tooltip = "Max: " + (int)MathHelper.ToDegrees(maxRotation);
+ widget.DrawPos = drawPos + new Vector2((float)Math.Cos(maxRotation), (float)Math.Sin(maxRotation)) * widgetRadius;
+ widget.Update(deltaTime);
+ };
+ });
+ minRotationWidget.Draw(spriteBatch, (float)Timing.Step);
+ maxRotationWidget.Draw(spriteBatch, (float)Timing.Step);
+ }
+
+ private Widget GetWidget(string id, SpriteBatch spriteBatch, int size = 5, Action initMethod = null)
+ {
+ if (!widgets.TryGetValue(id, out Widget widget))
+ {
+ widget = new Widget(id, size, Widget.Shape.Rectangle)
+ {
+ color = Color.Yellow,
+ tooltipOffset = new Vector2(size / 2 + 5, -10),
+ inputAreaMargin = 20,
+ RequireMouseOn = false
+ };
+ widgets.Add(id, widget);
+ initMethod?.Invoke(widget);
+ }
+ return widget;
+ }
+
+ ///
+ /// Returns correct angle between -2PI and +2PI
+ ///
+ ///
+ ///
+ private float GetRotationAngle(Vector2 drawPosition)
+ {
+ Vector2 mouseVector = Screen.Selected.Cam.ScreenToWorld(PlayerInput.MousePosition);
+ mouseVector.Y = -mouseVector.Y;
+ Vector2 rotationVector = mouseVector - drawPosition;
+ rotationVector.Normalize();
+ double angle = Math.Atan2(MathHelper.ToRadians(rotationVector.Y), MathHelper.ToRadians(rotationVector.X));
+ if (angle < 0)
+ {// calculates which coterminal angle is closer to previous angle
+ angle = Math.Abs(angle - prevAngle) < Math.Abs((angle + Math.PI * 2) - prevAngle) ? angle : angle + Math.PI * 2;
+ }
+ else if (angle > 0)
+ {
+ angle = Math.Abs(angle - prevAngle) < Math.Abs((angle - Math.PI * 2) - prevAngle) ? angle : angle - Math.PI * 2;
+ }
+ angle = MathHelper.Clamp((float)angle, -((float)Math.PI * 2), (float)Math.PI * 2);
+ prevAngle = (float)angle;
+ return (float)angle;
}
public override void DrawHUD(SpriteBatch spriteBatch, Character character)
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Item.cs b/Barotrauma/BarotraumaClient/Source/Items/Item.cs
index ba6bc9a40..9e7d9461f 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Item.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Item.cs
@@ -329,6 +329,10 @@ namespace Barotrauma
item.AiTarget?.Draw(spriteBatch);
}
}
+ if (body != null)
+ {
+ body.DebugDraw(spriteBatch, Color.White);
+ }
}
if (!editing || (body != null && !body.Enabled))
@@ -880,7 +884,6 @@ namespace Barotrauma
}
}
break;
-
case NetEntityEvent.Type.InventoryState:
{
int containerIndex = msg.ReadRangedInteger(0, components.Count - 1);
@@ -969,6 +972,10 @@ namespace Barotrauma
case NetEntityEvent.Type.ChangeProperty:
WritePropertyChange(msg, extraData, true);
break;
+ case NetEntityEvent.Type.Combine:
+ UInt16 combineTargetID = (UInt16)extraData[1];
+ msg.Write(combineTargetID);
+ break;
}
msg.WritePadBits();
}
diff --git a/Barotrauma/BarotraumaClient/Source/Map/Explosion.cs b/Barotrauma/BarotraumaClient/Source/Map/Explosion.cs
index cf6fc9973..6e2791151 100644
--- a/Barotrauma/BarotraumaClient/Source/Map/Explosion.cs
+++ b/Barotrauma/BarotraumaClient/Source/Map/Explosion.cs
@@ -90,6 +90,15 @@ namespace Barotrauma
}
}
+ private Vector2 ClampParticlePos(Vector2 particlePos, Hull hull)
+ {
+ if (hull == null) return particlePos;
+
+ return new Vector2(
+ MathHelper.Clamp(particlePos.X, hull.WorldRect.X, hull.WorldRect.Right),
+ MathHelper.Clamp(particlePos.Y, hull.WorldRect.Y - hull.WorldRect.Height, hull.WorldRect.Y));
+ }
+
private IEnumerable