From 63eb4d64e591ce8d41c2503225faf5bb05809e55 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Mon, 18 Mar 2019 22:59:45 +0200 Subject: [PATCH] f8b0295...0671290 --- Barotrauma/BarotraumaClient/Icon.bmp | Bin 0 -> 14770 bytes .../BarotraumaClient/LinuxClient.csproj | 12 +- Barotrauma/BarotraumaClient/MacClient.csproj | 4 + .../Properties/AssemblyInfo.cs | 4 +- .../BarotraumaClient/Shaders/Content.mgcb | 57 + .../Shaders/Content_opengl.mgcb | 62 + .../BarotraumaClient/Shaders/solidcolor.fx | 38 + .../Shaders/solidcolor_opengl.fx | 38 + .../Source/Characters/CharacterHUD.cs | 6 +- .../Source/Characters/CharacterHealth.cs | 5 +- .../Source/Characters/CharacterNetworking.cs | 2 +- .../BarotraumaClient/Source/DebugConsole.cs | 2555 +---------------- .../BarotraumaClient/Source/GameMain.cs | 5 - .../Source/GameSession/CrewManager.cs | 147 +- .../GameModes/MultiPlayerCampaign.cs | 8 +- .../Source/GameSession/GameSession.cs | 3 - .../BarotraumaClient/Source/GameSettings.cs | 46 +- .../Source/Items/Components/ItemComponent.cs | 25 +- .../Items/Components/Machines/Reactor.cs | 12 +- .../Source/Items/Components/Turret.cs | 11 +- .../BarotraumaClient/Source/Items/Item.cs | 48 +- .../BarotraumaClient/Source/Map/Hull.cs | 56 - .../Map/Levels/LevelObjects/LevelObject.cs | 2 +- .../Source/Map/Lights/LightManager.cs | 166 +- .../BarotraumaClient/Source/Map/MapEntity.cs | 1 - .../BarotraumaClient/Source/Map/Structure.cs | 42 +- .../BarotraumaClient/Source/Map/Submarine.cs | 5 + .../Source/Networking/GameClient.cs | 62 +- .../Source/Networking/Voip/VoipCapture.cs | 12 +- .../Source/Screens/CharacterEditorScreen.cs | 87 +- .../Source/Screens/GameScreen.cs | 4 - .../Source/Screens/MainMenuScreen.cs | 18 +- .../Source/Screens/NetLobbyScreen.cs | 8 +- .../Source/Screens/ServerListScreen.cs | 2 +- .../Source/Screens/SubEditorScreen.cs | 2 - .../Source/Sounds/OggSound.cs | 4 +- .../Source/Sounds/SoundChannel.cs | 10 +- .../Source/Sounds/SoundManager.cs | 33 +- .../Source/Sounds/SoundPlayer.cs | 8 +- .../Source/Sounds/VoipSound.cs | 2 +- .../Source/Sprite/DeformableSprite.cs | 4 + .../BarotraumaClient/Source/Sprite/Sprite.cs | 1 - .../Source/Utils/LocalizationCSVtoXML.cs | 50 +- .../BarotraumaClient/WindowsClient.csproj | 4 + .../Properties/AssemblyInfo.cs | 4 +- .../GameModes/MultiPlayerCampaign.cs | 30 + .../Source/Networking/GameServer.cs | 761 +---- .../ServerEntityEventManager.cs | 6 +- .../Data/ContentPackages/Vanilla 0.9.xml | 2 +- .../BarotraumaShared/SharedContent.projitems | 45 +- .../Source/Characters/AI/EnemyAIController.cs | 4 +- .../Source/Characters/AI/HumanAIController.cs | 43 +- .../Characters/AI/IndoorsSteeringManager.cs | 15 +- .../Source/Characters/AI/NPCConversation.cs | 2 + .../Characters/AI/Objectives/AIObjective.cs | 1 + .../AI/Objectives/AIObjectiveCombat.cs | 25 +- .../AI/Objectives/AIObjectiveContainItem.cs | 4 +- .../Objectives/AIObjectiveExtinguishFire.cs | 8 +- .../Objectives/AIObjectiveFindDivingGear.cs | 43 +- .../AI/Objectives/AIObjectiveFindSafety.cs | 37 +- .../AI/Objectives/AIObjectiveFixLeak.cs | 16 +- .../AI/Objectives/AIObjectiveGetItem.cs | 59 +- .../AI/Objectives/AIObjectiveGoTo.cs | 4 +- .../AI/Objectives/AIObjectiveIdle.cs | 1 + .../AI/Objectives/AIObjectiveLoop.cs | 22 +- .../AI/Objectives/AIObjectiveManager.cs | 5 + .../AI/Objectives/AIObjectiveRepairItem.cs | 44 +- .../AI/Objectives/AIObjectiveRepairItems.cs | 10 +- .../Source/Characters/AI/PathFinder.cs | 20 +- .../Animation/FishAnimController.cs | 6 - .../Animation/HumanoidAnimController.cs | 59 +- .../Source/Characters/Animation/Ragdoll.cs | 19 +- .../Source/Characters/Character.cs | 25 +- .../Source/Characters/NPCPersonalityTrait.cs | 4 + .../BarotraumaShared/Source/DebugConsole.cs | 68 +- .../GameSession/GameModes/CampaignMode.cs | 2 +- .../GameModes/MultiPlayerCampaign.cs | 31 +- .../BarotraumaShared/Source/GameSettings.cs | 468 +-- .../Source/Items/Components/DockingPort.cs | 4 +- .../Source/Items/Components/Door.cs | 13 +- .../Items/Components/Holdable/RepairTool.cs | 34 +- .../Source/Items/Components/ItemComponent.cs | 1 - .../Items/Components/Machines/Engine.cs | 24 - .../Items/Components/Signal/LightComponent.cs | 1 - .../Source/Items/Components/Signal/Wire.cs | 15 +- .../Source/Items/Components/Turret.cs | 5 +- .../BarotraumaShared/Source/Items/Item.cs | 3 +- .../Source/Map/Map/LocationType.cs | 4 +- .../BarotraumaShared/Source/Map/Map/Map.cs | 4 - .../BarotraumaShared/Source/Map/Structure.cs | 2 +- .../BarotraumaShared/Source/Map/Submarine.cs | 44 - .../Source/Map/SubmarineBody.cs | 17 + .../Source/Physics/PhysicsBody.cs | 14 +- .../BarotraumaShared/Source/PlayerInput.cs | 20 +- .../Source/StatusEffects/StatusEffect.cs | 5 - .../BarotraumaShared/Source/TextManager.cs | 70 +- .../BarotraumaShared/Source/TextPack.cs | 6 +- .../BarotraumaShared/Submarines/Dugong.sub | Bin 69867 -> 71982 bytes .../BarotraumaShared/Submarines/Muikku.sub | Bin 70650 -> 57750 bytes .../BarotraumaShared/Submarines/Orca.sub | Bin 84028 -> 83973 bytes .../BarotraumaShared/Submarines/PAX.sub | Bin 0 -> 57247 bytes Barotrauma/BarotraumaShared/changelog.txt | 80 + git-strip-merge | 140 + 103 files changed, 1378 insertions(+), 4692 deletions(-) create mode 100644 Barotrauma/BarotraumaClient/Icon.bmp create mode 100644 Barotrauma/BarotraumaClient/Shaders/Content.mgcb create mode 100644 Barotrauma/BarotraumaClient/Shaders/Content_opengl.mgcb create mode 100644 Barotrauma/BarotraumaClient/Shaders/solidcolor.fx create mode 100644 Barotrauma/BarotraumaClient/Shaders/solidcolor_opengl.fx create mode 100644 Barotrauma/BarotraumaShared/Submarines/PAX.sub create mode 100644 git-strip-merge diff --git a/Barotrauma/BarotraumaClient/Icon.bmp b/Barotrauma/BarotraumaClient/Icon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dedeee273ad6b9e468990cfb6001e915a559322e GIT binary patch literal 14770 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 + ..\BarotraumaShared\IconBmp.bmp ..\BarotraumaShared\Icon.ico @@ -103,6 +104,7 @@ PreserveNewest + PreserveNewest @@ -152,13 +154,16 @@ - + + + PreserveNewest + PreserveNewest @@ -187,6 +192,11 @@ + + + Icon.bmp + + diff --git a/Barotrauma/BarotraumaClient/MacClient.csproj b/Barotrauma/BarotraumaClient/MacClient.csproj index 5fbe31943..29dd488d3 100644 --- a/Barotrauma/BarotraumaClient/MacClient.csproj +++ b/Barotrauma/BarotraumaClient/MacClient.csproj @@ -103,6 +103,7 @@ PreserveNewest + PreserveNewest @@ -159,6 +160,9 @@ + + PreserveNewest + PreserveNewest diff --git a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs index 08da64291..def51c503 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.8.9.5")] -[assembly: AssemblyFileVersion("0.8.9.5")] +[assembly: AssemblyVersion("0.8.9.6")] +[assembly: AssemblyFileVersion("0.8.9.6")] diff --git a/Barotrauma/BarotraumaClient/Shaders/Content.mgcb b/Barotrauma/BarotraumaClient/Shaders/Content.mgcb new file mode 100644 index 000000000..cc09bad54 --- /dev/null +++ b/Barotrauma/BarotraumaClient/Shaders/Content.mgcb @@ -0,0 +1,57 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:Windows +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + +#begin blurshader.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:blurshader.fx + +#begin damageshader.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:damageshader.fx + +#begin deformshader.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:deformshader.fx + +#begin losshader.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:losshader.fx + +#begin postprocess.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:postprocess.fx + +#begin watershader.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:watershader.fx + +#begin solidcolor.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:solidcolor.fx + diff --git a/Barotrauma/BarotraumaClient/Shaders/Content_opengl.mgcb b/Barotrauma/BarotraumaClient/Shaders/Content_opengl.mgcb new file mode 100644 index 000000000..6606ae7ca --- /dev/null +++ b/Barotrauma/BarotraumaClient/Shaders/Content_opengl.mgcb @@ -0,0 +1,62 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:DesktopGL +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + +#begin blurshader_opengl.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:blurshader_opengl.fx + +#begin Content_opengl.mgcb +/importer: +/processor: +/build:Content_opengl.mgcb + +#begin damageshader_opengl.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:damageshader_opengl.fx + +#begin deformshader_opengl.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:deformshader_opengl.fx + +#begin losshader_opengl.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:losshader_opengl.fx + +#begin postprocess_opengl.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:postprocess_opengl.fx + +#begin solidcolor_opengl.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:solidcolor_opengl.fx + +#begin watershader_opengl.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:watershader_opengl.fx + diff --git a/Barotrauma/BarotraumaClient/Shaders/solidcolor.fx b/Barotrauma/BarotraumaClient/Shaders/solidcolor.fx new file mode 100644 index 000000000..846f3d2fe --- /dev/null +++ b/Barotrauma/BarotraumaClient/Shaders/solidcolor.fx @@ -0,0 +1,38 @@ +Texture2D xTexture; +sampler TextureSampler = sampler_state { Texture = ; }; + +float blurDistance; +float4 color; + +float4 solidColor(float4 position : SV_Position, float4 clr : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 +{ + float a = tex2D(TextureSampler, texCoord).a; + return color * a; +} + +float4 solidColorBlur(float4 position : SV_Position, float4 clr : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 +{ + float sample; + sample = tex2D(TextureSampler, float2(texCoord.x + blurDistance, texCoord.y + blurDistance)).a; + sample += tex2D(TextureSampler, float2(texCoord.x - blurDistance, texCoord.y - blurDistance)).a; + sample += tex2D(TextureSampler, float2(texCoord.x + blurDistance, texCoord.y - blurDistance)).a; + sample += tex2D(TextureSampler, float2(texCoord.x - blurDistance, texCoord.y + blurDistance)).a; + sample = sample * 0.25f; + + return color * sample; +} + +technique SolidColor +{ + pass Pass1 + { + PixelShader = compile ps_4_0_level_9_1 solidColor(); + } +} +technique SolidColorBlur +{ + pass Pass1 + { + PixelShader = compile ps_4_0_level_9_1 solidColorBlur(); + } +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaClient/Shaders/solidcolor_opengl.fx b/Barotrauma/BarotraumaClient/Shaders/solidcolor_opengl.fx new file mode 100644 index 000000000..2c82b0bf3 --- /dev/null +++ b/Barotrauma/BarotraumaClient/Shaders/solidcolor_opengl.fx @@ -0,0 +1,38 @@ +Texture xTexture; +sampler TextureSampler = sampler_state { Texture = ; }; + +float blurDistance; +float4 color; + +float4 solidColor(float4 position : SV_Position, float4 clr : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 +{ + float a = tex2D(TextureSampler, texCoord).a; + return color * a; +} + +float4 solidColorBlur(float4 position : SV_Position, float4 clr : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 +{ + float sample; + sample = tex2D(TextureSampler, float2(texCoord.x + blurDistance, texCoord.y + blurDistance)).a; + sample += tex2D(TextureSampler, float2(texCoord.x - blurDistance, texCoord.y - blurDistance)).a; + sample += tex2D(TextureSampler, float2(texCoord.x + blurDistance, texCoord.y - blurDistance)).a; + sample += tex2D(TextureSampler, float2(texCoord.x - blurDistance, texCoord.y + blurDistance)).a; + sample = sample * 0.25f; + + return color * sample; +} + +technique SolidColor +{ + pass Pass1 + { + PixelShader = compile ps_3_0 solidColor(); + } +} +technique SolidColorBlur +{ + pass Pass1 + { + PixelShader = compile ps_3_0 solidColorBlur(); + } +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs index 86c88a3e0..fd0af8cf0 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs @@ -242,7 +242,7 @@ namespace Barotrauma GUI.Style.FocusIndicator.Draw(spriteBatch, (int)((focusedItemOverlayTimer - 1.0f) * GUI.Style.FocusIndicator.FrameCount * 3.0f), circlePos, - Color.Orange * 0.3f, + Color.LightBlue * 0.3f, origin: GUI.Style.FocusIndicator.FrameSize.ToVector2() / 2, rotate: (float)Timing.TotalTime, scale: scale); @@ -274,9 +274,7 @@ namespace Barotrauma GUI.DrawString(spriteBatch, textPos, coloredText.Text, coloredText.Color * alpha, Color.Black * alpha * 0.7f, 2, GUI.SmallFont); textPos.Y += 20; } - } - - + } } foreach (HUDProgressBar progressBar in character.HUDProgressBars.Values) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterHealth.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterHealth.cs index 4fb00dc00..75ea85fb8 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterHealth.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterHealth.cs @@ -544,7 +544,10 @@ namespace Barotrauma { healthBar.Color = healthWindowHealthBar.Color = ToolBox.GradientLerp(Vitality / MaxVitality, Color.Red, Color.Orange, Color.Green); healthBar.HoverColor = healthWindowHealthBar.HoverColor = healthBar.Color * 2.0f; - healthBar.BarSize = healthWindowHealthBar.BarSize = (Vitality > 0.0f) ? Vitality / MaxVitality : 1.0f - Vitality / MinVitality; + healthBar.BarSize = healthWindowHealthBar.BarSize = + (Vitality > 0.0f) ? + (MaxVitality > 0.0f ? Vitality / MaxVitality : 0.0f) : + (Math.Abs(MinVitality) > 0.0f ? 1.0f - Vitality / MinVitality : 0.0f); if (healthBarPulsateTimer > 0.0f) { diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs index 4aac62ef9..54acd801e 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs @@ -363,7 +363,7 @@ namespace Barotrauma character.ID = id; character.TeamID = (TeamType)teamID; - if (configPath == HumanConfigFile) + if (configPath == HumanConfigFile && character.TeamID != TeamType.FriendlyNPC) { CharacterInfo duplicateCharacterInfo = GameMain.GameSession.CrewManager.GetCharacterInfos().FirstOrDefault(c => c.ID == info.ID); GameMain.GameSession.CrewManager.RemoveCharacterInfo(duplicateCharacterInfo); diff --git a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs index 6345fd8d7..43e6a9938 100644 --- a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs @@ -436,7 +436,7 @@ namespace Barotrauma AssignOnExecute("ambientlight", (string[] args) => { - Color color = XMLExtensions.ParseColor(string.Join("", args)); + Color color = XMLExtensions.ParseColor(string.Join(",", args)); if (Level.Loaded != null) { Level.Loaded.GenerationParams.AmbientLightColor = color; @@ -1060,2559 +1060,6 @@ namespace Barotrauma })); #endif - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); -#endif - - commands.Add(new Command("cleanbuild", "", (string[] args) => - { - GameMain.Config.MusicVolume = 0.5f; - GameMain.Config.SoundVolume = 0.5f; - NewMessage("Music and sound volume set to 0.5", Color.Green); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - })); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - - GameMain.Config.SaveNewPlayerConfig(); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); - - commands.Add(new Command("loadtexts", "loadtexts [sourcefile] [destinationfile]: Loads all lines of text from a given .txt file and inserts them sequientially into the elements of an xml file. If the file paths are omitted, EnglishVanilla.txt and EnglishVanilla.xml are used.", (string[] args) => - { - string sourcePath = args.Length > 0 ? args[0] : "Content/Texts/EnglishVanilla.txt"; - string destinationPath = args.Length > 1 ? args[1] : "Content/Texts/EnglishVanilla.xml"; - - string[] lines; - try - { - lines = File.ReadAllLines(sourcePath); - } - catch (Exception e) - { - ThrowError("Reading the file \"" + sourcePath + "\" failed.", e); - return; - } - var doc = XMLExtensions.TryLoadXml(destinationPath); - int i = 0; - foreach (XElement element in doc.Root.Elements()) - { - if (i >= lines.Length) - { - ThrowError("Error while loading texts to the xml file. The xml has more elements than the number of lines in the text file."); - return; - } - element.Value = lines[i]; - i++; - } - doc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Select(f => f.Replace("\\", "/")); - return new string[][] - { - files.Where(f => Path.GetExtension(f)==".txt").ToArray(), - files.Where(f => Path.GetExtension(f)==".xml").ToArray() - }; - })); - - commands.Add(new Command("updatetextfile", "updatetextfile [sourcefile] [destinationfile]: Inserts all the xml elements that are only present in the source file into the destination file. Can be used to update outdated translation files more easily.", (string[] args) => - { - if (args.Length < 2) return; - string sourcePath = args[0]; - string destinationPath = args[1]; - - var sourceDoc = XMLExtensions.TryLoadXml(sourcePath); - var destinationDoc = XMLExtensions.TryLoadXml(destinationPath); - - XElement destinationElement = destinationDoc.Root.Elements().First(); - foreach (XElement element in sourceDoc.Root.Elements()) - { - if (destinationDoc.Root.Element(element.Name) == null) - { - element.Value = "!!!!!!!!!!!!!" + element.Value; - destinationElement.AddAfterSelf(element); - } - XNode nextNode = destinationElement.NextNode; - while ((!(nextNode is XElement) || nextNode == element) && nextNode != null) nextNode = nextNode.NextNode; - destinationElement = nextNode as XElement; - } - destinationDoc.Save(destinationPath); - }, - () => - { - var files = TextManager.GetTextFiles().Where(f => Path.GetExtension(f) == ".xml").Select(f => f.Replace("\\", "/")).ToArray(); - return new string[][] - { - files, - files - }; - })); - - commands.Add(new Command("dumpentitytexts", "dumpentitytexts [filepath]: gets the names and descriptions of all entity prefabs and writes them into a file along with xml tags that can be used in translation files. If the filepath is omitted, the file is written to Content/Texts/EntityTexts.txt", (string[] args) => - { - string filePath = args.Length > 0 ? args[0] : "Content/Texts/EntityTexts.txt"; - List lines = new List(); - foreach (MapEntityPrefab me in MapEntityPrefab.List) - { - lines.Add("" + me.Name + ""); - lines.Add("" + me.Description + ""); - } - File.WriteAllLines(filePath, lines); - })); -#if DEBUG - commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) => - { - if (args.Length != 1) return; - TextManager.CheckForDuplicates(args[0]); - })); - - commands.Add(new Command("writetocsv", "Writes the default language (English) to a .csv file.", (string[] args) => - { - TextManager.WriteToCSV(); - NPCConversation.WriteToCSV(); - })); - - commands.Add(new Command("camerasettings", "camerasettings [defaultzoom] [zoomsmoothness] [movesmoothness] [minzoom] [maxzoom]: debug command for testing camera settings. The values default to 1.1, 8.0, 8.0, 0.1 and 2.0.", (string[] args) => - { - float defaultZoom = Screen.Selected.Cam.DefaultZoom; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out defaultZoom); - - float zoomSmoothness = Screen.Selected.Cam.ZoomSmoothness; - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out zoomSmoothness); - float moveSmoothness = Screen.Selected.Cam.MoveSmoothness; - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out moveSmoothness); - - float minZoom = Screen.Selected.Cam.MinZoom; - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out minZoom); - float maxZoom = Screen.Selected.Cam.MaxZoom; - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out maxZoom); - - Screen.Selected.Cam.DefaultZoom = defaultZoom; - Screen.Selected.Cam.ZoomSmoothness = zoomSmoothness; - Screen.Selected.Cam.MoveSmoothness = moveSmoothness; - Screen.Selected.Cam.MinZoom = minZoom; - Screen.Selected.Cam.MaxZoom = maxZoom; - })); - - commands.Add(new Command("waterparams", "waterparams [distortionscalex] [distortionscaley] [distortionstrengthx] [distortionstrengthy] [bluramount]: default 0.5 0.5 0.5 0.5 1", (string[] args) => - { - float distortScaleX = 0.5f, distortScaleY = 0.5f; - float distortStrengthX = 0.5f, distortStrengthY = 0.5f; - float blurAmount = 0.0f; - if (args.Length > 0) float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleX); - if (args.Length > 1) float.TryParse(args[1], NumberStyles.Number, CultureInfo.InvariantCulture, out distortScaleY); - if (args.Length > 2) float.TryParse(args[2], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthX); - if (args.Length > 3) float.TryParse(args[3], NumberStyles.Number, CultureInfo.InvariantCulture, out distortStrengthY); - if (args.Length > 4) float.TryParse(args[4], NumberStyles.Number, CultureInfo.InvariantCulture, out blurAmount); - WaterRenderer.DistortionScale = new Vector2(distortScaleX, distortScaleY); - WaterRenderer.DistortionStrength = new Vector2(distortStrengthX, distortStrengthY); - WaterRenderer.BlurAmount = blurAmount; - }, - null, null)); - - - commands.Add(new Command("refreshrect", "Updates the dimensions of the selected items to match the ones defined in the prefab. Applied only in the subeditor.", (string[] args) => - { - //TODO: maybe do this automatically during loading when possible? - if (Screen.Selected == GameMain.SubEditorScreen) - { - if (!MapEntity.SelectedAny) - { - ThrowError("You have to select item(s) first!"); - } - else - { - foreach (var mapEntity in MapEntity.SelectedList) - { - if (mapEntity is Item item) - { - item.Rect = new Rectangle(item.Rect.X, item.Rect.Y, - (int)(item.Prefab.sprite.size.X * item.Prefab.Scale), - (int)(item.Prefab.sprite.size.Y * item.Prefab.Scale)); - } - else if (mapEntity is Structure structure) - { - if (!structure.ResizeHorizontal) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - (int)structure.Prefab.ScaledSize.X, - structure.Rect.Height); - } - if (!structure.ResizeVertical) - { - structure.Rect = new Rectangle(structure.Rect.X, structure.Rect.Y, - structure.Rect.Width, - (int)structure.Prefab.ScaledSize.Y); - } - } - } - } - } - }, isCheat: false)); -#endif - commands.Add(new Command("cleanbuild", "", (string[] args) => { GameMain.Config.MusicVolume = 0.5f; diff --git a/Barotrauma/BarotraumaClient/Source/GameMain.cs b/Barotrauma/BarotraumaClient/Source/GameMain.cs index 3f6d853ee..ded8f0896 100644 --- a/Barotrauma/BarotraumaClient/Source/GameMain.cs +++ b/Barotrauma/BarotraumaClient/Source/GameMain.cs @@ -210,12 +210,7 @@ namespace Barotrauma public void SetWindowMode(WindowMode windowMode) { WindowMode = windowMode; -#if !(OSX) GraphicsDeviceManager.HardwareModeSwitch = Config.WindowMode != WindowMode.BorderlessWindowed; -#else - // Force borderless on macOS. - GraphicsDeviceManager.HardwareModeSwitch = Config.WindowMode != WindowMode.BorderlessWindowed && Config.WindowMode != WindowMode.Fullscreen; -#endif GraphicsDeviceManager.IsFullScreen = Config.WindowMode == WindowMode.Fullscreen || Config.WindowMode == WindowMode.BorderlessWindowed; Window.IsBorderless = !GraphicsDeviceManager.HardwareModeSwitch; diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs index a5968ce0f..1ef20b629 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs @@ -61,120 +61,9 @@ namespace Barotrauma public CrewManager(XElement element, bool isSinglePlayer) : this(isSinglePlayer) { - guiFrame = new GUIFrame(new RectTransform(Vector2.One, GUICanvas.Instance), null, Color.Transparent) + foreach (XElement subElement in element.Elements()) { - CanBeFocused = false - }; - - Point scrollButtonSize = new Point((int)(200 * GUI.Scale), (int)(30 * GUI.Scale)); - - crewArea = new GUIFrame(HUDLayoutSettings.ToRectTransform(HUDLayoutSettings.CrewArea, guiFrame.RectTransform), "", Color.Transparent) - { - CanBeFocused = false - }; - toggleCrewButton = new GUIButton(new RectTransform(new Point((int)(30 * GUI.Scale), HUDLayoutSettings.CrewArea.Height), guiFrame.RectTransform) - { AbsoluteOffset = HUDLayoutSettings.CrewArea.Location }, - "", style: "UIToggleButton"); - toggleCrewButton.OnClicked += (GUIButton btn, object userdata) => - { - toggleCrewAreaOpen = !toggleCrewAreaOpen; - foreach (GUIComponent child in btn.Children) - { - child.SpriteEffects = toggleCrewAreaOpen ? SpriteEffects.None : SpriteEffects.FlipHorizontally; - } - return true; - }; - - characterListBox = new GUIListBox(new RectTransform(new Point(100, (int)(crewArea.Rect.Height - scrollButtonSize.Y * 1.6f)), crewArea.RectTransform, Anchor.CenterLeft), false, Color.Transparent, null) - { - //Spacing = (int)(3 * GUI.Scale), - ScrollBarEnabled = false, - ScrollBarVisible = false, - CanBeFocused = false - }; - - scrollButtonUp = new GUIButton(new RectTransform(scrollButtonSize, crewArea.RectTransform, Anchor.TopLeft, Pivot.TopLeft), "", Alignment.Center, "GUIButtonVerticalArrow") - { - Visible = false, - UserData = -1, - OnClicked = ScrollCharacterList - }; - scrollButtonDown = new GUIButton(new RectTransform(scrollButtonSize, crewArea.RectTransform, Anchor.BottomLeft, Pivot.BottomLeft), "", Alignment.Center, "GUIButtonVerticalArrow") - { - Visible = false, - UserData = 1, - OnClicked = ScrollCharacterList - }; - scrollButtonDown.Children.ForEach(c => c.SpriteEffects = SpriteEffects.FlipVertically); - - if (isSinglePlayer) - { - chatBox = new ChatBox(guiFrame, isSinglePlayer: true) - { - OnEnterMessage = (textbox, text) => - { - if (Character.Controlled == null) { return true; } - - textbox.TextColor = ChatMessage.MessageColor[(int)ChatMessageType.Default]; - - if (!string.IsNullOrWhiteSpace(text)) - { - string msgCommand = ChatMessage.GetChatMessageCommand(text, out string msg); - AddSinglePlayerChatMessage( - Character.Controlled.Info.Name, - 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()) - { - headset.TransmitSignal(stepsTaken: 0, signal: msg, source: headset.Item, sender: Character.Controlled, sendToChat: false); - } - } - textbox.Deselect(); - textbox.Text = ""; - return true; - } - }; - - chatBox.InputBox.OnTextChanged += chatBox.TypingChatMessage; - } - - var reports = Order.PrefabList.FindAll(o => o.TargetAllCharacters && o.SymbolSprite != null); - reportButtonFrame = new GUILayoutGroup(new RectTransform( - new Point((HUDLayoutSettings.CrewArea.Height - (int)((reports.Count - 1) * 5 * GUI.Scale)) / reports.Count, HUDLayoutSettings.CrewArea.Height), guiFrame.RectTransform)) - { - AbsoluteSpacing = (int)(5 * GUI.Scale), - UserData = "reportbuttons", - CanBeFocused = false - }; - - //report buttons - foreach (Order order in reports) - { - if (!order.TargetAllCharacters || order.SymbolSprite == null) continue; - var btn = new GUIButton(new RectTransform(new Point(reportButtonFrame.Rect.Width), reportButtonFrame.RectTransform), style: null) - { - OnClicked = (GUIButton button, object userData) => - { - if (Character.Controlled == null || Character.Controlled.SpeechImpediment >= 100.0f) return false; - SetCharacterOrder(null, order, null, Character.Controlled); - HumanAIController.PropagateHullSafety(Character.Controlled, Character.Controlled.CurrentHull); - return true; - }, - UserData = order, - ToolTip = order.Name - }; - - new GUIFrame(new RectTransform(new Vector2(1.5f), btn.RectTransform, Anchor.Center), "OuterGlow") - { - Color = Color.Red * 0.8f, - HoverColor = Color.Red * 1.0f, - PressedColor = Color.Red * 0.6f, - UserData = "highlighted", - CanBeFocused = false, - Visible = false - }; + if (subElement.Name.ToString().ToLowerInvariant() != "character") continue; var characterInfo = new CharacterInfo(subElement); characterInfos.Add(characterInfo); @@ -185,20 +74,6 @@ namespace Barotrauma break; } } - - screenResolution = new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight); - - prevUIScale = GUI.Scale; - } - - - #endregion - - #region Character list management - - public Rectangle GetCharacterListArea() - { - return characterListBox.Rect; } partial void InitProjectSpecific() @@ -713,7 +588,7 @@ namespace Barotrauma characterListBox.BarScroll -= characterListBox.BarScroll % step; characterListBox.BarScroll += dir * step; - return radioItem.GetComponent(); + return false; } private IEnumerable KillCharacterAnim(GUIComponent component) @@ -726,12 +601,6 @@ namespace Barotrauma { comp.Color = Color.DarkRed; } - List availableSpeakers = Character.CharacterList.FindAll(c => - c.AIController is HumanAIController && - !c.IsDead && - c.SpeechImpediment <= 100.0f); - pendingConversationLines.AddRange(NPCConversation.CreateRandom(availableSpeakers)); - } yield return new WaitForSeconds(1.0f); @@ -1384,16 +1253,6 @@ namespace Barotrauma if (GameMain.NetworkMember != null) GameMain.Client.SelectCrewCharacter(character, previewPlayer); - private bool ReportButtonClicked(GUIButton button, object userData) - { - //order targeted to all characters - Order order = userData as Order; - if (order.TargetAllCharacters) - { - if (Character.Controlled == null || Character.Controlled.CurrentHull == null) return false; - AddOrder(new Order(order.Prefab, Character.Controlled.CurrentHull, null), order.Prefab.FadeOutTime); - SetCharacterOrder(null, order, "", Character.Controlled); - } return true; } diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs index b3c2fdc42..0ab86bef6 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs @@ -4,6 +4,7 @@ using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.Linq; +using System.Xml.Linq; namespace Barotrauma { @@ -229,7 +230,10 @@ namespace Barotrauma campaign.lastUpdateID = updateID; } } + + public override void Save(XElement element) + { + //do nothing, the clients get the save files from the server + } } - - } diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameSession.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameSession.cs index 16a57092d..2950e988f 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameSession.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameSession.cs @@ -141,9 +141,6 @@ namespace Barotrauma infoFrame?.UpdateManually(deltaTime); } - infoFrame?.UpdateManually(deltaTime); - } - public void Draw(SpriteBatch spriteBatch) { if (GUI.DisableHUD) return; diff --git a/Barotrauma/BarotraumaClient/Source/GameSettings.cs b/Barotrauma/BarotraumaClient/Source/GameSettings.cs index 00085898f..4ee4ab87e 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSettings.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSettings.cs @@ -47,7 +47,7 @@ namespace Barotrauma //if "%" is found if (index > 0) { - while (true) + while (index > 0) { //search for end of label index -= 1; @@ -439,7 +439,6 @@ namespace Barotrauma } }; #endif - var radioButtonFrame = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.6f), voiceSettings.RectTransform)) { Stretch = true, @@ -458,6 +457,24 @@ namespace Barotrauma voiceMode.AddRadioButton((VoiceMode)i, tick); } + var micVolumeText = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.18f), voiceSettings.RectTransform), TextManager.Get("MicrophoneVolume")); + var micVolumeSlider = new GUIScrollBar(new RectTransform(new Vector2(1.0f, 0.18f), voiceSettings.RectTransform), + barSize: 0.1f) + { + UserData = micVolumeText, + BarScroll = (float)Math.Sqrt(MathUtils.InverseLerp(0.2f, 5.0f, MicrophoneVolume)), + OnMoved = (scrollBar, scroll) => + { + MicrophoneVolume = MathHelper.Lerp(0.2f, 5.0f, scroll * scroll); + MicrophoneVolume = (float)Math.Round(MicrophoneVolume, 1); + ChangeSliderText(scrollBar, MicrophoneVolume); + scrollBar.Step = 0.05f; + return true; + }, + Step = 0.05f + }; + micVolumeSlider.OnMoved(micVolumeSlider, micVolumeSlider.BarScroll); + var voiceInputContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.5f, 0.2f), voiceSettings.RectTransform, Anchor.BottomCenter)); new GUITextBlock(new RectTransform(new Vector2(0.6f, 1.0f), voiceInputContainer.RectTransform), TextManager.Get("InputType.Voice") + ": "); var voiceKeyBox = new GUITextBox(new RectTransform(new Vector2(0.4f, 1.0f), voiceInputContainer.RectTransform, Anchor.TopRight), @@ -469,7 +486,6 @@ namespace Barotrauma voiceKeyBox.SelectedColor = Color.Gold * 0.3f; var voiceActivityGroup = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.3f), voiceSettings.RectTransform)); - GUITextBlock noiseGateText = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.5f), voiceActivityGroup.RectTransform), TextManager.Get("NoiseGateThreshold")) { TextGetter = () => @@ -509,13 +525,13 @@ namespace Barotrauma if (GameMain.Client == null && VoipCapture.Instance == null) { VoipCapture.Create(GameMain.Config.VoiceCaptureDevice); - } - if (VoipCapture.Instance == null) - { - VoiceSetting = vMode = VoiceMode.Disabled; - voiceInputContainer.Visible = false; - voiceActivityGroup.Visible = false; - return; + if (VoipCapture.Instance == null) + { + VoiceSetting = vMode = VoiceMode.Disabled; + voiceInputContainer.Visible = false; + voiceActivityGroup.Visible = false; + return; + } } } else @@ -615,16 +631,6 @@ namespace Barotrauma .Replace("[missingfiletypes]", string.Join(", ", missingContentTypes)); } } - languageDD.SelectItem(TextManager.Language); - languageDD.OnSelected = (guiComponent, obj) => - { - string newLanguage = obj as string; - if (newLanguage == Language) return true; - - UnsavedSettings = true; - Language = newLanguage; - - new GUIMessageBox(TextManager.Get("RestartRequiredLabel"), TextManager.Get("RestartRequiredLanguage")); //spacing new GUIFrame(new RectTransform(new Vector2(1.0f, 0.02f), generalLayoutGroup.RectTransform), style: null); diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs index 72589ccf5..c6732589d 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs @@ -25,15 +25,6 @@ namespace Barotrauma.Items.Components public readonly ActionType Type; public string VolumeProperty; - public float VolumeMultiplier - { - get { return RoundSound.Volume; } - } - - public float Range - { - get { return RoundSound.Range; } - } public float VolumeMultiplier { @@ -198,20 +189,20 @@ namespace Barotrauma.Items.Components { if (loopingSoundChannel != null) { - loopingSoundChannel.Dispose(); loopingSoundChannel = null; + loopingSoundChannel.FadeOutAndDispose(); loopingSoundChannel = null; } return; } if (loopingSoundChannel != null && loopingSoundChannel.Sound != loopingSound.RoundSound.Sound) { - loopingSoundChannel.Dispose(); loopingSoundChannel = null; + loopingSoundChannel.FadeOutAndDispose(); loopingSoundChannel = null; } if (loopingSoundChannel == null || !loopingSoundChannel.IsPlaying) { loopingSoundChannel = loopingSound.RoundSound.Sound.Play( new Vector3(position.X, position.Y, 0.0f), - GetSoundVolume(loopingSound), + 0.01f, SoundPlayer.ShouldMuffleSound(Character.Controlled, position, loopingSound.Range, Character.Controlled?.CurrentHull)); loopingSoundChannel.Looping = true; //TODO: tweak @@ -226,7 +217,9 @@ namespace Barotrauma.Items.Components lastMuffleCheckTime = (float)Timing.TotalTime; } loopingSoundChannel.Muffled = shouldMuffleLooping; - loopingSoundChannel.Gain = GetSoundVolume(loopingSound); + float targetGain = GetSoundVolume(loopingSound); + float gainDiff = targetGain - loopingSoundChannel.Gain; + loopingSoundChannel.Gain += Math.Abs(gainDiff) < 0.1f ? gainDiff : Math.Sign(gainDiff) * 0.1f; loopingSoundChannel.Position = new Vector3(position.X, position.Y, 0.0f); } return; @@ -279,13 +272,13 @@ namespace Barotrauma.Items.Components loopingSound = itemSound; if (loopingSoundChannel != null && loopingSoundChannel.Sound != loopingSound.RoundSound.Sound) { - loopingSoundChannel.Dispose(); loopingSoundChannel = null; + loopingSoundChannel.FadeOutAndDispose(); loopingSoundChannel = null; } if (loopingSoundChannel == null || !loopingSoundChannel.IsPlaying) { loopingSoundChannel = loopingSound.RoundSound.Sound.Play( new Vector3(position.X, position.Y, 0.0f), - GetSoundVolume(loopingSound), + 0.01f, muffle: SoundPlayer.ShouldMuffleSound(Character.Controlled, position, loopingSound.Range, Character.Controlled?.CurrentHull)); loopingSoundChannel.Looping = true; //TODO: tweak @@ -309,7 +302,7 @@ namespace Barotrauma.Items.Components if (loopingSoundChannel != null) { - loopingSoundChannel.Dispose(); + loopingSoundChannel.FadeOutAndDispose(); loopingSoundChannel = null; loopingSound = null; } diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs index 68d2a9b90..19882d141 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs @@ -392,12 +392,12 @@ namespace Barotrauma.Items.Components Vector2 pos = new Vector2(rect.Center.X, rect.Y + meterSprite.Origin.Y * scale); Vector2 optimalRangeNormalized = new Vector2( - (optimalRange.X - range.X) / (range.Y - range.X), - (optimalRange.Y - range.X) / (range.Y - range.X)); + MathHelper.Clamp((optimalRange.X - range.X) / (range.Y - range.X), 0.0f, 0.95f), + MathHelper.Clamp((optimalRange.Y - range.X) / (range.Y - range.X), 0.0f, 1.0f)); Vector2 allowedRangeNormalized = new Vector2( - (allowedRange.X - range.X) / (range.Y - range.X), - (allowedRange.Y - range.X) / (range.Y - range.X)); + MathHelper.Clamp((allowedRange.X - range.X) / (range.Y - range.X), 0.0f, 0.95f), + MathHelper.Clamp((allowedRange.Y - range.X) / (range.Y - range.X), 0.0f, 1.0f)); Vector2 sectorRad = new Vector2(-1.57f, 1.57f); @@ -417,10 +417,10 @@ namespace Barotrauma.Items.Components { spriteBatch.End(); Rectangle prevScissorRect = spriteBatch.GraphicsDevice.ScissorRectangle; - spriteBatch.GraphicsDevice.ScissorRectangle = new Rectangle(0,0,GameMain.GraphicsWidth, (int)(pos.Y + (meterSprite.size.Y - meterSprite.Origin.Y) * scale)); + spriteBatch.GraphicsDevice.ScissorRectangle = new Rectangle(0, 0, GameMain.GraphicsWidth, (int)(pos.Y + (meterSprite.size.Y - meterSprite.Origin.Y) * scale) - 3); spriteBatch.Begin(SpriteSortMode.Deferred, rasterizerState: GameMain.ScissorTestEnable); - sectorSprite.Draw(spriteBatch, pos, Color.LightGreen, MathHelper.PiOver2, scale); + sectorSprite.Draw(spriteBatch, pos, Color.LightGreen, MathHelper.PiOver2 + (allowedSectorRad.X + allowedSectorRad.Y) / 2.0f, scale); sectorSprite.Draw(spriteBatch, pos, Color.Orange, optimalSectorRad.X, scale); sectorSprite.Draw(spriteBatch, pos, Color.Red, allowedSectorRad.X, scale); diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs index 99072f14b..4ed31820f 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs @@ -156,7 +156,7 @@ namespace Barotrauma.Items.Components { if (moveSound != null) { - moveSoundChannel.Dispose(); + moveSoundChannel.FadeOutAndDispose(); moveSoundChannel = SoundPlayer.PlaySound(moveSound.Sound, moveSound.Volume, moveSound.Range, item.WorldPosition); if (moveSoundChannel != null) moveSoundChannel.Looping = true; } @@ -168,13 +168,13 @@ namespace Barotrauma.Items.Components { if (endMoveSound != null && moveSoundChannel.Sound != endMoveSound.Sound) { - moveSoundChannel.Dispose(); + moveSoundChannel.FadeOutAndDispose(); moveSoundChannel = SoundPlayer.PlaySound(endMoveSound.Sound, endMoveSound.Volume, endMoveSound.Range, item.WorldPosition); if (moveSoundChannel != null) moveSoundChannel.Looping = false; } else if (!moveSoundChannel.IsPlaying) { - moveSoundChannel.Dispose(); + moveSoundChannel.FadeOutAndDispose(); moveSoundChannel = null; } @@ -288,7 +288,10 @@ namespace Barotrauma.Items.Components availableAmmo.AddRange(itemContainer.Inventory.Items); } - float chargeRate = powerConsumption <= 0.0f ? 1.0f : batteryCharge / batteryCapacity; + float chargeRate = + powerConsumption <= 0.0f ? + 1.0f : + batteryCapacity > 0.0f ? batteryCharge / batteryCapacity : 0.0f; bool charged = batteryCharge * 3600.0f > powerConsumption; bool readyToFire = reload <= 0.0f && charged && availableAmmo.Any(p => p != null); if (ShowChargeIndicator && PowerConsumption > 0.0f) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Item.cs b/Barotrauma/BarotraumaClient/Source/Items/Item.cs index 2f1a0c511..40af52153 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Item.cs @@ -158,7 +158,7 @@ namespace Barotrauma if (!Visible || (!editing && hiddenInGame)) return; if (editing && !ShowItems) return; - Color color = isHighlighted && !GUI.DisableItemHighlights ? Color.Orange : GetSpriteColor(); + Color color = isHighlighted && !GUI.DisableItemHighlights && Screen.Selected != GameMain.GameScreen ? Color.Orange : GetSpriteColor(); //if (IsSelected && editing) color = Color.Lerp(color, Color.Gold, 0.5f); Sprite activeSprite = prefab.sprite; @@ -410,8 +410,7 @@ namespace Barotrauma return true; } } - } - + } } public override void UpdateEditing(Camera cam) @@ -483,17 +482,44 @@ namespace Barotrauma linkText.TextColor = Color.Yellow; itemsText.TextColor = Color.Yellow; } - if (!inGame && Sprite != null) + + if (!inGame) { - var reloadTextureButton = new GUIButton(new RectTransform(new Point(editingHUD.Rect.Width / 2, 20)), TextManager.Get("ReloadSprite")); - reloadTextureButton.OnClicked += (button, data) => + var buttonContainer = new GUILayoutGroup(new RectTransform(new Point(listBox.Content.Rect.Width, 20)), isHorizontal: true) { - Sprite.ReloadXML(); - Sprite.ReloadTexture(); - return true; + Stretch = true, + RelativeSpacing = 0.02f }; - itemEditor.AddCustomContent(reloadTextureButton, itemEditor.ContentCount); - } + new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityX")) + { + ToolTip = TextManager.Get("MirrorEntityXToolTip"), + OnClicked = (button, data) => + { + FlipX(relativeToSub: false); + return true; + } + }; + new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityY")) + { + ToolTip = TextManager.Get("MirrorEntityYToolTip"), + OnClicked = (button, data) => + { + FlipY(relativeToSub: false); + return true; + } + }; + if (Sprite != null) + { + var reloadTextureButton = new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), buttonContainer.RectTransform), TextManager.Get("ReloadSprite")); + reloadTextureButton.OnClicked += (button, data) => + { + Sprite.ReloadXML(); + Sprite.ReloadTexture(); + return true; + }; + } + itemEditor.AddCustomContent(buttonContainer, itemEditor.ContentCount); + } foreach (ItemComponent ic in components) { diff --git a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs index 5f0b72f2e..609974556 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs @@ -599,61 +599,5 @@ namespace Barotrauma } } } - - public void ClientRead(ServerNetObject type, NetBuffer message, float sendingTime) - { - float newWaterVolume = message.ReadRangedSingle(0.0f, 1.5f, 8) * Volume; - float newOxygenPercentage = message.ReadRangedSingle(0.0f, 100.0f, 8); - - bool hasFireSources = message.ReadBoolean(); - int fireSourceCount = 0; - List newFireSources = new List(); - if (hasFireSources) - { - fireSourceCount = message.ReadRangedInteger(0, 16); - for (int i = 0; i < fireSourceCount; i++) - { - newFireSources.Add(new Vector3( - MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f), - MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f), - message.ReadRangedSingle(0.0f, 1.0f, 8))); - } - } - - if (serverUpdateDelay > 0.0f) { return; } - - WaterVolume = newWaterVolume; - OxygenPercentage = newOxygenPercentage; - - for (int i = 0; i < fireSourceCount; i++) - { - Vector2 pos = new Vector2( - rect.X + rect.Width * newFireSources[i].X, - rect.Y - rect.Height + (rect.Height * newFireSources[i].Y)); - float size = newFireSources[i].Z * rect.Width; - - var newFire = i < FireSources.Count ? - FireSources[i] : - new FireSource(Submarine == null ? pos : pos + Submarine.Position, null, true); - newFire.Position = pos; - newFire.Size = new Vector2(size, newFire.Size.Y); - - //ignore if the fire wasn't added to this room (invalid position)? - if (!FireSources.Contains(newFire)) - { - newFire.Remove(); - continue; - } - } - - for (int i = FireSources.Count - 1; i >= fireSourceCount; i--) - { - FireSources[i].Remove(); - if (i < FireSources.Count) - { - FireSources.RemoveAt(i); - } - } - } } } diff --git a/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelObjects/LevelObject.cs b/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelObjects/LevelObject.cs index 61fccf5b8..aca975434 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelObjects/LevelObject.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Levels/LevelObjects/LevelObject.cs @@ -211,7 +211,7 @@ namespace Barotrauma } else if (SoundChannels[i] != null && SoundChannels[i].IsPlaying) { - SoundChannels[i].Dispose(); + SoundChannels[i].FadeOutAndDispose(); SoundChannels[i] = null; } } diff --git a/Barotrauma/BarotraumaClient/Source/Map/Lights/LightManager.cs b/Barotrauma/BarotraumaClient/Source/Map/Lights/LightManager.cs index fcc45f7dc..c61e3821d 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Lights/LightManager.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Lights/LightManager.cs @@ -43,11 +43,19 @@ namespace Barotrauma.Lights get; private set; } + public RenderTarget2D HighlightMap + { + get; + private set; + } + + private readonly Texture2D highlightRaster; private BasicEffect lightEffect; public Effect LosEffect { get; private set; } - + public Effect SolidColorEffect { get; private set; } + private List lights; public bool LosEnabled = true; @@ -58,7 +66,6 @@ namespace Barotrauma.Lights public bool ObstructVision; private Texture2D visionCircle; - private Dictionary hullAmbientLights; private Dictionary smoothedHullAmbientLights; @@ -73,6 +80,8 @@ namespace Barotrauma.Lights visionCircle = Sprite.LoadTexture("Content/Lights/visioncircle.png"); + highlightRaster = Sprite.LoadTexture("Content/UI/HighlightRaster.png"); + CreateRenderTargets(graphics); GameMain.Instance.OnResolutionChanged += () => { @@ -81,8 +90,10 @@ namespace Barotrauma.Lights #if WINDOWS LosEffect = content.Load("Effects/losshader"); + SolidColorEffect = content.Load("Effects/solidcolor"); #else LosEffect = content.Load("Effects/losshader_opengl"); + SolidColorEffect = content.Load("Effects/solidcolor_opengl"); #endif if (lightEffect == null) @@ -117,6 +128,12 @@ namespace Barotrauma.Lights pp.BackBufferFormat, pp.DepthStencilFormat, pp.MultiSampleCount, RenderTargetUsage.DiscardContents); + HighlightMap?.Dispose(); + HighlightMap = new RenderTarget2D(graphics, + (int)(GameMain.GraphicsWidth * GameMain.Config.LightMapScale), (int)(GameMain.GraphicsHeight * GameMain.Config.LightMapScale), false, + pp.BackBufferFormat, pp.DepthStencilFormat, pp.MultiSampleCount, + RenderTargetUsage.DiscardContents); + LosTexture?.Dispose(); LosTexture = new RenderTarget2D(graphics, (int)(GameMain.GraphicsWidth * GameMain.Config.LightMapScale), (int)(GameMain.GraphicsHeight * GameMain.Config.LightMapScale), false, SurfaceFormat.Color, DepthFormat.None); } @@ -176,7 +193,7 @@ namespace Barotrauma.Lights public void UpdateLightMap(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam, RenderTarget2D backgroundObstructor = null) { if (!LightingEnabled) return; - + if (Math.Abs(currLightMapScale - GameMain.Config.LightMapScale) > 0.01f) { //lightmap scale has changed -> recreate render targets @@ -187,6 +204,8 @@ namespace Barotrauma.Lights Matrix transform = cam.ShaderTransform * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f; + bool highlightsVisible = UpdateHighlights(graphics, spriteBatch, spriteBatchTransform, cam); + if (GameMain.Config.SpecularityEnabled) { UpdateSpecularMap(graphics, spriteBatch, spriteBatchTransform, cam, backgroundObstructor); @@ -211,7 +230,6 @@ namespace Barotrauma.Lights graphics.Clear(Color.Black); graphics.BlendState = BlendState.Additive; - //draw background lights //--------------------------------------------------------------------------------------------------- bool backgroundSpritesDrawn = false; @@ -260,31 +278,7 @@ namespace Barotrauma.Lights //draw the focused item and character to highlight them, //and light sprites (done before drawing the actual light volumes so we can make characters obstruct the highlights and sprites) //--------------------------------------------------------------------------------------------------- - spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, transformMatrix: spriteBatchTransform); - - if (Character.Controlled != null) - { - if (Character.Controlled.FocusedItem != null) - { - Character.Controlled.FocusedItem.IsHighlighted = true; - } - if (Character.Controlled.FocusedCharacter != null) - { - Character.Controlled.FocusedCharacter.Draw(spriteBatch, cam); - } - - if (!GUI.DisableItemHighlights) - { - foreach (Item item in Item.ItemList) - { - if (item.IsHighlighted) - { - item.Draw(spriteBatch, false, true); - } - } - } - } - + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, transformMatrix: spriteBatchTransform); foreach (LightSource light in activeLights) { if (light.IsBackground) continue; @@ -292,6 +286,13 @@ namespace Barotrauma.Lights } spriteBatch.End(); + if (highlightsVisible) + { + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive); + spriteBatch.Draw(HighlightMap, Vector2.Zero, Color.White); + spriteBatch.End(); + } + //draw characters to obstruct the highlighted items/characters and light sprites //--------------------------------------------------------------------------------------------------- spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, transformMatrix: spriteBatchTransform); @@ -377,13 +378,95 @@ namespace Barotrauma.Lights graphics.BlendState = BlendState.AlphaBlend; } + private readonly List highlightedEntities = new List(); + + private bool UpdateHighlights(GraphicsDevice graphics, SpriteBatch spriteBatch, Matrix spriteBatchTransform, Camera cam) + { + if (GUI.DisableItemHighlights) { return false; } + + highlightedEntities.Clear(); + if (Character.Controlled != null) + { + if (Character.Controlled.FocusedItem != null) + { + highlightedEntities.Add(Character.Controlled.FocusedItem); + } + if (Character.Controlled.FocusedCharacter != null) + { + highlightedEntities.Add(Character.Controlled.FocusedCharacter); + } + foreach (Item item in Item.ItemList) + { + if (item.IsHighlighted && !highlightedEntities.Contains(item)) + { + highlightedEntities.Add(item); + } + } + } + if (highlightedEntities.Count == 0) { return false; } + + //draw characters in light blue first + graphics.SetRenderTarget(HighlightMap); + SolidColorEffect.CurrentTechnique = SolidColorEffect.Techniques["SolidColor"]; + SolidColorEffect.Parameters["color"].SetValue(Color.LightBlue.ToVector4()); + SolidColorEffect.CurrentTechnique.Passes[0].Apply(); + DeformableSprite.Effect.CurrentTechnique = DeformableSprite.Effect.Techniques["DeformShaderSolidColor"]; + DeformableSprite.Effect.Parameters["solidColor"].SetValue(Color.LightBlue.ToVector4()); + DeformableSprite.Effect.CurrentTechnique.Passes[0].Apply(); + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, samplerState: SamplerState.LinearWrap, effect: SolidColorEffect, transformMatrix: spriteBatchTransform); + foreach (Entity highlighted in highlightedEntities) + { + if (highlighted is Item item) + { + item.Draw(spriteBatch, false, true); + } + else if (highlighted is Character character) + { + character.Draw(spriteBatch, cam); + } + } + spriteBatch.End(); + + //draw characters in black with a bit of blur, leaving the white edges visible + float phase = (float)(Math.Sin(Timing.TotalTime * 3.0f) + 1.0f) / 2.0f; //phase oscillates between 0 and 1 + Vector4 overlayColor = Color.Black.ToVector4() * MathHelper.Lerp(0.5f, 0.9f, phase); + SolidColorEffect.Parameters["color"].SetValue(overlayColor); + SolidColorEffect.CurrentTechnique = SolidColorEffect.Techniques["SolidColorBlur"]; + SolidColorEffect.CurrentTechnique.Passes[0].Apply(); + DeformableSprite.Effect.Parameters["solidColor"].SetValue(overlayColor); + DeformableSprite.Effect.CurrentTechnique.Passes[0].Apply(); + spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, samplerState: SamplerState.LinearWrap, effect: SolidColorEffect, transformMatrix: spriteBatchTransform); + foreach (Entity highlighted in highlightedEntities) + { + if (highlighted is Item item) + { + SolidColorEffect.Parameters["blurDistance"].SetValue(0.02f); + item.Draw(spriteBatch, false, true); + } + else if (highlighted is Character character) + { + SolidColorEffect.Parameters["blurDistance"].SetValue(0.05f); + character.Draw(spriteBatch, cam); + } + } + spriteBatch.End(); + + //raster pattern on top of everything + spriteBatch.Begin(blendState: BlendState.AlphaBlend, samplerState: SamplerState.LinearWrap); + spriteBatch.Draw(highlightRaster, new Rectangle(0, 0, HighlightMap.Width, HighlightMap.Height), new Rectangle(0, 0, HighlightMap.Width, HighlightMap.Height), Color.White * 0.5f); + spriteBatch.End(); + + DeformableSprite.Effect.CurrentTechnique = DeformableSprite.Effect.Techniques["DeformShader"]; + + return true; + } public void UpdateSpecularMap(GraphicsDevice graphics, SpriteBatch spriteBatch, Matrix spriteBatchTransform, Camera cam, RenderTarget2D backgroundObstructor = null) { graphics.SetRenderTarget(SpecularMap); //clear the lightmap - graphics.Clear(Color.Black); + graphics.Clear(Color.Gray); graphics.BlendState = BlendState.AlphaBlend; spriteBatch.Begin(sortMode: SpriteSortMode.Deferred, blendState: BlendState.AlphaBlend, transformMatrix: spriteBatchTransform); @@ -394,20 +477,31 @@ namespace Barotrauma.Lights } spriteBatch.End(); - //TODO: specular maps for level walls Level.Loaded?.Renderer?.RenderWalls(graphics, cam, specular: true); - spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend); + DeformableSprite.Effect.CurrentTechnique = DeformableSprite.Effect.Techniques["DeformShaderSolidColor"]; + DeformableSprite.Effect.Parameters["solidColor"].SetValue(Color.Gray.ToVector4()); + DeformableSprite.Effect.CurrentTechnique.Passes[0].Apply(); + + //obstruct specular maps behind the sub and characters by drawing them on the map in solid gray + SolidColorEffect.CurrentTechnique = SolidColorEffect.Techniques["SolidColor"]; + SolidColorEffect.Parameters["color"].SetValue(Color.Gray.ToVector4()); + SolidColorEffect.CurrentTechnique.Passes[0].Apply(); + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, effect: SolidColorEffect); if (backgroundObstructor != null) { spriteBatch.Draw(backgroundObstructor, new Rectangle(0, 0, - (int)(GameMain.GraphicsWidth * currLightMapScale), (int)(GameMain.GraphicsHeight * currLightMapScale)), Color.Black); + (int)(GameMain.GraphicsWidth * currLightMapScale), (int)(GameMain.GraphicsHeight * currLightMapScale)), Color.White); + } + foreach (Character c in Character.CharacterList) + { + if (c.Enabled) { c.Draw(spriteBatch, cam); } } - GUI.DrawRectangle(spriteBatch, new Rectangle(0, 0, - (int)(GameMain.GraphicsWidth * currLightMapScale), (int)(GameMain.GraphicsHeight * currLightMapScale)), - Color.White * 0.4f, isFilled: true); spriteBatch.End(); + + DeformableSprite.Effect.CurrentTechnique = DeformableSprite.Effect.Techniques["DeformShader"]; + graphics.SetRenderTarget(null); graphics.BlendState = BlendState.AlphaBlend; } diff --git a/Barotrauma/BarotraumaClient/Source/Map/MapEntity.cs b/Barotrauma/BarotraumaClient/Source/Map/MapEntity.cs index 1f4a3bbd7..e8a491973 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/MapEntity.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/MapEntity.cs @@ -549,7 +549,6 @@ namespace Barotrauma if ((PlayerInput.KeyDown(Keys.LeftControl) || PlayerInput.KeyDown(Keys.RightControl))) { - //TODO: a UI button for flipping entities if (PlayerInput.KeyHit(Keys.N)) { float minX = selectedList[0].WorldRect.X, maxX = selectedList[0].WorldRect.Right; diff --git a/Barotrauma/BarotraumaClient/Source/Map/Structure.cs b/Barotrauma/BarotraumaClient/Source/Map/Structure.cs index 65cfd37c9..bf0d8126a 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Structure.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Structure.cs @@ -92,15 +92,41 @@ namespace Barotrauma editingHUD = new GUIFrame(new RectTransform(new Vector2(0.3f, 0.25f), GUI.Canvas, Anchor.CenterRight) { MinSize = new Point(400, 0) }) { UserData = this }; GUIListBox listBox = new GUIListBox(new RectTransform(new Vector2(0.95f, 0.8f), editingHUD.RectTransform, Anchor.Center), style: null); var editor = new SerializableEntityEditor(listBox.Content.RectTransform, this, inGame, showName: true, elementHeight: 20); - var reloadTextureButton = new GUIButton(new RectTransform(new Point(editingHUD.Rect.Width / 2, 20)), TextManager.Get("ReloadSprite")); - reloadTextureButton.OnClicked += (button, data) => - { - Sprite.ReloadXML(); - Sprite.ReloadTexture(); - return true; - }; - editor.AddCustomContent(reloadTextureButton, editor.ContentCount); + var buttonContainer = new GUILayoutGroup(new RectTransform(new Point(listBox.Content.Rect.Width, 20)), isHorizontal: true) + { + Stretch = true, + RelativeSpacing = 0.02f + }; + new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityX")) + { + ToolTip = TextManager.Get("MirrorEntityXToolTip"), + OnClicked = (button, data) => + { + FlipX(relativeToSub: false); + return true; + } + }; + new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityY")) + { + ToolTip = TextManager.Get("MirrorEntityYToolTip"), + OnClicked = (button, data) => + { + FlipY(relativeToSub: false); + return true; + } + }; + var reloadTextureButton = new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), buttonContainer.RectTransform), TextManager.Get("ReloadSprite")) + { + OnClicked = (button, data) => + { + Sprite.ReloadXML(); + Sprite.ReloadTexture(); + return true; + } + }; + editor.AddCustomContent(buttonContainer, editor.ContentCount); + PositionEditingHUD(); return editingHUD; diff --git a/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs b/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs index 982066597..0e5dc2aed 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs @@ -405,6 +405,11 @@ namespace Barotrauma errorMsgs.Add(TextManager.Get("NoBallastTagsWarning")); } + if (Gap.GapList.Any(g => g.linkedTo.Count == 0)) + { + errorMsgs.Add(TextManager.Get("NonLinkedGapsWarning")); + } + if (errorMsgs.Any()) { new GUIMessageBox(TextManager.Get("Warning"), string.Join("\n\n", errorMsgs), 400, 0); diff --git a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs index 98b7cd3bc..deebab3d5 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs @@ -84,7 +84,7 @@ namespace Barotrauma.Networking { get { return fileReceiver; } } - + public bool MidRoundSyncing { get { return entityEventManager.MidRoundSyncing; } @@ -321,18 +321,17 @@ namespace Barotrauma.Networking // Loop until we are approved //TODO: show the name of the server instead of IP when connecting through the server list (more streamer-friendly) - string connectingText = TextManager.Get("ConnectingTo").Replace("[serverip]", serverIP); + string connectingText = TextManager.Get("Connecting"); while (!CanStart && !connectCancelled) { if (reconnectBox == null) { - reconnectBox = new GUIMessageBox(TextManager.Get("Connecting"), connectingText, new string[] { TextManager.Get("Cancel") }); - + reconnectBox = new GUIMessageBox(connectingText, TextManager.Get("ConnectingTo").Replace("[serverip]", serverIP), new string[] { TextManager.Get("Cancel") }); reconnectBox.Buttons[0].OnClicked += CancelConnect; reconnectBox.Buttons[0].OnClicked += reconnectBox.Close; } - reconnectBox.Text.Text = connectingText + new string('.', ((int)Timing.TotalTime % 3 + 1)); + reconnectBox.Header.Text = connectingText + new string('.', ((int)Timing.TotalTime % 3 + 1)); if (DateTime.Now > reqAuthTime) { @@ -540,6 +539,7 @@ namespace Barotrauma.Networking GameMain.NetLobbyScreen.Select(); } connected = true; + chatBox.InputBox.Enabled = true; if (GameMain.NetLobbyScreen?.TextBox != null) { GameMain.NetLobbyScreen.TextBox.Enabled = true; @@ -832,6 +832,8 @@ namespace Barotrauma.Networking DisconnectReason disconnectReason = DisconnectReason.Unknown; if (splitMsg.Length > 0) Enum.TryParse(splitMsg[0], out disconnectReason); + DebugConsole.NewMessage("Received a disconnect message (" + disconnectMsg + ")"); + if (disconnectReason == DisconnectReason.ServerFull) { //already waiting for a slot to free up, do nothing @@ -861,22 +863,19 @@ namespace Barotrauma.Networking waitInServerQueueBox = null; CoroutineManager.StopCoroutines("WaitInServerQueue"); } - else - { - string msg = ""; - if (disconnectReason == DisconnectReason.Unknown) - { - msg = disconnectMsg; - } - else - { - msg = TextManager.Get("DisconnectReason." + disconnectReason.ToString()); if (allowReconnect && disconnectReason == DisconnectReason.Unknown) { + DebugConsole.NewMessage("Attempting to reconnect..."); + + string msg = TextManager.GetServerMessage(disconnectMsg); + msg = string.IsNullOrWhiteSpace(msg) ? + TextManager.Get("ConnectionLostReconnecting") : + msg + '\n' + TextManager.Get("ConnectionLostReconnecting"); + reconnectBox = new GUIMessageBox( TextManager.Get("ConnectionLost"), - TextManager.Get("ConnectionLostReconnecting"), new string[0]); + msg, new string[0]); connected = false; ConnectToServer(serverIP); } @@ -885,10 +884,12 @@ namespace Barotrauma.Networking string msg = ""; if (disconnectReason == DisconnectReason.Unknown) { + DebugConsole.NewMessage("Do not attempt reconnect (not allowed)."); msg = disconnectMsg; } else { + DebugConsole.NewMessage("Do not attempt to reconnect (DisconnectReason doesn't allow reconnection)."); msg = TextManager.Get("DisconnectReason." + disconnectReason.ToString()); for (int i = 1; i < splitMsg.Length; i++) @@ -923,25 +924,6 @@ namespace Barotrauma.Networking } yield return new WaitForSeconds(0.5f); } - } - - waitInServerQueueBox?.Close(); - waitInServerQueueBox = null; - - yield return CoroutineStatus.Success; - } - - - private void ReadAchievement(NetIncomingMessage inc) - { - string achievementIdentifier = inc.ReadString(); - SteamAchievementManager.UnlockAchievement(achievementIdentifier); - } - - private void ReadPermissions(NetIncomingMessage inc) - { - List permittedConsoleCommands = new List(); - byte clientID = inc.ReadByte(); waitInServerQueueBox?.Close(); waitInServerQueueBox = null; @@ -1192,7 +1174,7 @@ namespace Barotrauma.Networking gameStarted = inc.ReadBoolean(); bool allowSpectating = inc.ReadBoolean(); - + ReadPermissions(inc); if (gameStarted) @@ -1324,12 +1306,6 @@ namespace Barotrauma.Networking byte botCount = inc.ReadByte(); BotSpawnMode botSpawnMode = inc.ReadBoolean() ? BotSpawnMode.Fill : BotSpawnMode.Normal; - byte botCount = inc.ReadByte(); - BotSpawnMode botSpawnMode = inc.ReadBoolean() ? BotSpawnMode.Fill : BotSpawnMode.Normal; - - byte botCount = inc.ReadByte(); - BotSpawnMode botSpawnMode = inc.ReadBoolean() ? BotSpawnMode.Fill : BotSpawnMode.Normal; - bool autoRestartEnabled = inc.ReadBoolean(); float autoRestartTimer = autoRestartEnabled ? inc.ReadFloat() : 0.0f; @@ -1496,7 +1472,7 @@ namespace Barotrauma.Networking prevBytePos = inc.PositionInBytes; } } - + private void SendLobbyUpdate() { NetOutgoingMessage outmsg = client.CreateMessage(); diff --git a/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs b/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs index 2f85beaf6..bd1df6c87 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/Voip/VoipCapture.cs @@ -1,4 +1,5 @@ using Lidgren.Network; +using Microsoft.Xna.Framework; using OpenTK.Audio.OpenAL; using System; using System.Linq; @@ -26,6 +27,11 @@ namespace Barotrauma.Networking get; private set; } + + public float Gain + { + get { return GameMain.Config?.MicrophoneVolume ?? 1.0f; } + } public DateTime LastEnqueueAudio; @@ -69,6 +75,7 @@ namespace Barotrauma.Networking { if (!GUIMessageBox.MessageBoxes.Any(mb => mb.UserData as string == "capturedevicenotfound")) { + GUI.SettingsMenuOpen = false; new GUIMessageBox(TextManager.Get("Error"), TextManager.Get("VoipCaptureDeviceNotFound")) { UserData = "capturedevicenotfound" @@ -160,8 +167,9 @@ namespace Barotrauma.Networking double maxAmplitude = 0.0f; for (int i = 0; i < VoipConfig.BUFFER_SIZE; i++) { - double sampleVal = (double)uncompressedBuffer[i] / (double)short.MaxValue; - maxAmplitude = Math.Max(maxAmplitude, Math.Abs(sampleVal)); + uncompressedBuffer[i] = (short)MathHelper.Clamp((uncompressedBuffer[i] * Gain), -short.MaxValue, short.MaxValue); + double sampleVal = uncompressedBuffer[i] / (double)short.MaxValue; + maxAmplitude = Math.Max(maxAmplitude, Math.Abs(sampleVal)); } double dB = Math.Min(20 * Math.Log10(maxAmplitude), 0.0); diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CharacterEditorScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/CharacterEditorScreen.cs index ce3420604..48be1e5a0 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CharacterEditorScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CharacterEditorScreen.cs @@ -117,7 +117,6 @@ namespace Barotrauma GameMain.Instance.OnResolutionChanged += OnResolutionChanged; instance = this; } - #endregion public override void Deselect() { @@ -196,6 +195,7 @@ namespace Barotrauma { ParamsEditor.Instance.EditorBox.AddToGUIUpdateList(); } + } public override void Update(double deltaTime) { @@ -351,91 +351,6 @@ namespace Barotrauma { CopyLimb(selectedLimb); } - idToCodeName.TryGetValue(id, out string notes); - LimbXElements.Add(id.ToString(), new XElement("limb", - new XAttribute("id", id), - new XAttribute("name", limbName), - new XAttribute("type", limbType.ToString()), - colliderAttributes, - new XElement("sprite", - new XAttribute("texture", TexturePath), - new XAttribute("sourcerect", $"{rectInputs[0].IntValue}, {rectInputs[1].IntValue}, {width}, {height}")), - new XAttribute("notes", null ?? string.Empty) - )); - } - } - UpdateJointCreation(); - if (PlayerInput.KeyHit(Keys.Left)) - { - foreach (var limb in selectedLimbs) - { - var newRect = limb.ActiveSprite.SourceRect; - newRect.X--; - UpdateSourceRect(limb, newRect); - } - } - if (PlayerInput.KeyHit(Keys.Right)) - { - foreach (var limb in selectedLimbs) - { - var newRect = limb.ActiveSprite.SourceRect; - newRect.X++; - UpdateSourceRect(limb, newRect); - } - } - if (PlayerInput.KeyHit(Keys.Down)) - { - foreach (var limb in selectedLimbs) - { - var newRect = limb.ActiveSprite.SourceRect; - newRect.Y++; - UpdateSourceRect(limb, newRect); - } - } - if (PlayerInput.KeyHit(Keys.Up)) - { - foreach (var limb in selectedLimbs) - { - var newRect = limb.ActiveSprite.SourceRect; - newRect.Y--; - UpdateSourceRect(limb, newRect); - } - } - UpdateJointCreation(); - if (PlayerInput.KeyHit(Keys.Left)) - { - foreach (var limb in selectedLimbs) - { - var newRect = limb.ActiveSprite.SourceRect; - newRect.X--; - UpdateSourceRect(limb, newRect); - } - } - if (PlayerInput.KeyHit(Keys.Right)) - { - foreach (var limb in selectedLimbs) - { - var newRect = limb.ActiveSprite.SourceRect; - newRect.X++; - UpdateSourceRect(limb, newRect); - } - } - if (PlayerInput.KeyHit(Keys.Down)) - { - foreach (var limb in selectedLimbs) - { - var newRect = limb.ActiveSprite.SourceRect; - newRect.Y++; - UpdateSourceRect(limb, newRect); - } - } - if (PlayerInput.KeyHit(Keys.Up)) - { - foreach (var limb in selectedLimbs) - { - var newRect = limb.ActiveSprite.SourceRect; - newRect.Y--; - UpdateSourceRect(limb, newRect); } } UpdateJointCreation(); diff --git a/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs index 2246c630a..a16eb2187 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs @@ -51,10 +51,6 @@ namespace Barotrauma damageEffect.Parameters["xStencil"].SetValue(damageStencil); damageEffect.Parameters["aMultiplier"].SetValue(50.0f); damageEffect.Parameters["cMultiplier"].SetValue(200.0f); - - distortTexture = TextureLoader.FromFile("Content/Effects/distortnormals.png"); - postProcessEffect.Parameters["xDistortTexture"].SetValue(distortTexture); - } distortTexture = TextureLoader.FromFile("Content/Effects/distortnormals.png"); postProcessEffect.Parameters["xDistortTexture"].SetValue(distortTexture); diff --git a/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs index bb123c052..091909577 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs @@ -1,15 +1,15 @@ -using Barotrauma.Networking; +using Barotrauma.Extensions; +using Barotrauma.Networking; using Barotrauma.Tutorials; +using Lidgren.Network; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using System; -using System.IO; using System.Collections.Generic; -using System.Linq; -using Barotrauma.Extensions; using System.Diagnostics; -using Lidgren.Network; +using System.IO; +using System.Linq; using System.Threading; namespace Barotrauma @@ -34,10 +34,13 @@ namespace Barotrauma private Tab selectedTab; private Sprite backgroundSprite; + private Sprite backgroundVignette; #region Creation public MainMenuScreen(GameMain game) { + backgroundVignette = new Sprite("Content/UI/MainMenuVignette.png", Vector2.Zero); + new GUIImage(new RectTransform(new Vector2(0.35f, 0.2f), Frame.RectTransform, Anchor.BottomRight) { RelativeOffset = new Vector2(0.05f, 0.05f), AbsoluteOffset = new Point(-5, -5) }, style: "TitleText") @@ -688,6 +691,11 @@ namespace Barotrauma blurAmount: 0.0f, aberrationStrength: 0.0f); } + + spriteBatch.Begin(blendState: BlendState.AlphaBlend); + backgroundVignette.Draw(spriteBatch, Vector2.Zero, Color.White, Vector2.Zero, 0.0f, + new Vector2(GameMain.GraphicsWidth / backgroundVignette.size.X, GameMain.GraphicsHeight / backgroundVignette.size.Y)); + spriteBatch.End(); } public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch) diff --git a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs index b84cbd3ac..c8882034b 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs @@ -431,7 +431,6 @@ namespace Barotrauma return true; } }; - shuttleList = new GUIDropDown(new RectTransform(new Vector2(1.0f, 0.05f), midInfoColumn.RectTransform), elementCount: 10); //gamemode ------------------------------------------------------------------ @@ -1050,10 +1049,9 @@ namespace Barotrauma } } - public void SetPlayYourself(bool playYourself) + public bool TogglePlayYourself(GUITickBox tickBox) { - this.playYourself.Selected = playYourself; - if (playYourself) + if (tickBox.Selected) { UpdatePlayerFrame(campaignCharacterInfo, allowEditing: campaignCharacterInfo == null); } @@ -1068,6 +1066,7 @@ namespace Barotrauma TextManager.Get("PlayingAsSpectator"), textAlignment: Alignment.Center); } + return false; } public void SetPlayYourself(bool playYourself) @@ -1097,7 +1096,6 @@ namespace Barotrauma { return; } - } //show the player config menu if spectating is not allowed if (!playYourself.Selected && !allowSpectating) diff --git a/Barotrauma/BarotraumaClient/Source/Screens/ServerListScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/ServerListScreen.cs index aca7905bb..3fa7dcc26 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/ServerListScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/ServerListScreen.cs @@ -716,7 +716,7 @@ namespace Barotrauma catch (PingException ex) { string errorMsg = "Failed to ping a server (" + serverInfo.ServerName + ", " + serverInfo.IP + ") - " + (ex?.InnerException?.Message ?? ex.Message); - GameAnalyticsManager.AddErrorEventOnce("ServerListScreen.PingServer:PingException" + serverInfo.IP, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); + GameAnalyticsManager.AddErrorEventOnce("ServerListScreen.PingServer:PingException" + serverInfo.IP, GameAnalyticsSDK.Net.EGAErrorSeverity.Warning, errorMsg); #if DEBUG DebugConsole.NewMessage(errorMsg, Color.Red); #endif diff --git a/Barotrauma/BarotraumaClient/Source/Screens/SubEditorScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/SubEditorScreen.cs index 022395eb3..7ac15f8d0 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/SubEditorScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/SubEditorScreen.cs @@ -1913,8 +1913,6 @@ namespace Barotrauma CreateUI(); } - if (tutorial != null) tutorial.Update((float)deltaTime); - hullVolumeFrame.Visible = MapEntity.SelectedList.Any(s => s is Hull); saveAssemblyFrame.Visible = MapEntity.SelectedList.Count > 0; diff --git a/Barotrauma/BarotraumaClient/Source/Sounds/OggSound.cs b/Barotrauma/BarotraumaClient/Source/Sounds/OggSound.cs index 6d69f3a12..dacc02b24 100644 --- a/Barotrauma/BarotraumaClient/Source/Sounds/OggSound.cs +++ b/Barotrauma/BarotraumaClient/Source/Sounds/OggSound.cs @@ -26,7 +26,7 @@ namespace Barotrauma.Sounds if (!stream) { - int bufferSize = (int)reader.TotalSamples*reader.Channels; + int bufferSize = (int)reader.TotalSamples * reader.Channels; float[] floatBuffer = new float[bufferSize]; short[] shortBuffer = new short[bufferSize]; @@ -82,7 +82,7 @@ namespace Barotrauma.Sounds { if (!muffleFilters.TryGetValue(sampleRate, out BiQuad filter)) { - filter = new LowpassFilter(sampleRate, 400); + filter = new LowpassFilter(sampleRate, 800); muffleFilters.Add(sampleRate, filter); } filter.Process(buffer); diff --git a/Barotrauma/BarotraumaClient/Source/Sounds/SoundChannel.cs b/Barotrauma/BarotraumaClient/Source/Sounds/SoundChannel.cs index 7a7e40194..e939f97bd 100644 --- a/Barotrauma/BarotraumaClient/Source/Sounds/SoundChannel.cs +++ b/Barotrauma/BarotraumaClient/Source/Sounds/SoundChannel.cs @@ -176,7 +176,7 @@ namespace Barotrauma.Sounds get { return gain; } set { - gain = Math.Max(Math.Min(value,1.0f),0.0f); + gain = Math.Max(Math.Min(value, 1.0f), 0.0f); if (ALSourceIndex < 0) return; @@ -432,7 +432,13 @@ namespace Barotrauma.Sounds this.Category = category; } } - + + public bool FadingOutAndDisposing; + public void FadeOutAndDispose() + { + FadingOutAndDisposing = true; + } + public void Dispose() { lock (mutex) diff --git a/Barotrauma/BarotraumaClient/Source/Sounds/SoundManager.cs b/Barotrauma/BarotraumaClient/Source/Sounds/SoundManager.cs index 4256482ea..14807564c 100644 --- a/Barotrauma/BarotraumaClient/Source/Sounds/SoundManager.cs +++ b/Barotrauma/BarotraumaClient/Source/Sounds/SoundManager.cs @@ -15,8 +15,8 @@ namespace Barotrauma.Sounds public bool Disabled { - Default = 0, - Voice = 1 + get; + private set; } private IntPtr alcDevice; @@ -109,12 +109,6 @@ namespace Barotrauma.Sounds { get { return loadedSounds.Select(s => s.Filename).Distinct().Count(); } } - public int UniqueLoadedSoundCount - { - get { return loadedSounds.Select(s => s.Filename).Distinct().Count(); } - } - - private Dictionary> categoryModifiers; private Dictionary> categoryModifiers; @@ -322,7 +316,6 @@ namespace Barotrauma.Sounds } return count; } -#endif public SoundChannel GetChannelFromSound(Sound sound) { @@ -420,15 +413,6 @@ namespace Barotrauma.Sounds { categoryModifiers[category].Second = muffle; } - else - { - categoryModifiers[category].Second = muffle; - } - else - { - categoryModifiers[category].Second = muffle; - } - } for (int i = 0; i < playingChannels.Length; i++) { @@ -477,7 +461,8 @@ namespace Barotrauma.Sounds { for (int j = 0; j < playingChannels[i].Length; j++) { - if (playingChannels[i][j] != null && playingChannels[i][j].IsStream) + if (playingChannels[i][j] == null) { continue; } + if (playingChannels[i][j].IsStream) { if (playingChannels[i][j].IsPlaying) { @@ -489,10 +474,18 @@ namespace Barotrauma.Sounds playingChannels[i][j].Dispose(); } } + else if (playingChannels[i][j].FadingOutAndDisposing) + { + playingChannels[i][j].Gain -= 0.1f; + if (playingChannels[i][j].Gain <= 0.0f) + { + playingChannels[i][j].Dispose(); + } + } } } } - Thread.Sleep(50); //TODO: use a separate thread for network audio? + Thread.Sleep(10); //TODO: use a separate thread for network audio? } } diff --git a/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs b/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs index 6d34dd17e..5609902ab 100644 --- a/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs +++ b/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs @@ -215,19 +215,19 @@ namespace Barotrauma for (int i = 0; i < waterAmbienceChannels.Length; i++) { if (waterAmbienceChannels[i] == null) continue; - waterAmbienceChannels[i].Dispose(); + waterAmbienceChannels[i].FadeOutAndDispose(); waterAmbienceChannels[i] = null; } for (int i = 0; i < FlowSounds.Count; i++) { if (flowSoundChannels[i] == null) continue; - flowSoundChannels[i].Dispose(); + flowSoundChannels[i].FadeOutAndDispose(); flowSoundChannels[i] = null; } for (int i = 0; i < fireSoundChannels.Length; i++) { if (fireSoundChannels[i] == null) continue; - fireSoundChannels[i].Dispose(); + fireSoundChannels[i].FadeOutAndDispose(); fireSoundChannels[i] = null; } fireVolumeLeft[0] = 0.0f; fireVolumeLeft[1] = 0.0f; @@ -414,7 +414,7 @@ namespace Barotrauma { if (fireSoundChannels[i] != null) { - fireSoundChannels[i].Dispose(); + fireSoundChannels[i].FadeOutAndDispose(); fireSoundChannels[i] = null; } } diff --git a/Barotrauma/BarotraumaClient/Source/Sounds/VoipSound.cs b/Barotrauma/BarotraumaClient/Source/Sounds/VoipSound.cs index e9bc2e862..3e86fcc2c 100644 --- a/Barotrauma/BarotraumaClient/Source/Sounds/VoipSound.cs +++ b/Barotrauma/BarotraumaClient/Source/Sounds/VoipSound.cs @@ -34,7 +34,7 @@ namespace Barotrauma.Sounds private static BiQuad[] muffleFilters = new BiQuad[] { - new LowpassFilter(VoipConfig.FREQUENCY, 400) + new LowpassFilter(VoipConfig.FREQUENCY, 800) }; private static BiQuad[] radioFilters = new BiQuad[] { diff --git a/Barotrauma/BarotraumaClient/Source/Sprite/DeformableSprite.cs b/Barotrauma/BarotraumaClient/Source/Sprite/DeformableSprite.cs index 860522283..54f33dbb6 100644 --- a/Barotrauma/BarotraumaClient/Source/Sprite/DeformableSprite.cs +++ b/Barotrauma/BarotraumaClient/Source/Sprite/DeformableSprite.cs @@ -26,6 +26,10 @@ namespace Barotrauma private int subDivX, subDivY; private static Effect effect; + public static Effect Effect + { + get { return effect; } + } private Point spritePos; private Point spriteSize; diff --git a/Barotrauma/BarotraumaClient/Source/Sprite/Sprite.cs b/Barotrauma/BarotraumaClient/Source/Sprite/Sprite.cs index 32b7c3e31..0fc1be586 100644 --- a/Barotrauma/BarotraumaClient/Source/Sprite/Sprite.cs +++ b/Barotrauma/BarotraumaClient/Source/Sprite/Sprite.cs @@ -279,7 +279,6 @@ namespace Barotrauma //check if another sprite is using the same texture if (!string.IsNullOrEmpty(FilePath)) //file can be empty if the sprite is created directly from a Texture2D instance { - string normalizedFilePath = Path.GetFullPath(file); foreach (Sprite s in list) { if (s.FullPath == FullPath) return; diff --git a/Barotrauma/BarotraumaClient/Source/Utils/LocalizationCSVtoXML.cs b/Barotrauma/BarotraumaClient/Source/Utils/LocalizationCSVtoXML.cs index e908621bc..67e912b03 100644 --- a/Barotrauma/BarotraumaClient/Source/Utils/LocalizationCSVtoXML.cs +++ b/Barotrauma/BarotraumaClient/Source/Utils/LocalizationCSVtoXML.cs @@ -1,4 +1,5 @@ #if DEBUG +using System; using System.Collections.Generic; using System.IO; using System.Text; @@ -14,10 +15,16 @@ namespace Barotrauma private const string conversationsPath = "Content/NPCConversations"; private const string infoTextPath = "Content/Texts"; - private const string xmlHeader = ""; + private const string xmlHeader = ""; public static void Convert(string language) { + if (TextManager.Language != "English") + { + DebugConsole.ThrowError("Use the english localization when converting .csv to allow copying values"); + return; + } + List conversationFiles = new List(); List infoTextFiles = new List(); @@ -36,6 +43,11 @@ namespace Barotrauma for (int i = 0; i < conversationFiles.Count; i++) { List xmlContent = ConvertConversationsToXML(File.ReadAllLines(conversationFiles[i], Encoding.UTF8), language); + if (xmlContent == null) + { + DebugConsole.ThrowError("NPCConversation Localization .csv to .xml conversion failed for: " + conversationFiles[i]); + continue; + } string xmlFileFullPath = $"{conversationsPath}/NPCConversations_{language}_NEW.xml"; File.WriteAllLines(xmlFileFullPath, xmlContent); DebugConsole.NewMessage("Conversation localization .xml file successfully created at: " + xmlFileFullPath); @@ -44,6 +56,11 @@ namespace Barotrauma for (int i = 0; i < infoTextFiles.Count; i++) { List xmlContent = ConvertInfoTextToXML(File.ReadAllLines(infoTextFiles[i], Encoding.UTF8), language); + if (xmlContent == null) + { + DebugConsole.ThrowError("InfoText Localization .csv to .xml conversion failed for: " + infoTextFiles[i]); + continue; + } string xmlFileFullPath = $"{infoTextPath}/{language}Vanilla_NEW.xml"; File.WriteAllLines(xmlFileFullPath, xmlContent); DebugConsole.NewMessage("InfoText localization .xml file successfully created at: " + xmlFileFullPath); @@ -61,9 +78,8 @@ namespace Barotrauma xmlContent.Add(xmlHeader); xmlContent.Add($""); - xmlContent.Add(string.Empty); - for (int i = 0; i < csvContent.Length; i++) + for (int i = 1; i < csvContent.Length; i++) // Start at one to ignore header { csvContent[i] = csvContent[i].Trim(separator); @@ -105,7 +121,35 @@ namespace Barotrauma xmlContent.Add($""); xmlContent.Add(string.Empty); + xmlContent.Add(""); + + int traitStart = -1; for (int i = 0; i < csvContent.Length; i++) + { + if (csvContent[i].StartsWith("Personality")) + { + traitStart = i + 1; + break; + } + } + + if (traitStart == -1) + { + DebugConsole.ThrowError("Invalid formatting of NPCConversations, no traits found!"); + return null; + } + + for (int i = 0; i < NPCPersonalityTrait.List.Count; i++) // Traits + { + string[] split = SplitCSV(csvContent[traitStart + i].Trim(separator)); + xmlContent.Add( + $""); + } + + for (int i = traitStart + NPCPersonalityTrait.List.Count; i < csvContent.Length; i++) // Conversations { string[] split = SplitCSV(csvContent[i]); diff --git a/Barotrauma/BarotraumaClient/WindowsClient.csproj b/Barotrauma/BarotraumaClient/WindowsClient.csproj index 2c4bc8e82..7cf32db5d 100644 --- a/Barotrauma/BarotraumaClient/WindowsClient.csproj +++ b/Barotrauma/BarotraumaClient/WindowsClient.csproj @@ -172,6 +172,7 @@ + @@ -252,6 +253,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs index 3dc185ec4..eb0a60828 100644 --- a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs +++ b/Barotrauma/BarotraumaServer/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.8.9.5")] -[assembly: AssemblyFileVersion("0.8.9.5")] +[assembly: AssemblyVersion("0.8.9.6")] +[assembly: AssemblyFileVersion("0.8.9.6")] diff --git a/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs index 7ea8f65a2..0656ea051 100644 --- a/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaServer/Source/GameSession/GameModes/MultiPlayerCampaign.cs @@ -3,11 +3,14 @@ using Lidgren.Network; using Microsoft.Xna.Framework; using System; using System.Collections.Generic; +using System.Xml.Linq; namespace Barotrauma { partial class MultiPlayerCampaign : CampaignMode { + private List characterData = new List(); + public static void StartNewCampaign(string savePath, string subName, string seed) { if (string.IsNullOrWhiteSpace(savePath)) return; @@ -202,5 +205,32 @@ namespace Barotrauma CargoManager.PurchaseItem(pi.ItemPrefab, pi.Quantity); } } + + public override void Save(XElement element) + { + XElement modeElement = new XElement("MultiPlayerCampaign", + new XAttribute("money", Money), + new XAttribute("cheatsenabled", CheatsEnabled)); + Map.Save(modeElement); + element.Add(modeElement); + + //save character data to a separate file + string characterDataPath = GetCharacterDataSavePath(); + XDocument characterDataDoc = new XDocument(new XElement("CharacterData")); + foreach (CharacterCampaignData cd in characterData) + { + characterDataDoc.Root.Add(cd.Save()); + } + try + { + characterDataDoc.Save(characterDataPath); + } + catch (Exception e) + { + DebugConsole.ThrowError("Saving multiplayer campaign characters to \"" + characterDataPath + "\" failed!", e); + } + + lastSaveID++; + } } } diff --git a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs index 666aad960..4c4641540 100644 --- a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs @@ -1897,14 +1897,7 @@ namespace Barotrauma.Networking public override void AddChatMessage(ChatMessage message) { if (string.IsNullOrEmpty(message.Text)) { return; } - if (message.Sender != null) - { - Log($"{message.Sender}: {message.Text}", ServerLog.MessageType.Chat); - } - else - { - Log($"{message.Text}", ServerLog.MessageType.Chat); - } + Log(message.TextWithSender, ServerLog.MessageType.Chat); base.AddChatMessage(message); } @@ -2367,6 +2360,8 @@ namespace Barotrauma.Networking public void SendVoteStatus(List recipients) { + if (!recipients.Any()) { return; } + NetOutgoingMessage msg = server.CreateMessage(); msg.Write((byte)ServerPacketHeader.UPDATE_LOBBY); msg.Write((byte)ServerNetObject.VOTE); @@ -2419,7 +2414,10 @@ namespace Barotrauma.Networking recipients.Add(otherClient.Connection); } } - server.SendMessage(msg, recipients, NetDeliveryMethod.ReliableUnordered, 0); + if (recipients.Any()) + { + server.SendMessage(msg, recipients, NetDeliveryMethod.ReliableUnordered, 0); + } serverSettings.SaveClientPermissions(); } @@ -2453,13 +2451,15 @@ namespace Barotrauma.Networking public void UpdateCheatsEnabled() { + if (!connectedClients.Any()) { return; } + var msg = server.CreateMessage(); msg.Write((byte)ServerPacketHeader.CHEATS_ENABLED); msg.Write(DebugConsole.CheatsEnabled); msg.WritePadBits(); CompressOutgoingMessage(msg); - + server.SendMessage(msg, connectedClients.Select(c => c.Connection).ToList(), NetDeliveryMethod.ReliableUnordered, 0); } @@ -2794,747 +2794,6 @@ namespace Barotrauma.Networking server.Shutdown(DisconnectReason.ServerShutdown.ToString()); } - public void SendConsoleMessage(string txt, Client recipient) - { - ChatMessage msg = ChatMessage.Create("", txt, ChatMessageType.Console, null); - SendDirectChatMessage(msg, recipient); - } - - public void SendDirectChatMessage(ChatMessage msg, Client recipient) - { - if (recipient == null) - { - string errorMsg = "Attempted to send a chat message to a null client.\n" + Environment.StackTrace; - DebugConsole.ThrowError(errorMsg); - GameAnalyticsManager.AddErrorEventOnce("GameServer.SendDirectChatMessage:ClientNull", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); - return; - } - - msg.NetStateID = recipient.ChatMsgQueue.Count > 0 ? - (ushort)(recipient.ChatMsgQueue.Last().NetStateID + 1) : - (ushort)(recipient.LastRecvChatMsgID + 1); - - recipient.ChatMsgQueue.Add(msg); - recipient.LastChatMsgQueueID = msg.NetStateID; - } - - /// - /// Add the message to the chatbox and pass it to all clients who can receive it - /// - public void SendChatMessage(string message, ChatMessageType? type = null, Client senderClient = null, Character senderCharacter = null) - { - string senderName = ""; - - Client targetClient = null; - - if (type == null) - { - string command = ChatMessage.GetChatMessageCommand(message, out string tempStr); - switch (command.ToLowerInvariant()) - { - case "r": - case "radio": - type = ChatMessageType.Radio; - break; - case "d": - case "dead": - type = ChatMessageType.Dead; - break; - default: - if (command != "") - { - if (command == name.ToLowerInvariant()) - { - //a private message to the host - } - else - { - targetClient = connectedClients.Find(c => - command == c.Name.ToLowerInvariant() || - (c.Character != null && command == c.Character.Name.ToLowerInvariant())); - - if (targetClient == null) - { - if (senderClient != null) - { - var chatMsg = ChatMessage.Create( - "", $"ServerMessage.PlayerNotFound~[player]={command}", - ChatMessageType.Error, null); - - chatMsg.NetStateID = senderClient.ChatMsgQueue.Count > 0 ? - (ushort)(senderClient.ChatMsgQueue.Last().NetStateID + 1) : - (ushort)(senderClient.LastRecvChatMsgID + 1); - - senderClient.ChatMsgQueue.Add(chatMsg); - senderClient.LastChatMsgQueueID = chatMsg.NetStateID; - } - else - { - AddChatMessage($"ServerMessage.PlayerNotFound~[player]={command}", ChatMessageType.Error); - } - - return; - } - } - - type = ChatMessageType.Private; - } - else - { - type = ChatMessageType.Default; - } - break; - } - - message = tempStr; - } - - if (gameStarted) - { - if (senderClient == null) - { - //msg sent by the server - if (senderCharacter == null) - { - senderName = name; - } - else //msg sent by an AI character - { - senderName = senderCharacter.Name; - } - } - else //msg sent by a client - { - senderCharacter = senderClient.Character; - senderName = senderCharacter == null ? senderClient.Name : senderCharacter.Name; - - //sender doesn't have a character or the character can't speak -> only ChatMessageType.Dead allowed - if (senderCharacter == null || senderCharacter.IsDead || senderCharacter.SpeechImpediment >= 100.0f) - { - type = ChatMessageType.Dead; - } - else if (type == ChatMessageType.Private) - { - //sender has an alive character, sending private messages not allowed - return; - } - - } - } - else - { - if (senderClient == null) - { - //msg sent by the server - if (senderCharacter == null) - { - senderName = name; - } - else //sent by an AI character, not allowed when the game is not running - { - return; - } - } - else //msg sent by a client - { - //game not started -> clients can only send normal and private chatmessages - if (type != ChatMessageType.Private) type = ChatMessageType.Default; - senderName = senderClient.Name; - } - } - - //check if the client is allowed to send the message - WifiComponent senderRadio = null; - switch (type) - { - case ChatMessageType.Radio: - case ChatMessageType.Order: - if (senderCharacter == null) return; - - //return if senderCharacter doesn't have a working radio - var radio = senderCharacter.Inventory?.Items.FirstOrDefault(i => i != null && i.GetComponent() != null); - if (radio == null || !senderCharacter.HasEquippedItem(radio)) return; - - senderRadio = radio.GetComponent(); - if (!senderRadio.CanTransmit()) return; - break; - case ChatMessageType.Dead: - //character still alive and capable of speaking -> dead chat not allowed - if (senderClient != null && senderCharacter != null && !senderCharacter.IsDead && senderCharacter.SpeechImpediment < 100.0f) - { - return; - } - break; - } - - if (type == ChatMessageType.Server) - { - senderName = null; - senderCharacter = null; - } - else if (type == ChatMessageType.Radio) - { - //send to chat-linked wifi components - senderRadio.TransmitSignal(0, message, senderRadio.Item, senderCharacter, false); - } - - //check which clients can receive the message and apply distance effects - foreach (Client client in ConnectedClients) - { - string modifiedMessage = message; - - switch (type) - { - case ChatMessageType.Default: - case ChatMessageType.Radio: - case ChatMessageType.Order: - if (senderCharacter != null && - client.Character != null && !client.Character.IsDead) - { - modifiedMessage = ChatMessage.ApplyDistanceEffect(message, (ChatMessageType)type, senderCharacter, client.Character); - - //too far to hear the msg -> don't send - if (string.IsNullOrWhiteSpace(modifiedMessage)) continue; - } - break; - case ChatMessageType.Dead: - //character still alive -> don't send - if (client != senderClient && client.Character != null && !client.Character.IsDead) continue; - break; - case ChatMessageType.Private: - //private msg sent to someone else than this client -> don't send - if (client != targetClient && client != senderClient) continue; - break; - } - - var chatMsg = ChatMessage.Create( - senderName, - modifiedMessage, - (ChatMessageType)type, - senderCharacter); - - SendDirectChatMessage(chatMsg, client); - } - - if (type.Value != ChatMessageType.MessageBox) - { - string myReceivedMessage = type == ChatMessageType.Server || type == ChatMessageType.Error ? TextManager.GetServerMessage(message) : message; - if (!string.IsNullOrWhiteSpace(myReceivedMessage) && - (targetClient == null || senderClient == null)) - { - AddChatMessage(myReceivedMessage, (ChatMessageType)type, senderName, senderCharacter); - } - } - } - - public void SendOrderChatMessage(OrderChatMessage message) - { - if (message.Sender == null || message.Sender.SpeechImpediment >= 100.0f) return; - ChatMessageType messageType = ChatMessage.CanUseRadio(message.Sender) ? ChatMessageType.Radio : ChatMessageType.Default; - - //check which clients can receive the message and apply distance effects - foreach (Client client in ConnectedClients) - { - string modifiedMessage = message.Text; - - if (message.Sender != null && - client.Character != null && !client.Character.IsDead) - { - modifiedMessage = ChatMessage.ApplyDistanceEffect(message.Text, messageType, message.Sender, client.Character); - - //too far to hear the msg -> don't send - if (string.IsNullOrWhiteSpace(modifiedMessage)) continue; - } - - SendDirectChatMessage(message, client); - } - - string myReceivedMessage = message.Text; - - if (!string.IsNullOrWhiteSpace(myReceivedMessage)) - { - AddChatMessage(new OrderChatMessage(message.Order, message.OrderOption, myReceivedMessage, message.TargetEntity, message.TargetCharacter, message.Sender)); - } - } - - private void FileTransferChanged(FileSender.FileTransferOut transfer) - { - Client recipient = connectedClients.Find(c => c.Connection == transfer.Connection); - if (transfer.FileType == FileTransferType.CampaignSave && - (transfer.Status == FileTransferStatus.Sending || transfer.Status == FileTransferStatus.Finished) && - recipient.LastCampaignSaveSendTime != null) - { - recipient.LastCampaignSaveSendTime.Second = (float)NetTime.Now; - } - } - - public void SendCancelTransferMsg(FileSender.FileTransferOut transfer) - { - NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)ServerPacketHeader.FILE_TRANSFER); - msg.Write((byte)FileTransferMessageType.Cancel); - msg.Write((byte)transfer.SequenceChannel); - CompressOutgoingMessage(msg); - server.SendMessage(msg, transfer.Connection, NetDeliveryMethod.ReliableOrdered, transfer.SequenceChannel); - } - - public void UpdateVoteStatus() - { - if (server.Connections.Count == 0 || connectedClients.Count == 0) return; - - Client.UpdateKickVotes(connectedClients); - - var clientsToKick = connectedClients.FindAll(c => - c.Connection != OwnerConnection && - c.KickVoteCount >= connectedClients.Count * serverSettings.KickVoteRequiredRatio); - foreach (Client c in clientsToKick) - { - SendChatMessage($"ServerMessage.KickedFromServer~[client]={c.Name}", ChatMessageType.Server, null); - KickClient(c, "ServerMessage.KickedByVote"); - BanClient(c, "ServerMessage.KickedByVoteAutoBan", duration: TimeSpan.FromSeconds(serverSettings.AutoBanTime)); - } - - GameMain.NetLobbyScreen.LastUpdateID++; - - SendVoteStatus(connectedClients); - - if (serverSettings.Voting.AllowEndVoting && EndVoteMax > 0 && - ((float)EndVoteCount / (float)EndVoteMax) >= serverSettings.EndVoteRequiredRatio) - { - Log("Ending round by votes (" + EndVoteCount + "/" + (EndVoteMax - EndVoteCount) + ")", ServerLog.MessageType.ServerMessage); - EndGame(); - } - } - - public void SendVoteStatus(List recipients) - { - NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)ServerPacketHeader.UPDATE_LOBBY); - msg.Write((byte)ServerNetObject.VOTE); - serverSettings.Voting.ServerWrite(msg); - msg.Write((byte)ServerNetObject.END_OF_MESSAGE); - - CompressOutgoingMessage(msg); - - server.SendMessage(msg, recipients.Select(c => c.Connection).ToList(), NetDeliveryMethod.ReliableUnordered, 0); - } - - public void UpdateClientPermissions(Client client) - { - if (client.SteamID > 0) - { - serverSettings.ClientPermissions.RemoveAll(cp => cp.SteamID == client.SteamID); - if (client.Permissions != ClientPermissions.None) - { - serverSettings.ClientPermissions.Add(new ServerSettings.SavedClientPermission( - client.Name, - client.SteamID, - client.Permissions, - client.PermittedConsoleCommands)); - } - } - else - { - serverSettings.ClientPermissions.RemoveAll(cp => client.IPMatches(cp.IP)); - if (client.Permissions != ClientPermissions.None) - { - serverSettings.ClientPermissions.Add(new ServerSettings.SavedClientPermission( - client.Name, - client.Connection.RemoteEndPoint.Address, - client.Permissions, - client.PermittedConsoleCommands)); - } - } - - var msg = server.CreateMessage(); - msg.Write((byte)ServerPacketHeader.PERMISSIONS); - client.WritePermissions(msg); - CompressOutgoingMessage(msg); - - //send the message to the client whose permissions are being modified and the clients who are allowed to modify permissions - List recipients = new List() { client.Connection }; - foreach (Client otherClient in connectedClients) - { - if (otherClient.HasPermission(ClientPermissions.ManagePermissions) && !recipients.Contains(otherClient.Connection)) - { - recipients.Add(otherClient.Connection); - } - } - server.SendMessage(msg, recipients, NetDeliveryMethod.ReliableUnordered, 0); - - serverSettings.SaveClientPermissions(); - } - - public void GiveAchievement(Character character, string achievementIdentifier) - { - achievementIdentifier = achievementIdentifier.ToLowerInvariant(); - foreach (Client client in connectedClients) - { - if (client.Character == character) - { - GiveAchievement(client, achievementIdentifier); - return; - } - } - } - - public void GiveAchievement(Client client, string achievementIdentifier) - { - if (client.GivenAchievements.Contains(achievementIdentifier)) return; - client.GivenAchievements.Add(achievementIdentifier); - - var msg = server.CreateMessage(); - msg.Write((byte)ServerPacketHeader.ACHIEVEMENT); - msg.Write(achievementIdentifier); - - CompressOutgoingMessage(msg); - - server.SendMessage(msg, client.Connection, NetDeliveryMethod.ReliableUnordered); - } - - public void UpdateCheatsEnabled() - { - var msg = server.CreateMessage(); - msg.Write((byte)ServerPacketHeader.CHEATS_ENABLED); - msg.Write(DebugConsole.CheatsEnabled); - msg.WritePadBits(); - - CompressOutgoingMessage(msg); - - server.SendMessage(msg, connectedClients.Select(c => c.Connection).ToList(), NetDeliveryMethod.ReliableUnordered, 0); - } - - public void SetClientCharacter(Client client, Character newCharacter) - { - if (client == null) return; - - //the client's previous character is no longer a remote player - if (client.Character != null) - { - client.Character.IsRemotePlayer = false; - client.Character.OwnerClientIP = null; - client.Character.OwnerClientName = null; - } - - if (newCharacter == null) - { - if (client.Character != null) //removing control of the current character - { - CreateEntityEvent(client.Character, new object[] { NetEntityEvent.Type.Control, null }); - client.Character = null; - } - } - else //taking control of a new character - { - newCharacter.ClientDisconnected = false; - newCharacter.KillDisconnectedTimer = 0.0f; - newCharacter.ResetNetState(); - if (client.Character != null) - { - newCharacter.LastNetworkUpdateID = client.Character.LastNetworkUpdateID; - } - - newCharacter.OwnerClientIP = client.Connection.RemoteEndPoint.Address.ToString(); - newCharacter.OwnerClientName = client.Name; - newCharacter.IsRemotePlayer = true; - newCharacter.Enabled = true; - client.Character = newCharacter; - CreateEntityEvent(newCharacter, new object[] { NetEntityEvent.Type.Control, client }); - } - } - - private void UpdateCharacterInfo(NetIncomingMessage message, Client sender) - { - sender.SpectateOnly = message.ReadBoolean() && (serverSettings.AllowSpectating || sender.Connection == OwnerConnection); - if (sender.SpectateOnly) - { - return; - } - - Gender gender = Gender.Male; - Race race = Race.White; - int headSpriteId = 0; - try - { - gender = (Gender)message.ReadByte(); - race = (Race)message.ReadByte(); - headSpriteId = message.ReadByte(); - } - catch (Exception e) - { - //gender = Gender.Male; - //race = Race.White; - //headSpriteId = 0; - DebugConsole.Log("Received invalid characterinfo from \"" + sender.Name + "\"! { " + e.Message + " }"); - } - int hairIndex = message.ReadByte(); - int beardIndex = message.ReadByte(); - int moustacheIndex = message.ReadByte(); - int faceAttachmentIndex = message.ReadByte(); - - List jobPreferences = new List(); - int count = message.ReadByte(); - for (int i = 0; i < Math.Min(count, 3); i++) - { - string jobIdentifier = message.ReadString(); - - JobPrefab jobPrefab = JobPrefab.List.Find(jp => jp.Identifier == jobIdentifier); - if (jobPrefab != null) jobPreferences.Add(jobPrefab); - } - - sender.CharacterInfo = new CharacterInfo(Character.HumanConfigFile, sender.Name); - sender.CharacterInfo.RecreateHead(headSpriteId, race, gender, hairIndex, beardIndex, moustacheIndex, faceAttachmentIndex); - - //if the client didn't provide job preferences, we'll use the preferences that are randomly assigned in the Client constructor - Debug.Assert(sender.JobPreferences.Count > 0); - if (jobPreferences.Count > 0) - { - sender.JobPreferences = jobPreferences; - } - } - - public void AssignJobs(List unassigned) - { - unassigned = new List(unassigned); - - Dictionary assignedClientCount = new Dictionary(); - foreach (JobPrefab jp in JobPrefab.List) - { - assignedClientCount.Add(jp, 0); - } - - Character.TeamType teamID = Character.TeamType.None; - if (unassigned.Count > 0) { teamID = unassigned[0].TeamID; } - - //if we're playing a multiplayer campaign, check which clients already have a character and a job - //(characters are persistent in campaigns) - if (GameMain.GameSession.GameMode is MultiPlayerCampaign multiplayerCampaign) - { - var campaignAssigned = multiplayerCampaign.GetAssignedJobs(connectedClients); - //remove already assigned clients from unassigned - unassigned.RemoveAll(u => campaignAssigned.ContainsKey(u)); - //add up to assigned client count - foreach (KeyValuePair clientJob in campaignAssigned) - { - assignedClientCount[clientJob.Value.Prefab]++; - clientJob.Key.AssignedJob = clientJob.Value.Prefab; - } - } - - //count the clients who already have characters with an assigned job - foreach (Client c in connectedClients) - { - if (c.TeamID != teamID || unassigned.Contains(c)) continue; - if (c.Character?.Info?.Job != null && !c.Character.IsDead) - { - assignedClientCount[c.Character.Info.Job.Prefab]++; - } - } - - //if any of the players has chosen a job that is Always Allowed, give them that job - for (int i = unassigned.Count - 1; i >= 0; i--) - { - if (unassigned[i].JobPreferences.Count == 0) continue; - if (!unassigned[i].JobPreferences[0].AllowAlways) continue; - unassigned[i].AssignedJob = unassigned[i].JobPreferences[0]; - unassigned.RemoveAt(i); - } - - //go throught the jobs whose MinNumber>0 (i.e. at least one crew member has to have the job) - bool unassignedJobsFound = true; - while (unassignedJobsFound && unassigned.Count > 0) - { - unassignedJobsFound = false; - - foreach (JobPrefab jobPrefab in JobPrefab.List) - { - if (unassigned.Count == 0) break; - if (jobPrefab.MinNumber < 1 || assignedClientCount[jobPrefab] >= jobPrefab.MinNumber) continue; - - //find the client that wants the job the most, or force it to random client if none of them want it - Client assignedClient = FindClientWithJobPreference(unassigned, jobPrefab, true); - - assignedClient.AssignedJob = jobPrefab; - assignedClientCount[jobPrefab]++; - unassigned.Remove(assignedClient); - - //the job still needs more crew members, set unassignedJobsFound to true to keep the while loop running - if (assignedClientCount[jobPrefab] < jobPrefab.MinNumber) unassignedJobsFound = true; - } - } - - //attempt to give the clients a job they have in their job preferences - for (int i = unassigned.Count - 1; i >= 0; i--) - { - foreach (JobPrefab preferredJob in unassigned[i].JobPreferences) - { - //the maximum number of players that can have this job hasn't been reached yet - // -> assign it to the client - if (assignedClientCount[preferredJob] < preferredJob.MaxNumber && unassigned[i].Karma >= preferredJob.MinKarma) - { - unassigned[i].AssignedJob = preferredJob; - assignedClientCount[preferredJob]++; - unassigned.RemoveAt(i); - break; - } - } - } - - //give random jobs to rest of the clients - foreach (Client c in unassigned) - { - //find all jobs that are still available - var remainingJobs = JobPrefab.List.FindAll(jp => assignedClientCount[jp] < jp.MaxNumber && c.Karma >= jp.MinKarma); - - //all jobs taken, give a random job - if (remainingJobs.Count == 0) - { - DebugConsole.ThrowError("Failed to assign a suitable job for \"" + c.Name + "\" (all jobs already have the maximum numbers of players). Assigning a random job..."); - int jobIndex = Rand.Range(0, JobPrefab.List.Count); - int skips = 0; - while (c.Karma < JobPrefab.List[jobIndex].MinKarma) - { - jobIndex++; - skips++; - if (jobIndex >= JobPrefab.List.Count) jobIndex -= JobPrefab.List.Count; - if (skips >= JobPrefab.List.Count) break; - } - c.AssignedJob = JobPrefab.List[jobIndex]; - assignedClientCount[c.AssignedJob]++; - } - else //some jobs still left, choose one of them by random - { - c.AssignedJob = remainingJobs[Rand.Range(0, remainingJobs.Count)]; - assignedClientCount[c.AssignedJob]++; - } - } - } - - public void AssignBotJobs(List bots, Character.TeamType teamID) - { - Dictionary assignedPlayerCount = new Dictionary(); - foreach (JobPrefab jp in JobPrefab.List) - { - assignedPlayerCount.Add(jp, 0); - } - - //count the clients who already have characters with an assigned job - foreach (Client c in connectedClients) - { - if (c.TeamID != teamID) continue; - if (c.Character?.Info?.Job != null && !c.Character.IsDead) - { - assignedPlayerCount[c.Character.Info.Job.Prefab]++; - } - else if (c.CharacterInfo?.Job != null) - { - assignedPlayerCount[c.CharacterInfo?.Job.Prefab]++; - } - } - - List unassignedBots = new List(bots); - foreach (CharacterInfo bot in bots) - { - foreach (JobPrefab jobPrefab in JobPrefab.List) - { - if (jobPrefab.MinNumber < 1 || assignedPlayerCount[jobPrefab] >= jobPrefab.MinNumber) continue; - bot.Job = new Job(jobPrefab); - assignedPlayerCount[jobPrefab]++; - unassignedBots.Remove(bot); - break; - } - } - - //find a suitable job for the rest of the players - foreach (CharacterInfo c in unassignedBots) - { - //find all jobs that are still available - var remainingJobs = JobPrefab.List.FindAll(jp => assignedPlayerCount[jp] < jp.MaxNumber); - //all jobs taken, give a random job - if (remainingJobs.Count == 0) - { - DebugConsole.ThrowError("Failed to assign a suitable job for bot \"" + c.Name + "\" (all jobs already have the maximum numbers of players). Assigning a random job..."); - c.Job = new Job(JobPrefab.List[Rand.Range(0, JobPrefab.List.Count)]); - assignedPlayerCount[c.Job.Prefab]++; - } - else //some jobs still left, choose one of them by random - { - c.Job = new Job(remainingJobs[Rand.Range(0, remainingJobs.Count)]); - assignedPlayerCount[c.Job.Prefab]++; - } - } - } - - private Client FindClientWithJobPreference(List clients, JobPrefab job, bool forceAssign = false) - { - int bestPreference = 0; - Client preferredClient = null; - foreach (Client c in clients) - { - if (c.Karma < job.MinKarma) continue; - int index = c.JobPreferences.IndexOf(job); - if (index == -1) index = 1000; - - if (preferredClient == null || index < bestPreference) - { - bestPreference = index; - preferredClient = c; - } - } - - //none of the clients wants the job, assign it to random client - if (forceAssign && preferredClient == null) - { - preferredClient = clients[Rand.Int(clients.Count)]; - } - - return preferredClient; - } - - public static void Log(string line, ServerLog.MessageType messageType) - { - if (GameMain.Server == null || !GameMain.Server.ServerSettings.SaveServerLogs) return; - - GameMain.Server.ServerSettings.ServerLog.WriteLine(line, messageType); - - foreach (Client client in GameMain.Server.ConnectedClients) - { - if (!client.HasPermission(ClientPermissions.ServerLog)) continue; - //use sendername as the message type - GameMain.Server.SendDirectChatMessage( - ChatMessage.Create(messageType.ToString(), line, ChatMessageType.ServerLog, null), - client); - } - } - - public override void Disconnect() - { - serverSettings.BanList.Save(); - serverSettings.SaveSettings(); - SteamManager.CloseServer(); - - if (registeredToMaster) - { - if (restClient != null) - { - var request = new RestRequest("masterserver2.php", Method.GET); - request.AddParameter("action", "removeserver"); - request.AddParameter("serverport", Port); - restClient.Execute(request); - restClient = null; - } - } - - if (serverSettings.SaveServerLogs) - { - Log("Shutting down the server...", ServerLog.MessageType.ServerMessage); - serverSettings.ServerLog.Save(); - } - - GameAnalyticsManager.AddDesignEvent("GameServer:ShutDown"); - server.Shutdown("The server has been shut down"); - } - void InitUPnP() { server.UPnP.ForwardPort(NetPeerConfiguration.Port, "barotrauma"); diff --git a/Barotrauma/BarotraumaServer/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs b/Barotrauma/BarotraumaServer/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs index 5b91f148a..08a5f7a2e 100644 --- a/Barotrauma/BarotraumaServer/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs +++ b/Barotrauma/BarotraumaServer/Source/Networking/NetEntityEvent/ServerEntityEventManager.cs @@ -222,7 +222,7 @@ namespace Barotrauma.Networking + (c.LastRecvEntityEventID + 1).ToString() + " (created " + (Timing.TotalTime - firstEventToResend.CreateTime).ToString("0.##") + " s ago)" + " Events queued: " + events.Count + ", last sent to all: " + lastSentToAll, ServerLog.MessageType.ServerMessage); - server.DisconnectClient(c, "", "ServerMessage.ExcessiveDesync"); + server.DisconnectClient(c, "", "ServerMessage.ExcessiveDesyncOldEvent"); } ); } @@ -236,7 +236,7 @@ namespace Barotrauma.Networking { DebugConsole.NewMessage(c.Name + " was kicked due to excessive desync (expected removed event " + (c.LastRecvEntityEventID + 1).ToString() + ", last available is " + events[0].ID.ToString() + ")", Color.Red); GameServer.Log("Disconnecting client " + c.Name + " due to excessive desync (expected removed event" + (c.LastRecvEntityEventID + 1).ToString() + ", last available is " + events[0].ID.ToString() + ")", ServerLog.MessageType.ServerMessage); - server.DisconnectClient(c, "", "ServerMessage.ExcessiveDesync"); + server.DisconnectClient(c, "", "ServerMessage.ExcessiveDesyncRemovedEvent"); }); } } @@ -260,6 +260,7 @@ namespace Barotrauma.Networking //a client could potentially spam events with a much higher character state ID //than the state of their character and/or stop sending character inputs, //so we'll drop some events to make sure no-one blows up our buffer + DebugConsole.Log("Excessive amount of events in a client's event buffer. The client may be spamming events or their event IDs might be out of sync. Dropping events..."); bufferedEvents.RemoveRange(0, 256); } @@ -494,7 +495,6 @@ namespace Barotrauma.Networking foreach (Client c in server.ConnectedClients) { - c.PositionUpdateLastSent.Clear(); c.EntityEventLastSent.Clear(); c.LastRecvEntityEventID = 0; c.LastSentEntityEventID = 0; diff --git a/Barotrauma/BarotraumaShared/Data/ContentPackages/Vanilla 0.9.xml b/Barotrauma/BarotraumaShared/Data/ContentPackages/Vanilla 0.9.xml index d2f9399ee..2a1a400b3 100644 --- a/Barotrauma/BarotraumaShared/Data/ContentPackages/Vanilla 0.9.xml +++ b/Barotrauma/BarotraumaShared/Data/ContentPackages/Vanilla 0.9.xml @@ -73,8 +73,8 @@ + - diff --git a/Barotrauma/BarotraumaShared/SharedContent.projitems b/Barotrauma/BarotraumaShared/SharedContent.projitems index bec8045ae..0a90b8248 100644 --- a/Barotrauma/BarotraumaShared/SharedContent.projitems +++ b/Barotrauma/BarotraumaShared/SharedContent.projitems @@ -1005,9 +1005,36 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -1382,9 +1409,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -1619,6 +1643,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -1852,6 +1882,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1873,6 +1906,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -3089,6 +3125,9 @@ PreserveNewest + + PreserveNewest + diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs index 7c7164b11..d4dc9e8b0 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs @@ -359,7 +359,7 @@ namespace Barotrauma if (Character.Submarine == null && SimPosition.Y < ConvertUnits.ToSimUnits(Character.CharacterHealth.CrushDepth * 0.75f)) { //steer straight up if very deep - steeringManager.SteeringManual(deltaTime, Vector2.UnitY * speed); + steeringManager.SteeringManual(deltaTime, Vector2.UnitY); return; } @@ -652,7 +652,7 @@ namespace Barotrauma { //wander around randomly and decrease the priority faster if no path is found if (selectedTargetMemory != null) selectedTargetMemory.Priority -= deltaTime * 10.0f; - steeringManager.SteeringWander(speed); + steeringManager.SteeringWander(); } else if (indoorsSteering.CurrentPath.Finished) { diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs index 898af1d9a..a232f65d1 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs @@ -131,23 +131,20 @@ namespace Barotrauma ignorePlatforms = true; } } + + if (Character.IsClimbing && PathSteering.InLadders && PathSteering.IsNextLadderSameAsCurrent) + { + Character.AnimController.TargetMovement = new Vector2(0.0f, Math.Sign(Character.AnimController.TargetMovement.Y)); + } } Character.AnimController.IgnorePlatforms = ignorePlatforms; - // Suspect that this causes issues when trying to exit from the ladders -> could try to check if the next node is ladder? - //if (Character.IsClimbing) - //{ - // Character.AnimController.TargetMovement = new Vector2(0.0f, Math.Sign(Character.AnimController.TargetMovement.Y)); - //} - Vector2 targetMovement = AnimController.TargetMovement; if (!Character.AnimController.InWater) { - targetMovement = new Vector2( - Character.AnimController.TargetMovement.X, - MathHelper.Clamp(Character.AnimController.TargetMovement.Y, -1.0f, 1.0f)); + targetMovement = new Vector2(Character.AnimController.TargetMovement.X, MathHelper.Clamp(Character.AnimController.TargetMovement.Y, -1.0f, 1.0f)); } float maxSpeed = Character.ApplyTemporarySpeedLimits(currentSpeed); @@ -227,10 +224,6 @@ namespace Barotrauma PropagateHullSafety(Character, Character.CurrentHull); } } - - private void ReportProblems() - { - if (GameMain.Client != null) return; protected void ReportProblems() { @@ -252,7 +245,7 @@ namespace Barotrauma foreach (Character c in Character.CharacterList) { if (c.CurrentHull == Character.CurrentHull && !c.IsDead && - (c.AIController is EnemyAIController || c.TeamID != Character.TeamID)) + (c.AIController is EnemyAIController || (c.TeamID != Character.TeamID && Character.TeamID != Character.TeamType.FriendlyNPC && c.TeamID != Character.TeamType.FriendlyNPC))) { var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportintruders"); newOrder = new Order(orderPrefab, Character.CurrentHull, null); @@ -297,10 +290,13 @@ namespace Barotrauma public override void OnAttacked(Character attacker, AttackResult attackResult) { float damage = attackResult.Damage; - if (damage < 0) { return; } + if (damage <= 0) { return; } if (attacker == null || attacker.IsDead || attacker.Removed) { - objectiveManager.GetObjective().Priority = 100; + if (objectiveManager.CurrentOrder == null) + { + objectiveManager.GetObjective().Priority = 100; + } return; } if (IsFriendly(attacker)) @@ -314,7 +310,10 @@ namespace Barotrauma if (!attacker.IsRemotePlayer && Character.Controlled != attacker && attacker.AIController != null && attacker.AIController.Enabled) { // Don't react to damage done by friendly ai, because we know that it's accidental - objectiveManager.GetObjective().Priority = 100; + if (objectiveManager.CurrentOrder == null) + { + objectiveManager.GetObjective().Priority = 100; + } return; } float currentVitality = Character.CharacterHealth.Vitality; @@ -322,8 +321,10 @@ namespace Barotrauma if (dmgPercentage < currentVitality / 10) { // Don't react to a minor amount of (accidental) dmg done by friendly characters - objectiveManager.GetObjective().Priority = 100; - return; + if (objectiveManager.CurrentOrder == null) + { + objectiveManager.GetObjective().Priority = 100; + } } if (ObjectiveManager.CurrentObjective is AIObjectiveCombat combatObjective) { @@ -465,7 +466,9 @@ namespace Barotrauma // Even the smallest fire reduces the safety by 50% float fire = hull.FireSources.Count * 0.5f + hull.FireSources.Sum(fs => fs.DamageRange) / hull.Size.X; float fireFactor = ignoreFire ? 1 : MathHelper.Lerp(1, 0, MathHelper.Clamp(fire, 0, 1)); - int enemyCount = Character.CharacterList.Count(e => e.CurrentHull == hull && !e.IsDead && !e.IsUnconscious && (e.AIController is EnemyAIController || e.TeamID != character.TeamID)); + int enemyCount = Character.CharacterList.Count(e => + e.CurrentHull == hull && !e.IsDead && !e.IsUnconscious && + (e.AIController is EnemyAIController || (e.TeamID != character.TeamID && character.TeamID != Character.TeamType.FriendlyNPC && e.TeamID != Character.TeamType.FriendlyNPC))); // The hull safety decreases 90% per enemy up to 100% (TODO: test smaller percentages) float enemyFactor = ignoreEnemies ? 1 : MathHelper.Lerp(1, 0, MathHelper.Clamp(enemyCount * 0.9f, 0, 1)); float safety = oxygenFactor * waterFactor * fireFactor * enemyFactor; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs index 723db7700..532d715f3 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs @@ -44,8 +44,8 @@ namespace Barotrauma } public bool InLadders => currentPath != null && currentPath.CurrentNode != null && currentPath.CurrentNode.Ladders != null; - private bool IsNextNodeLadder => currentPath.NextNode != null && currentPath.CurrentNode.Ladders != null; - private bool IsNextLadderSameAsCurrent => IsNextNodeLadder && currentPath.CurrentNode.Ladders == currentPath.NextNode.Ladders; + public bool IsNextNodeLadder => currentPath.NextNode != null && currentPath.CurrentNode.Ladders != null; + public bool IsNextLadderSameAsCurrent => IsNextNodeLadder && currentPath.CurrentNode.Ladders == currentPath.NextNode.Ladders; public bool InStairs => currentPath != null && currentPath.CurrentNode != null && currentPath.CurrentNode.Stairs != null; @@ -213,7 +213,7 @@ namespace Barotrauma } else if (character.AnimController.InWater) { - if (Vector2.DistanceSquared(pos, currentPath.CurrentNode.SimPosition) < collider.radius * collider.radius) + if (Vector2.DistanceSquared(pos, currentPath.CurrentNode.SimPosition) < MathUtils.Pow(collider.radius * 3, 2)) { currentPath.SkipToNextNode(); } @@ -221,11 +221,14 @@ namespace Barotrauma else { Vector2 colliderBottom = character.AnimController.GetColliderBottom(); + Vector2 colliderSize = collider.GetSize(); + // Cannot use the head position, because not all characters have head or it can be below the total height of the character + float characterHeight = colliderSize.Y + character.AnimController.ColliderHeightFromFloor; float horizontalDistance = Math.Abs(collider.SimPosition.X - currentPath.CurrentNode.SimPosition.X); - bool isAboveVerticalPosition = currentPath.CurrentNode.SimPosition.Y > colliderBottom.Y; - bool isNotTooHigh = currentPath.CurrentNode.SimPosition.Y < colliderBottom.Y + 1.5f; + bool isAboveFeet = currentPath.CurrentNode.SimPosition.Y > colliderBottom.Y; + bool isNotTooHigh = currentPath.CurrentNode.SimPosition.Y < colliderBottom.Y + characterHeight; - if (horizontalDistance < collider.radius * 2 && isAboveVerticalPosition && isNotTooHigh) + if (horizontalDistance < collider.radius * 3 && isAboveFeet && isNotTooHigh) { currentPath.SkipToNextNode(); } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/NPCConversation.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/NPCConversation.cs index ccc6363c6..934817d00 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/NPCConversation.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/NPCConversation.cs @@ -31,6 +31,7 @@ namespace Barotrauma List> contentPackageFiles = new List>(); foreach (string filePath in filePaths) { + if (Path.GetExtension(filePath) == ".csv") continue; // .csv files are not supported XDocument doc = XMLExtensions.TryLoadXml(filePath); if (doc == null || doc.Root == null) continue; string language = doc.Root.GetAttributeString("Language", "English"); @@ -41,6 +42,7 @@ namespace Barotrauma List> translationFiles = new List>(); foreach (string filePath in Directory.GetFiles(Path.Combine("Content", "NPCConversations"))) { + if (Path.GetExtension(filePath) == ".csv") continue; // .csv files are not supported XDocument doc = XMLExtensions.TryLoadXml(filePath); if (doc == null || doc.Root == null) continue; string language = doc.Root.GetAttributeString("Language", "English"); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjective.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjective.cs index a4ae023a2..ba4320194 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjective.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjective.cs @@ -139,6 +139,7 @@ namespace Barotrauma } protected virtual bool ShouldInterruptSubObjective(AIObjective subObjective) => false; + public virtual void OnSelected() { } protected abstract void Act(float deltaTime); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveCombat.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveCombat.cs index 1f8813858..8aac40d42 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveCombat.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveCombat.cs @@ -117,6 +117,17 @@ namespace Barotrauma return weapon; } + private void Unequip() + { + if (character.SelectedItems.Contains(Weapon)) + { + if (!Weapon.AllowedSlots.Contains(InvSlotType.Any) || !character.Inventory.TryPutItem(Weapon, character, new List() { InvSlotType.Any })) + { + Weapon.Drop(character); + } + } + } + private bool Equip(float deltaTime) { if (!character.SelectedItems.Contains(Weapon)) @@ -241,7 +252,19 @@ namespace Barotrauma HumanAIController.ObjectiveManager.GetObjective().Priority = 100; } - public override bool IsCompleted() => Enemy == null || Enemy.Removed || Enemy.IsDead || coolDownTimer <= 0.0f; + public override bool IsCompleted() + { + bool completed = Enemy == null || Enemy.Removed || Enemy.IsDead || coolDownTimer <= 0; + if (completed) + { + if (Weapon != null) + { + Unequip(); + } + } + return completed; + } + public override bool CanBeCompleted => !abandon && (reloadWeaponObjective == null || reloadWeaponObjective.CanBeCompleted) && (retreatObjective == null || retreatObjective.CanBeCompleted); public override float GetPriority(AIObjectiveManager objectiveManager) => Enemy == null || Enemy.Removed || Enemy.IsDead ? 0 : 100; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs index e85af365b..7fccbf418 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs @@ -18,7 +18,7 @@ namespace Barotrauma private bool isCompleted; - public bool IgnoreAlreadyContainedItems; + public string[] ignoredContainerIdentifiers; public Func GetItemPriority; @@ -95,7 +95,7 @@ namespace Barotrauma getItemObjective = new AIObjectiveGetItem(character, itemIdentifiers) { GetItemPriority = GetItemPriority, - IgnoreContainedItems = IgnoreAlreadyContainedItems + ignoredContainerIdentifiers = ignoredContainerIdentifiers }; AddSubObjective(getItemObjective); return; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveExtinguishFire.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveExtinguishFire.cs index ad375e55e..3c6c35ce4 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveExtinguishFire.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveExtinguishFire.cs @@ -78,16 +78,18 @@ namespace Barotrauma foreach (FireSource fs in targetHull.FireSources) { - // TODO: check if in the same room? bool inRange = fs.IsInDamageRange(character, MathHelper.Clamp(fs.DamageRange * 1.5f, extinguisher.Range * 0.5f, extinguisher.Range)); - if (!character.IsClimbing && (inRange || useExtinquisherTimer > 0.0f)) + if (targetHull == character.CurrentHull && (inRange || useExtinquisherTimer > 0.0f)) { useExtinquisherTimer += deltaTime; if (useExtinquisherTimer > 2.0f) useExtinquisherTimer = 0.0f; character.CursorPosition = fs.Position; character.SetInput(InputType.Aim, false, true); - character.AIController.SteeringManager.Reset(); + if (!character.IsClimbing) + { + character.AIController.SteeringManager.Reset(); + } extinguisher.Use(deltaTime, character); if (!targetHull.FireSources.Contains(fs)) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindDivingGear.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindDivingGear.cs index b2158a614..647275d2e 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindDivingGear.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindDivingGear.cs @@ -1,5 +1,5 @@ using Barotrauma.Items.Components; -using System; +using Microsoft.Xna.Framework; using System.Linq; namespace Barotrauma @@ -10,31 +10,26 @@ namespace Barotrauma public override bool ForceRun => true; private AIObjective subObjective; - private string gearTag; public override bool IsCompleted() { for (int i = 0; i < character.Inventory.Items.Length; i++) { - if (character.Inventory.SlotTypes[i] == InvSlotType.Any || character.Inventory.Items[i] == null) continue; + if (character.Inventory.SlotTypes[i] == InvSlotType.Any || character.Inventory.Items[i] == null) { continue; } if (character.Inventory.Items[i].HasTag(gearTag)) { var containedItems = character.Inventory.Items[i].ContainedItems; - if (containedItems == null) continue; + if (containedItems == null) { continue; } var oxygenTank = containedItems.FirstOrDefault(it => (it.Prefab.Identifier == "oxygentank" || it.HasTag("oxygensource")) && it.Condition > 0.0f); - if (oxygenTank != null) return true; + if (oxygenTank != null) { return true; } } } - return false; } - public override bool CanBeCompleted => subObjective == null || subObjective.CanBeCompleted; - - public AIObjectiveFindDivingGear(Character character, bool needDivingSuit) - : base(character, "") + public AIObjectiveFindDivingGear(Character character, bool needDivingSuit) : base(character, "") { gearTag = needDivingSuit ? "divingsuit" : "diving"; } @@ -54,12 +49,11 @@ namespace Barotrauma else { var containedItems = item.ContainedItems; - if (containedItems == null) return; - + if (containedItems == null) { return; } //check if there's an oxygen tank in the mask/suit foreach (Item containedItem in containedItems) { - if (containedItem == null) continue; + if (containedItem == null) { continue; } if (containedItem.Condition <= 0.0f) { containedItem.Drop(character); @@ -69,36 +63,21 @@ namespace Barotrauma //we've got an oxygen source inside the mask/suit, all good return; } - } - + } if (!(subObjective is AIObjectiveContainItem) || subObjective.IsCompleted()) { character.Speak(TextManager.Get("DialogGetOxygenTank"), null, 0, "getoxygentank", 30.0f); subObjective = new AIObjectiveContainItem(character, new string[] { "oxygentank", "oxygensource" }, item.GetComponent()); } } - if (subObjective != null) { subObjective.TryComplete(deltaTime); } } - public override float GetPriority(AIObjectiveManager objectiveManager) - { - if (character.AnimController.CurrentHull == null) return 100.0f; - - if (objectiveManager.CurrentOrder == this) - { - return AIObjectiveManager.OrderPriority; - } - - return 100.0f - character.Oxygen; - } - - public override bool IsDuplicate(AIObjective otherObjective) - { - return otherObjective is AIObjectiveFindDivingGear; - } + public override bool CanBeCompleted => subObjective == null || subObjective.CanBeCompleted; + public override float GetPriority(AIObjectiveManager objectiveManager) => MathHelper.Clamp(100 - character.OxygenAvailable, 0, 100); + public override bool IsDuplicate(AIObjective otherObjective) => otherObjective is AIObjectiveFindDivingGear; } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs index 6ad1eeca8..f3afac468 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Barotrauma.Items.Components; namespace Barotrauma { @@ -25,7 +24,7 @@ namespace Barotrauma private float searchHullTimer; private AIObjectiveGoTo goToObjective; - private AIObjective divingGearObjective; + private AIObjectiveFindDivingGear divingGearObjective; public AIObjectiveFindSafety(Character character) : base(character, "") { } @@ -35,13 +34,12 @@ namespace Barotrauma protected override void Act(float deltaTime) { var currentHull = character.AnimController.CurrentHull; - if (HumanAIController.NeedsDivingGear(currentHull)) + if (HumanAIController.NeedsDivingGear(currentHull) && divingGearObjective == null) { bool needsDivingSuit = currentHull == null || currentHull.WaterPercentage > 90; bool hasEquipment = needsDivingSuit ? HumanAIController.HasDivingSuit(character) : HumanAIController.HasDivingGear(character); - if ((divingGearObjective == null || !divingGearObjective.CanBeCompleted) && !hasEquipment) + if (!hasEquipment) { - // If the previous objective cannot be completed, create a new and try again. divingGearObjective = new AIObjectiveFindDivingGear(character, needsDivingSuit); } } @@ -55,9 +53,15 @@ namespace Barotrauma } else if (divingGearObjective.CanBeCompleted) { - // If diving gear objective is active, wait for it to complete. + // If diving gear objective is active and can be completed, wait for it to complete. return; } + else + { + divingGearObjective = null; + // Reset the timer so that we get a safe hull target. + searchHullTimer = 0; + } } if (unreachableClearTimer > 0) @@ -83,17 +87,18 @@ namespace Barotrauma { if (goToObjective.Target != bestHull) { - goToObjective = new AIObjectiveGoTo(bestHull, character) + // If we need diving gear, we should already have it, if possible. + goToObjective = new AIObjectiveGoTo(bestHull, character, getDivingGearIfNeeded: false) { - AllowGoingOutside = true + AllowGoingOutside = HumanAIController.HasDivingSuit(character) }; } } else { - goToObjective = new AIObjectiveGoTo(bestHull, character) + goToObjective = new AIObjectiveGoTo(bestHull, character, getDivingGearIfNeeded: false) { - AllowGoingOutside = true + AllowGoingOutside = HumanAIController.HasDivingSuit(character) }; } } @@ -110,6 +115,7 @@ namespace Barotrauma unreachable.Add(goToObjective.Target as Hull); } goToObjective = null; + SteeringManager.SteeringWander(); } } else if (currentHull != null) @@ -126,6 +132,11 @@ namespace Barotrauma foreach (Character enemy in Character.CharacterList) { + //don't run from friendly NPCs + if (enemy.TeamID == Character.TeamType.FriendlyNPC) { continue; } + //friendly NPCs don't run away from anything but characters controlled by EnemyAIController (= monsters) + if (character.TeamID == Character.TeamType.FriendlyNPC && !(enemy.AIController is EnemyAIController)) { continue; } + if (enemy.CurrentHull == currentHull && !enemy.IsDead && !enemy.IsUnconscious && (enemy.AIController is EnemyAIController || enemy.TeamID != character.TeamID)) { @@ -170,13 +181,15 @@ namespace Barotrauma if (unreachable.Contains(hull)) { continue; } if (!character.Submarine.IsConnectedTo(hull.Submarine)) { continue; } hullSafety = HumanAIController.GetHullSafety(hull, character); - var path = PathSteering.PathFinder.FindPath(character.SimPosition, hull.SimPosition); - int unsafeNodes = path.Nodes.Count(n => n.CurrentHull != character.CurrentHull && HumanAIController.UnsafeHulls.Contains(n.CurrentHull)); // Vertical distance matters more than horizontal (climbing up/down is harder than moving horizontally) float dist = Math.Abs(character.WorldPosition.X - hull.WorldPosition.X) + Math.Abs(character.WorldPosition.Y - hull.WorldPosition.Y) * 2.0f; float distanceFactor = MathHelper.Lerp(1, 0.9f, MathUtils.InverseLerp(0, 10000, dist)); hullSafety *= distanceFactor; // Each unsafe node reduces the hull safety value. + // Ignore current hull, because otherwise the would block all paths from the current hull to the target hull. + var path = PathSteering.PathFinder.FindPath(character.SimPosition, hull.SimPosition); + if (path.Unreachable) { continue; } + int unsafeNodes = path.Nodes.Count(n => n.CurrentHull != character.CurrentHull && HumanAIController.UnsafeHulls.Contains(n.CurrentHull)); hullSafety /= 1 + unsafeNodes; // If the target is not inside a friendly submarine, considerably reduce the hull safety. if (!character.Submarine.IsEntityFoundOnThisSub(hull, true)) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs index 8a29fefcd..d575a62e4 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs @@ -31,7 +31,7 @@ namespace Barotrauma public override bool IsCompleted() { - return leak.Open <= 0.0f || leak.Removed || pathUnreachable; + return leak.Open <= 0.0f || leak.Removed; } public override bool CanBeCompleted => !abandon && base.CanBeCompleted; @@ -94,16 +94,15 @@ namespace Barotrauma if (repairTool == null) { return; } Vector2 gapDiff = leak.WorldPosition - character.WorldPosition; - var humanoidController = character.AnimController as HumanoidAnimController; // TODO: use the collider size/reach? - if (!character.AnimController.InWater && humanoidController != null && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) + if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) { - ((HumanoidAnimController)character.AnimController).Crouching = true; + HumanAIController.AnimController.Crouching = true; } - float armLength = humanoidController != null ? ConvertUnits.ToDisplayUnits(humanoidController.ArmLength) : 100; - bool cannotReach = gapDiff.Length() > armLength + repairTool.Range; + float reach = HumanAIController.AnimController.ArmLength + ConvertUnits.ToSimUnits(repairTool.Range); + bool cannotReach = ConvertUnits.ToSimUnits(gapDiff.Length()) > reach; if (cannotReach) { if (gotoObjective != null) @@ -116,7 +115,10 @@ namespace Barotrauma } else { - gotoObjective = new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character); + gotoObjective = new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character) + { + CloseEnough = reach * 0.75f + }; if (!subObjectives.Contains(gotoObjective)) { AddSubObjective(gotoObjective); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs index 68428100b..7f20924c1 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs @@ -3,6 +3,7 @@ using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.Linq; +using Barotrauma.Extensions; namespace Barotrauma { @@ -14,19 +15,15 @@ namespace Barotrauma //can be either tags or identifiers private string[] itemIdentifiers; - private Item targetItem, moveToTarget; - private int currSearchIndex; - - public bool IgnoreContainedItems; - + public string[] ignoredContainerIdentifiers; private AIObjectiveGoTo goToObjective; - private float currItemPriority; - private bool equip; + private HashSet ignoredItems = new HashSet(); + private bool canBeCompleted = true; public override bool CanBeCompleted => canBeCompleted; @@ -36,25 +33,19 @@ namespace Barotrauma { return AIObjectiveManager.OrderPriority; } - return 1.0f; } - public AIObjectiveGetItem(Character character, Item targetItem, bool equip = false) - : base(character, "") + public AIObjectiveGetItem(Character character, Item targetItem, bool equip = false) : base(character, "") { currSearchIndex = -1; this.equip = equip; this.targetItem = targetItem; } - public AIObjectiveGetItem(Character character, string itemIdentifier, bool equip = false) - : this(character, new string[] { itemIdentifier }, equip) - { - } + public AIObjectiveGetItem(Character character, string itemIdentifier, bool equip = false) : this(character, new string[] { itemIdentifier }, equip) { } - public AIObjectiveGetItem(Character character, string[] itemIdentifiers, bool equip = false) - : base(character, "") + public AIObjectiveGetItem(Character character, string[] itemIdentifiers, bool equip = false) : base(character, "") { currSearchIndex = -1; this.equip = equip; @@ -108,12 +99,12 @@ namespace Barotrauma FindTargetItem(); if (targetItem == null || moveToTarget == null) { - // TODO: cannot be completed? - character?.AIController?.SteeringManager?.Reset(); + SteeringManager.SteeringWander(); return; } - if (Vector2.Distance(character.Position, moveToTarget.Position) < targetItem.InteractDistance * 2.0f) + if (moveToTarget.CurrentHull == character.CurrentHull && + Vector2.DistanceSquared(character.Position, moveToTarget.Position) < MathUtils.Pow(targetItem.InteractDistance * 2, 2)) { int targetSlot = -1; if (equip) @@ -169,9 +160,13 @@ namespace Barotrauma } goToObjective.TryComplete(deltaTime); - if (!goToObjective.CanBeCompleted) targetItem = null; + if (!goToObjective.CanBeCompleted) + { + targetItem = null; + moveToTarget = null; + ignoredItems.Add(targetItem); + } } - } /// @@ -196,22 +191,30 @@ namespace Barotrauma currSearchIndex++; var item = Item.ItemList[currSearchIndex]; + if (ignoredItems.Contains(item)) { continue; } + if (item.Submarine == null) { continue; } + else if (item.Submarine.TeamID != character.TeamID) { continue; } + else if (character.Submarine != null && !character.Submarine.IsEntityFoundOnThisSub(item, true)) { continue; } - if (item.CurrentHull == null || item.Condition <= 0.0f) continue; - if (IgnoreContainedItems && item.Container != null) continue; - if (!itemIdentifiers.Any(id => item.Prefab.Identifier == id || item.HasTag(id))) continue; + if (item.CurrentHull == null || item.Condition <= 0.0f) { continue; } + if (itemIdentifiers.None(id => item.Prefab.Identifier == id || item.HasTag(id))) { continue; } + + if (ignoredContainerIdentifiers != null && item.Container != null) + { + if (ignoredContainerIdentifiers.Contains(item.ContainerIdentifier)) { continue; } + } //if the item is inside a character's inventory, don't steal it unless the character is dead if (item.ParentInventory is CharacterInventory) { - if (item.ParentInventory.Owner is Character owner && !owner.IsDead) continue; + if (item.ParentInventory.Owner is Character owner && !owner.IsDead) { continue; } } //if the item is inside an item, which is inside a character's inventory, don't steal it Item rootContainer = item.GetRootContainer(); if (rootContainer != null && rootContainer.ParentInventory is CharacterInventory) { - if (rootContainer.ParentInventory.Owner is Character owner && !owner.IsDead) continue; + if (rootContainer.ParentInventory.Owner is Character owner && !owner.IsDead) { continue; } } float itemPriority = 0.0f; @@ -219,13 +222,13 @@ namespace Barotrauma { //ignore if the item has zero priority itemPriority = GetItemPriority(item); - if (itemPriority <= 0.0f) continue; + if (itemPriority <= 0.0f) { continue; } } itemPriority = itemPriority - Vector2.Distance((rootContainer ?? item).Position, character.Position) * 0.01f; //ignore if the item has a lower priority than the currently selected one - if (moveToTarget != null && itemPriority < currItemPriority) continue; + if (moveToTarget != null && itemPriority < currItemPriority) { continue; } currItemPriority = itemPriority; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs index f4a2ab366..f96dd6153 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs @@ -186,11 +186,11 @@ namespace Barotrauma bool completed = false; - float allowedDistance = 0.5f; + float allowedDistance = CloseEnough; if (Target is Item item) { - allowedDistance = Math.Max(ConvertUnits.ToSimUnits(item.InteractDistance), allowedDistance); + allowedDistance = Math.Max(ConvertUnits.ToSimUnits(item.InteractDistance), CloseEnough); if (item.IsInsideTrigger(character.WorldPosition)) completed = true; } else if (Target is Character targetCharacter) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs index 7d0794a5a..a4138c65c 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs @@ -200,6 +200,7 @@ namespace Barotrauma // Check that there is no unsafe or forbidden hulls on the way to the target // Only do this when the current hull is ok, because otherwise the would block all paths from the current hull to the target hull. var path = PathSteering.PathFinder.FindPath(character.SimPosition, hull.SimPosition); + if (path.Unreachable) { continue; } if (path.Nodes.Any(n => HumanAIController.UnsafeHulls.Contains(n.CurrentHull) || IsForbidden(n.CurrentHull))) { continue; } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveLoop.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveLoop.cs index 070d8c2c8..0be3827fd 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveLoop.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveLoop.cs @@ -30,9 +30,7 @@ namespace Barotrauma base.Update(objectiveManager, deltaTime); if (ignoreListTimer > ignoreListClearInterval) { - ignoreList.Clear(); - ignoreListTimer = 0; - UpdateTargets(); + Reset(); } else { @@ -67,16 +65,24 @@ namespace Barotrauma } } + private void Reset() + { + ignoreList.Clear(); + ignoreListTimer = 0; + UpdateTargets(); + } + + public override void OnSelected() + { + Reset(); + } + public override float GetPriority(AIObjectiveManager objectiveManager) { if (character.Submarine == null) { return 0; } if (targets.None()) { return 0; } float avg = targets.Average(t => Average(t)); - if (objectiveManager.CurrentOrder == this) - { - return AIObjectiveManager.OrderPriority - MathHelper.Max(0, AIObjectiveManager.OrderPriority - avg); - } - return MathHelper.Lerp(0, AIObjectiveManager.OrderPriority, avg / 100); + return MathHelper.Lerp(0, AIObjectiveManager.OrderPriority + 20, avg / 100); } protected void UpdateTargets() diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs index 31b2a9015..988518098 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs @@ -67,6 +67,7 @@ namespace Barotrauma private AIObjective GetCurrentObjective() { + var previousObjective = CurrentObjective; var firstObjective = Objectives.FirstOrDefault(); if (CurrentOrder != null && firstObjective != null && CurrentOrder.GetPriority(this) > firstObjective.GetPriority(this)) { @@ -76,6 +77,10 @@ namespace Barotrauma { CurrentObjective = firstObjective; } + if (previousObjective != CurrentObjective) + { + CurrentObjective?.OnSelected(); + } return CurrentObjective; } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRepairItem.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRepairItem.cs index fe0730eff..99a856cd5 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRepairItem.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRepairItem.cs @@ -3,6 +3,7 @@ using Microsoft.Xna.Framework; using System; using System.Linq; using Barotrauma.Extensions; +using FarseerPhysics; namespace Barotrauma { @@ -84,7 +85,14 @@ namespace Barotrauma } if (character.CanInteractWith(Item)) { - OperateRepairTool(deltaTime); + if (repairTool == null) + { + FindRepairTool(); + } + if (repairTool != null) + { + OperateRepairTool(deltaTime); + } foreach (Repairable repairable in Item.Repairables) { if (repairable.CurrentFixer != null && repairable.CurrentFixer != character) @@ -121,13 +129,17 @@ namespace Barotrauma subObjectives.Remove(goToObjective); } goToObjective = new AIObjectiveGoTo(Item, character); + if (repairTool != null) + { + goToObjective.CloseEnough = (HumanAIController.AnimController.ArmLength + ConvertUnits.ToSimUnits(repairTool.Range)) * 0.75f; + } AddSubObjective(goToObjective); } } - private void OperateRepairTool(float deltaTime) + private RepairTool repairTool; + private void FindRepairTool() { - // Operate repair tool, if required. foreach (Repairable repairable in Item.Repairables) { foreach (var kvp in repairable.requiredItems) @@ -138,19 +150,29 @@ namespace Barotrauma { if (requiredItem.MatchesItem(item)) { - var repairTool = item.GetComponent(); - if (repairTool != null) - { - character.CursorPosition = Item.Position; - character.SetInput(InputType.Aim, false, true); - repairTool.Use(deltaTime, character); - return; - } + repairTool = item.GetComponent(); } } } } } } + + private void OperateRepairTool(float deltaTime) + { + character.CursorPosition = Item.Position; + character.SetInput(InputType.Aim, false, true); + Vector2 fromToolToTarget = Item.Position - repairTool.Item.Position; + if (fromToolToTarget.LengthSquared() < MathUtils.Pow(repairTool.Range / 2, 2)) + { + // Too close -> steer away + character.AIController.SteeringManager.SteeringManual(deltaTime, Vector2.Normalize(character.SimPosition - Item.SimPosition) / 2); + } + if (character.IsClimbing || + VectorExtensions.Angle(VectorExtensions.Forward(repairTool.Item.body.TransformedRotation), fromToolToTarget) < MathHelper.PiOver4) + { + repairTool.Use(deltaTime, character); + } + } } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRepairItems.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRepairItems.cs index 4433311ba..2b2afd3f5 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRepairItems.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRepairItems.cs @@ -51,8 +51,14 @@ namespace Barotrauma { foreach (Repairable repairable in item.Repairables) { - if (item.Condition > repairable.ShowRepairUIThreshold) { ignore = true; } - else if (RequireAdequateSkills && !repairable.HasRequiredSkills(character)) { ignore = true; } + if (!objectives.ContainsKey(item) && item.Condition > repairable.ShowRepairUIThreshold) + { + ignore = true; + } + else if (RequireAdequateSkills && !repairable.HasRequiredSkills(character)) + { + ignore = true; + } if (ignore) { break; } } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/PathFinder.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/PathFinder.cs index a6b21cd00..df3e8eb31 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/PathFinder.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/PathFinder.cs @@ -203,7 +203,7 @@ namespace Barotrauma { DebugConsole.NewMessage("Pathfinding error, couldn't find a start node. "+ errorMsgStr, Color.DarkRed); - return new SteeringPath(); + return new SteeringPath(true); } closestDist = 0.0f; @@ -225,8 +225,12 @@ namespace Barotrauma //if searching for a path inside the sub, make sure the waypoint is visible if (insideSubmarine) { + // TODO: for some reason fails to find the path when the sub is flooding. Disabling this check helps fixes it, but we can't disable it var body = Submarine.CheckVisibility(end, node.Waypoint.SimPosition); - if (body != null && body.UserData is Structure) continue; + if (body != null && body.UserData is Structure) + { + continue; + } } closestDist = dist; @@ -237,10 +241,9 @@ namespace Barotrauma if (endNode == null) { DebugConsole.NewMessage("Pathfinding error, couldn't find an end node. " + errorMsgStr, Color.DarkRed); - return new SteeringPath(); + return new SteeringPath(true); } - var path = FindPath(startNode, endNode); return path; @@ -266,7 +269,7 @@ namespace Barotrauma if (startNode == null || endNode == null) { DebugConsole.NewMessage("Pathfinding error, couldn't find matching pathnodes to waypoints.", Color.DarkRed); - return new SteeringPath(); + return new SteeringPath(true); } return FindPath(startNode, endNode); @@ -290,13 +293,12 @@ namespace Barotrauma node.G = 0.0f; node.H = 0.0f; } - + start.state = 1; while (true) { - PathNode currNode = null; - float dist = 10000.0f; + float dist = float.MaxValue; foreach (PathNode node in nodes) { if (node.state != 1) continue; @@ -364,7 +366,7 @@ namespace Barotrauma if (end.state == 0 || end.Parent == null) { - //path not found + //DebugConsole.NewMessage("Pathfinding error: path not found", Color.DarkRed); return new SteeringPath(true); } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs index 7ec344357..ce2078c17 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs @@ -683,12 +683,6 @@ namespace Barotrauma limb.body.ApplyForce(diff * (float)(Math.Sin(WalkPos) * Math.Sqrt(limb.Mass)) * 30.0f * animStrength); } - while (referenceLimb.Rotation - angle < -MathHelper.TwoPi) - { - angle -= MathHelper.TwoPi; - } - - limb?.body.SmoothRotate(angle, torque, wrapAngle: false); } private void SmoothRotateWithoutWrapping(Limb limb, float angle, Limb referenceLimb, float torque) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs index 57e1501f6..241a2fb3b 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs @@ -1059,6 +1059,8 @@ namespace Barotrauma } } + private float prevFootPos; + void UpdateClimbing() { if (character.SelectedConstruction == null || character.SelectedConstruction.GetComponent() == null) @@ -1137,15 +1139,34 @@ namespace Barotrauma handPos.X - Dir * 0.05f, bottomPos + ColliderHeightFromFloor - stepHeight * 2.7f - ladderSimPos.Y); - MoveLimb(leftFoot, - new Vector2(footPos.X, - (slide ? footPos.Y : MathUtils.Round(footPos.Y + stepHeight, stepHeight * 2.0f) - stepHeight) + ladderSimPos.Y), - 15.5f, true); + if (slide) + { + MoveLimb(leftFoot, new Vector2(footPos.X, footPos.Y + ladderSimPos.Y), 15.5f, true); + MoveLimb(rightFoot, new Vector2(footPos.X, footPos.Y + ladderSimPos.Y), 15.5f, true); + } + else + { + float leftFootPos = MathUtils.Round(footPos.Y + stepHeight, stepHeight * 2.0f) - stepHeight; + float prevLeftFootPos = MathUtils.Round(prevFootPos + stepHeight, stepHeight * 2.0f) - stepHeight; + MoveLimb(leftFoot, new Vector2(footPos.X, leftFootPos + ladderSimPos.Y), 15.5f, true); - MoveLimb(rightFoot, - new Vector2(footPos.X, - (slide ? footPos.Y : MathUtils.Round(footPos.Y, stepHeight * 2.0f)) + ladderSimPos.Y), - 15.5f, true); + float rightFootPos = MathUtils.Round(footPos.Y, stepHeight * 2.0f); + float prevRightFootPos = MathUtils.Round(prevFootPos, stepHeight * 2.0f); + MoveLimb(rightFoot, new Vector2(footPos.X, rightFootPos + ladderSimPos.Y), 15.5f, true); +#if CLIENT + if (Math.Abs(leftFootPos - prevLeftFootPos) > stepHeight && leftFoot.LastImpactSoundTime < Timing.TotalTime - Limb.SoundInterval) + { + SoundPlayer.PlaySound("footstep_armor_heavy", volume: 0.5f, range: 500.0f, position: leftFoot.WorldPosition); + leftFoot.LastImpactSoundTime = (float)Timing.TotalTime; + } + if (Math.Abs(rightFootPos - prevRightFootPos) > stepHeight && rightFoot.LastImpactSoundTime < Timing.TotalTime - Limb.SoundInterval) + { + SoundPlayer.PlaySound("footstep_armor_heavy", volume: 0.5f, range: 500.0f, position: rightFoot.WorldPosition); + rightFoot.LastImpactSoundTime = (float)Timing.TotalTime; + } +#endif + prevFootPos = footPos.Y; + } //apply torque to the legs to make the knees bend Limb leftLeg = GetLimb(LimbType.LeftLeg); @@ -1781,14 +1802,24 @@ namespace Barotrauma float c = Vector2.Distance(pos, shoulderPos); c = MathHelper.Clamp(c, Math.Abs(upperArmLength - forearmLength), forearmLength + upperArmLength - 0.01f); - float ang2 = MathUtils.VectorToAngle(pos - shoulderPos) + MathHelper.PiOver2; + float armAngle = MathUtils.VectorToAngle(pos - shoulderPos) + MathHelper.PiOver2; - float armAngle = MathUtils.SolveTriangleSSS(forearmLength, upperArmLength, c); - float handAngle = MathUtils.SolveTriangleSSS(upperArmLength, forearmLength, c); + float upperArmAngle = MathUtils.SolveTriangleSSS(forearmLength, upperArmLength, c) * Dir; + float lowerArmAngle = MathUtils.SolveTriangleSSS(upperArmLength, forearmLength, c) * Dir; + + //make sure the arm angle "has the same number of revolutions" as the arm + while (arm.Rotation - armAngle > MathHelper.Pi) + { + armAngle += MathHelper.TwoPi; + } + while (arm.Rotation - armAngle < -MathHelper.Pi) + { + armAngle -= MathHelper.TwoPi; + } - arm?.body.SmoothRotate((ang2 - armAngle * Dir), 20.0f * force * arm.Mass); - forearm?.body.SmoothRotate((ang2 + handAngle * Dir), 20.0f * force * forearm.Mass); - hand?.body.SmoothRotate((ang2 + handAngle * Dir), 100.0f * force * hand.Mass); + arm?.body.SmoothRotate((armAngle - upperArmAngle), 20.0f * force * arm.Mass, wrapAngle: false); + forearm?.body.SmoothRotate((armAngle + lowerArmAngle), 20.0f * force * forearm.Mass, wrapAngle: false); + hand?.body.SmoothRotate((armAngle + lowerArmAngle), 100.0f * force * hand.Mass, wrapAngle: false); } private void FootIK(Limb foot, Vector2 pos, float legTorque, float footTorque, float footAngle) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs index b0333fdc5..db8b8cb03 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs @@ -86,7 +86,10 @@ namespace Barotrauma public bool onGround; private bool ignorePlatforms; - protected float ColliderHeightFromFloor => ConvertUnits.ToSimUnits(RagdollParams.ColliderHeightFromFloor) * RagdollParams.JointScale; + /// + /// In sim units. Joint scale applied. + /// + public float ColliderHeightFromFloor => ConvertUnits.ToSimUnits(RagdollParams.ColliderHeightFromFloor) * RagdollParams.JointScale; public Structure Stairs; @@ -1324,6 +1327,19 @@ namespace Barotrauma } if (errorMsg != null) { + if (character.IsRemotePlayer) + { + errorMsg += " Ragdoll controlled remotely."; + } + if (SimplePhysicsEnabled) + { + errorMsg += " Simple physics enabled."; + } + if (GameMain.NetworkMember != null) + { + errorMsg += GameMain.NetworkMember.IsClient ? " Playing as a client." : " Hosting a server."; + } + #if DEBUG DebugConsole.ThrowError(errorMsg); #else @@ -1343,7 +1359,6 @@ namespace Barotrauma SetInitialLimbPositions(); return; } - UpdateProjSpecific(deltaTime); } partial void UpdateProjSpecific(float deltaTime); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index 31d6c2941..02752edfe 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -120,8 +120,6 @@ namespace Barotrauma private List statusEffects = new List(); private List speedMultipliers = new List(); - private List statusEffects = new List(); - public Entity ViewTarget { get; @@ -330,7 +328,8 @@ namespace Barotrauma pressureProtection = MathHelper.Clamp(value, 0.0f, 100.0f); } } - + + private float ragdollingLockTimer; public bool IsRagdolled; public bool IsForceRagdolled; public bool dontFollowCursor; @@ -1877,8 +1876,6 @@ namespace Barotrauma } speechImpedimentSet = false; - - if (needsAir) { bool protectedFromPressure = PressureProtection > 0.0f; @@ -1935,9 +1932,23 @@ namespace Barotrauma //Do ragdoll shenanigans before Stun because it's still technically a stun, innit? Less network updates for us! bool allowRagdoll = GameMain.NetworkMember != null ? GameMain.NetworkMember.ServerSettings.AllowRagdollButton : true; if (IsForceRagdolled) + { IsRagdolled = IsForceRagdolled; - else if (allowRagdoll && (!IsRagdolled || AnimController.Collider.LinearVelocity.LengthSquared() < 1f)) //Keep us ragdolled if we were forced or we're too speedy to unragdoll - IsRagdolled = IsKeyDown(InputType.Ragdoll); //Handle this here instead of Control because we can stop being ragdolled ourselves + } + //Keep us ragdolled if we were forced or we're too speedy to unragdoll + else if (allowRagdoll && (!IsRagdolled || AnimController.Collider.LinearVelocity.LengthSquared() < 1f)) + { + if (ragdollingLockTimer > 0.0f) + { + ragdollingLockTimer -= deltaTime; + } + else + { + bool wasRagdolled = IsRagdolled; + IsRagdolled = IsKeyDown(InputType.Ragdoll); //Handle this here instead of Control because we can stop being ragdolled ourselves + if (wasRagdolled != IsRagdolled) { ragdollingLockTimer = 0.25f; } + } + } UpdateSightRange(); UpdateSoundRange(); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/NPCPersonalityTrait.cs b/Barotrauma/BarotraumaShared/Source/Characters/NPCPersonalityTrait.cs index d4754c5c5..d19507a1e 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/NPCPersonalityTrait.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/NPCPersonalityTrait.cs @@ -19,6 +19,10 @@ namespace Barotrauma public readonly List AllowedDialogTags; private float commonness; + public float Commonness + { + get { return commonness; } + } public NPCPersonalityTrait(XElement element) { diff --git a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs index 64803cc93..17347cacc 100644 --- a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs @@ -457,20 +457,6 @@ namespace Barotrauma } })); -#if CLIENT && WINDOWS - commands.Add(new Command("copyitemnames", "", (string[] args) => - { - StringBuilder sb = new StringBuilder(); - foreach (MapEntityPrefab mp in MapEntityPrefab.List) - { - if (!(mp is ItemPrefab)) continue; - sb.AppendLine(mp.Name); - } - System.Windows.Clipboard.SetText(sb.ToString()); - })); -#endif - - commands.Add(new Command("findentityids", "findentityids [entityname]", (string[] args) => { if (args.Length == 0) return; @@ -1435,58 +1421,25 @@ namespace Barotrauma #if SERVER if (GameMain.Server != null) { - case "cursor": - spawnPos = cursorPos; - break; - case "inventory": - spawnInventory = controlledCharacter?.Inventory; - break; - case "cargo": - var wp = WayPoint.GetRandom(SpawnType.Cargo, null, Submarine.MainSub); - spawnPos = wp == null ? Vector2.Zero : wp.WorldPosition; - break; - default: - //Check if last arg matches the name of an in-game player - if (GameMain.Server != null) - { - var client = GameMain.Server.ConnectedClients.Find(c => c.Name.ToLower() == args.Last().ToLower()); - if (client == null) - { - NewMessage("No player found with the name \"" + args.Last() + "\". Spawning item at random location. If the player you want to give the item to has a space in their name, try surrounding their name with quotes (\").", Color.Red); - break; - } - else if (client.Character == null) - { - errorMsg = "The player \"" + args.Last() + "\" is connected, but hasn't spawned yet."; - return; - } - else - { - //If the last arg matches the name of an in-game player, set the destination to their inventory. - spawnInventory = client.Character.Inventory; - break; - } - } - else - { - var matchingCharacter = FindMatchingCharacter(args.Skip(1).ToArray()); - if (matchingCharacter?.Inventory != null) spawnInventory = matchingCharacter.Inventory; - } - break; + var client = GameMain.Server.ConnectedClients.Find(c => c.Name.ToLower() == args.Last().ToLower()); + if (client != null) + { + extraParams += 1; + itemName = string.Join(" ", args.Take(args.Length - extraParams)).ToLowerInvariant(); + if (client.Character != null && client.Character.Name == args.Last().ToLower()) spawnInventory = client.Character.Inventory; + itemPrefab = MapEntityPrefab.Find(itemName) as ItemPrefab; + } } #endif } - - string itemName = args[0]; - - var itemPrefab = MapEntityPrefab.Find(itemName) as ItemPrefab; + //Check again if the item can be found again after having checked for a character if (itemPrefab == null) { errorMsg = "Item \"" + itemName + "\" not found!"; return; } - if (spawnPos == null && spawnInventory == null) + if ((spawnPos == null || spawnPos == Vector2.Zero) && spawnInventory == null) { var wp = WayPoint.GetRandom(SpawnType.Human, null, Submarine.MainSub); spawnPos = wp == null ? Vector2.Zero : wp.WorldPosition; @@ -1495,6 +1448,7 @@ namespace Barotrauma if (spawnPos != null) { Entity.Spawner.AddToSpawnQueue(itemPrefab, (Vector2)spawnPos); + } else if (spawnInventory != null) { diff --git a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/CampaignMode.cs b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/CampaignMode.cs index 038b6a441..220e756cd 100644 --- a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/CampaignMode.cs +++ b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/CampaignMode.cs @@ -12,7 +12,7 @@ namespace Barotrauma public bool CheatsEnabled; - const int InitialMoney = 4500; + const int InitialMoney = 4700; protected bool watchmenSpawned; protected Character startWatchman, endWatchman; diff --git a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/MultiPlayerCampaign.cs index b961107de..461209f64 100644 --- a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/MultiPlayerCampaign.cs @@ -45,8 +45,6 @@ namespace Barotrauma private static byte currentCampaignID; - private List characterData = new List(); - public byte CampaignID { get; private set; @@ -217,7 +215,7 @@ namespace Barotrauma break; } } - +#if SERVER characterData.Clear(); string characterDataPath = GetCharacterDataSavePath(); var characterDataDoc = XMLExtensions.TryLoadXml(characterDataPath); @@ -226,33 +224,8 @@ namespace Barotrauma { characterData.Add(new CharacterCampaignData(subElement)); } +#endif } - public override void Save(XElement element) - { - XElement modeElement = new XElement("MultiPlayerCampaign", - new XAttribute("money", Money), - new XAttribute("cheatsenabled", CheatsEnabled)); - Map.Save(modeElement); - element.Add(modeElement); - - //save character data to a separate file - string characterDataPath = GetCharacterDataSavePath(); - XDocument characterDataDoc = new XDocument(new XElement("CharacterData")); - foreach (CharacterCampaignData cd in characterData) - { - characterDataDoc.Root.Add(cd.Save()); - } - try - { - characterDataDoc.Save(characterDataPath); - } - catch (Exception e) - { - DebugConsole.ThrowError("Saving multiplayer campaign characters to \"" + characterDataPath + "\" failed!", e); - } - - lastSaveID++; - } } } diff --git a/Barotrauma/BarotraumaShared/Source/GameSettings.cs b/Barotrauma/BarotraumaShared/Source/GameSettings.cs index e8b625621..2fd21c4aa 100644 --- a/Barotrauma/BarotraumaShared/Source/GameSettings.cs +++ b/Barotrauma/BarotraumaShared/Source/GameSettings.cs @@ -36,34 +36,6 @@ namespace Barotrauma public bool VSyncEnabled { get; set; } public bool EnableSplashScreen { get; set; } - - public int ParticleLimit { get; set; } - - public int ParticleLimit { get; set; } - - public float LightMapScale { get; set; } - public bool SpecularityEnabled { get; set; } - public bool ChromaticAberrationEnabled { get; set; } - - public int ParticleLimit { get; set; } - - public float LightMapScale { get; set; } - public bool SpecularityEnabled { get; set; } - public bool ChromaticAberrationEnabled { get; set; } - - public bool MuteOnFocusLost { get; set; } - - public enum VoiceMode - { - Disabled, - PushToTalk, - Activity - }; - - public VoiceMode VoiceSetting { get; set; } - public string VoiceCaptureDevice { get; set; } - - public int ParticleLimit { get; set; } public int ParticleLimit { get; set; } @@ -196,7 +168,7 @@ namespace Barotrauma } } - private float soundVolume = 0.5f, musicVolume = 0.3f, voiceChatVolume = 0.5f; + private float soundVolume = 0.5f, musicVolume = 0.3f, voiceChatVolume = 0.5f, microphoneVolume = 1.0f; public float SoundVolume { @@ -239,6 +211,14 @@ namespace Barotrauma } } + public float MicrophoneVolume + { + get { return microphoneVolume; } + set + { + microphoneVolume = MathHelper.Clamp(value, 0.1f, 5.0f); + } + } public string Language { get { return TextManager.Language; } @@ -397,10 +377,6 @@ namespace Barotrauma AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", 0.5f); - AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", 0.5f); - - AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", 0.5f); - keyMapping = new KeyOrMouse[Enum.GetNames(typeof(InputType)).Length]; keyMapping[(int)InputType.Up] = new KeyOrMouse(Keys.W); keyMapping[(int)InputType.Down] = new KeyOrMouse(Keys.S); @@ -509,70 +485,6 @@ namespace Barotrauma SelectedContentPackages.Add(matchingContentPackage); } break; - } - } - - TextManager.LoadTextPacks(SelectedContentPackages); - - //display error messages after all content packages have been loaded - //to make sure the package that contains text files has been loaded before we attempt to use TextManager - foreach (string missingPackagePath in missingPackagePaths) - { - DebugConsole.ThrowError(TextManager.Get("ContentPackageNotFound").Replace("[packagepath]", missingPackagePath)); - } - foreach (ContentPackage incompatiblePackage in incompatiblePackages) - { - DebugConsole.ThrowError(TextManager.Get(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage") - .Replace("[packagename]", incompatiblePackage.Name) - .Replace("[packageversion]", incompatiblePackage.GameVersion.ToString()) - .Replace("[gameversion]", GameMain.Version.ToString())); - } - foreach (ContentPackage contentPackage in SelectedContentPackages) - { - foreach (ContentFile file in contentPackage.Files) - { - if (!System.IO.File.Exists(file.Path)) - { - DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found."); - continue; - } - ToolBox.IsProperFilenameCase(file.Path); - } - } - - TextManager.LoadTextPacks(SelectedContentPackages); - - //display error messages after all content packages have been loaded - //to make sure the package that contains text files has been loaded before we attempt to use TextManager - foreach (string missingPackagePath in missingPackagePaths) - { - DebugConsole.ThrowError(TextManager.Get("ContentPackageNotFound").Replace("[packagepath]", missingPackagePath)); - } - foreach (ContentPackage incompatiblePackage in incompatiblePackages) - { - DebugConsole.ThrowError(TextManager.Get(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage") - .Replace("[packagename]", incompatiblePackage.Name) - .Replace("[packageversion]", incompatiblePackage.GameVersion.ToString()) - .Replace("[gameversion]", GameMain.Version.ToString())); - } - foreach (ContentPackage contentPackage in SelectedContentPackages) - { - foreach (ContentFile file in contentPackage.Files) - { - if (!System.IO.File.Exists(file.Path)) - { - DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found."); - continue; - } - ToolBox.IsProperFilenameCase(file.Path); - } - } - if (!SelectedContentPackages.Any()) - { - var availablePackage = ContentPackage.List.FirstOrDefault(cp => cp.IsCompatible() && cp.CorePackage); - if (availablePackage != null) - { - SelectedContentPackages.Add(availablePackage); } } @@ -1021,369 +933,7 @@ namespace Barotrauma gMode = new XElement("graphicsmode"); doc.Root.Add(gMode); } - if (GraphicsWidth == 0 || GraphicsHeight == 0) - { - gMode.ReplaceAttributes(new XAttribute("displaymode", windowMode)); - } - else - { - gMode.ReplaceAttributes( - new XAttribute("width", GraphicsWidth), - new XAttribute("height", GraphicsHeight), - new XAttribute("vsync", VSyncEnabled), - new XAttribute("displaymode", windowMode)); - } - XElement gSettings = doc.Root.Element("graphicssettings"); - if (gSettings == null) - { - gSettings = new XElement("graphicssettings"); - doc.Root.Add(gSettings); - } - - gSettings.ReplaceAttributes( - new XAttribute("particlelimit", ParticleLimit), - new XAttribute("lightmapscale", LightMapScale), - new XAttribute("specularity", SpecularityEnabled), - new XAttribute("chromaticaberration", ChromaticAberrationEnabled), - new XAttribute("losmode", LosMode), - new XAttribute("hudscale", HUDScale), - new XAttribute("inventoryscale", InventoryScale)); - - foreach (ContentPackage contentPackage in SelectedContentPackages) - { - if (contentPackage.Path.Contains(vanillaContentPackagePath)) - { - doc.Root.Add(new XElement("contentpackage", new XAttribute("path", contentPackage.Path))); - break; - } - } - - var keyMappingElement = new XElement("keymapping"); - doc.Root.Add(keyMappingElement); - for (int i = 0; i < keyMapping.Length; i++) - { - if (keyMapping[i].MouseButton == null) - { - keyMappingElement.Add(new XAttribute(((InputType)i).ToString(), keyMapping[i].Key)); - } - else - { - keyMappingElement.Add(new XAttribute(((InputType)i).ToString(), keyMapping[i].MouseButton)); - } - } - - var gameplay = new XElement("gameplay"); - var jobPreferences = new XElement("jobpreferences"); - foreach (string jobName in JobPreferences) - { - jobPreferences.Add(new XElement("job", new XAttribute("identifier", jobName))); - } - gameplay.Add(jobPreferences); - doc.Root.Add(gameplay); - - var playerElement = new XElement("player", - new XAttribute("name", defaultPlayerName ?? ""), - new XAttribute("headindex", CharacterHeadIndex), - new XAttribute("gender", CharacterGender), - new XAttribute("race", CharacterRace), - new XAttribute("hairindex", CharacterHairIndex), - new XAttribute("beardindex", CharacterBeardIndex), - new XAttribute("moustacheindex", CharacterMoustacheIndex), - new XAttribute("faceattachmentindex", CharacterFaceAttachmentIndex)); - doc.Root.Add(playerElement); - - XmlWriterSettings settings = new XmlWriterSettings - { - Indent = true, - OmitXmlDeclaration = true, - NewLineOnAttributes = true - }; - - try - { - using (var writer = XmlWriter.Create(savePath, settings)) - { - doc.WriteTo(writer); - writer.Flush(); - } - } - catch (Exception e) - { - DebugConsole.ThrowError("Saving game settings failed.", e); - GameAnalyticsManager.AddErrorEventOnce("GameSettings.Save:SaveFailed", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, - "Saving game settings failed.\n" + e.Message + "\n" + e.StackTrace); - } - } - #endregion - - #region Load PlayerConfig - // TODO: DRY - public void LoadPlayerConfig() - { - XDocument doc = XMLExtensions.LoadXml(playerSavePath); - - if (doc == null || doc.Root == null) - { - ShowUserStatisticsPrompt = true; - SaveNewPlayerConfig(); - return; - } - - Language = doc.Root.GetAttributeString("language", Language); - AutoCheckUpdates = doc.Root.GetAttributeBool("autocheckupdates", AutoCheckUpdates); - sendUserStatistics = doc.Root.GetAttributeBool("senduserstatistics", true); - - XElement graphicsMode = doc.Root.Element("graphicsmode"); - GraphicsWidth = graphicsMode.GetAttributeInt("width", GraphicsWidth); - GraphicsHeight = graphicsMode.GetAttributeInt("height", GraphicsHeight); - VSyncEnabled = graphicsMode.GetAttributeBool("vsync", VSyncEnabled); - - XElement graphicsSettings = doc.Root.Element("graphicssettings"); - ParticleLimit = graphicsSettings.GetAttributeInt("particlelimit", ParticleLimit); - LightMapScale = MathHelper.Clamp(graphicsSettings.GetAttributeFloat("lightmapscale", LightMapScale), 0.1f, 1.0f); - SpecularityEnabled = graphicsSettings.GetAttributeBool("specularity", SpecularityEnabled); - ChromaticAberrationEnabled = graphicsSettings.GetAttributeBool("chromaticaberration", ChromaticAberrationEnabled); - HUDScale = graphicsSettings.GetAttributeFloat("hudscale", HUDScale); - InventoryScale = graphicsSettings.GetAttributeFloat("inventoryscale", InventoryScale); - var losModeStr = graphicsSettings.GetAttributeString("losmode", "Transparent"); - if (!Enum.TryParse(losModeStr, out losMode)) - { - losMode = LosMode.Transparent; - } - -#if CLIENT - if (GraphicsWidth == 0 || GraphicsHeight == 0) - { - GraphicsWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width; - GraphicsHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height; - } -#endif - - var windowModeStr = graphicsMode.GetAttributeString("displaymode", "Fullscreen"); - if (!Enum.TryParse(windowModeStr, out windowMode)) - { - windowMode = WindowMode.Fullscreen; - } - - XElement audioSettings = doc.Root.Element("audio"); - if (audioSettings != null) - { - SoundVolume = audioSettings.GetAttributeFloat("soundvolume", SoundVolume); - MusicVolume = audioSettings.GetAttributeFloat("musicvolume", MusicVolume); - VoiceChatVolume = audioSettings.GetAttributeFloat("voicechatvolume", VoiceChatVolume); - string voiceSettingStr = audioSettings.GetAttributeString("voicesetting", "Disabled"); - VoiceCaptureDevice = audioSettings.GetAttributeString("voicecapturedevice", ""); - NoiseGateThreshold = audioSettings.GetAttributeFloat("noisegatethreshold", -45); - var voiceSetting = VoiceMode.Disabled; - if (Enum.TryParse(voiceSettingStr, out voiceSetting)) - { - VoiceSetting = voiceSetting; - } - } - - useSteamMatchmaking = doc.Root.GetAttributeBool("usesteammatchmaking", useSteamMatchmaking); - requireSteamAuthentication = doc.Root.GetAttributeBool("requiresteamauthentication", requireSteamAuthentication); - - EnableSplashScreen = doc.Root.GetAttributeBool("enablesplashscreen", EnableSplashScreen); - - AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", AimAssistAmount); - - foreach (XElement subElement in doc.Root.Elements()) - { - switch (subElement.Name.ToString().ToLowerInvariant()) - { - case "keymapping": - foreach (XAttribute attribute in subElement.Attributes()) - { - if (Enum.TryParse(attribute.Name.ToString(), true, out InputType inputType)) - { - if (int.TryParse(attribute.Value.ToString(), out int mouseButton)) - { - keyMapping[(int)inputType] = new KeyOrMouse(mouseButton); - } - else - { - if (Enum.TryParse(attribute.Value.ToString(), true, out Keys key)) - { - keyMapping[(int)inputType] = new KeyOrMouse(key); - } - } - } - } - break; - case "gameplay": - jobPreferences = new List(); - foreach (XElement ele in subElement.Element("jobpreferences").Elements("job")) - { - string jobIdentifier = ele.GetAttributeString("identifier", ""); - if (string.IsNullOrEmpty(jobIdentifier)) continue; - jobPreferences.Add(jobIdentifier); - } - break; - case "player": - defaultPlayerName = subElement.GetAttributeString("name", defaultPlayerName); - CharacterHeadIndex = subElement.GetAttributeInt("headindex", CharacterHeadIndex); - if (Enum.TryParse(subElement.GetAttributeString("gender", "none"), true, out Gender g)) - { - CharacterGender = g; - } - if (Enum.TryParse(subElement.GetAttributeString("race", "white"), true, out Race r)) - { - CharacterRace = r; - } - else - { - CharacterRace = Race.White; - } - CharacterHairIndex = subElement.GetAttributeInt("hairindex", CharacterHairIndex); - CharacterBeardIndex = subElement.GetAttributeInt("beardindex", CharacterBeardIndex); - CharacterMoustacheIndex = subElement.GetAttributeInt("moustacheindex", CharacterMoustacheIndex); - CharacterFaceAttachmentIndex = subElement.GetAttributeInt("faceattachmentindex", CharacterFaceAttachmentIndex); - break; - case "tutorials": - foreach (XElement tutorialElement in subElement.Elements()) - { - CompletedTutorialNames.Add(tutorialElement.GetAttributeString("name", "")); - } - break; - } - } - - foreach (InputType inputType in Enum.GetValues(typeof(InputType))) - { - if (keyMapping[(int)inputType] == null) - { - DebugConsole.ThrowError("Key binding for the input type \"" + inputType + " not set!"); - keyMapping[(int)inputType] = new KeyOrMouse(Keys.D1); - } - } - - UnsavedSettings = false; - - selectedContentPackagePaths = new HashSet(); - - foreach (XElement subElement in doc.Root.Elements()) - { - switch (subElement.Name.ToString().ToLowerInvariant()) - { - case "contentpackage": - string path = System.IO.Path.GetFullPath(subElement.GetAttributeString("path", "")); - selectedContentPackagePaths.Add(path); - break; - } - } - - LoadContentPackages(selectedContentPackagePaths); - } - - public void ReloadContentPackages() - { - LoadContentPackages(selectedContentPackagePaths); - } - - private void LoadContentPackages(IEnumerable contentPackagePaths) - { - var missingPackagePaths = new List(); - var incompatiblePackages = new List(); - SelectedContentPackages.Clear(); - foreach (string path in contentPackagePaths) - { - var matchingContentPackage = ContentPackage.List.Find(cp => System.IO.Path.GetFullPath(cp.Path) == path); - - if (matchingContentPackage == null) - { - missingPackagePaths.Add(path); - } - else if (!matchingContentPackage.IsCompatible()) - { - incompatiblePackages.Add(matchingContentPackage); - } - else - { - SelectedContentPackages.Add(matchingContentPackage); - } - } - - TextManager.LoadTextPacks(SelectedContentPackages); - - foreach (ContentPackage contentPackage in SelectedContentPackages) - { - foreach (ContentFile file in contentPackage.Files) - { - if (!System.IO.File.Exists(file.Path)) - { - DebugConsole.ThrowError("Error in content package \"" + contentPackage.Name + "\" - file \"" + file.Path + "\" not found."); - continue; - } - ToolBox.IsProperFilenameCase(file.Path); - } - } - if (!SelectedContentPackages.Any()) - { - var availablePackage = ContentPackage.List.FirstOrDefault(cp => cp.IsCompatible() && cp.CorePackage); - if (availablePackage != null) - { - SelectedContentPackages.Add(availablePackage); - } - } - - //save to get rid of the invalid selected packages in the config file - if (missingPackagePaths.Count > 0 || incompatiblePackages.Count > 0) { SaveNewPlayerConfig(); } - - //display error messages after all content packages have been loaded - //to make sure the package that contains text files has been loaded before we attempt to use TextManager - foreach (string missingPackagePath in missingPackagePaths) - { - DebugConsole.ThrowError(TextManager.Get("ContentPackageNotFound").Replace("[packagepath]", missingPackagePath)); - } - foreach (ContentPackage incompatiblePackage in incompatiblePackages) - { - DebugConsole.ThrowError(TextManager.Get(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage") - .Replace("[packagename]", incompatiblePackage.Name) - .Replace("[packageversion]", incompatiblePackage.GameVersion.ToString()) - .Replace("[gameversion]", GameMain.Version.ToString())); - } - } - #endregion - - #region Save PlayerConfig - public void SaveNewPlayerConfig() - { - XDocument doc = new XDocument(); - UnsavedSettings = false; - - if (doc.Root == null) - { - doc.Add(new XElement("config")); - } - - doc.Root.Add( - new XAttribute("language", TextManager.Language), - new XAttribute("masterserverurl", MasterServerUrl), - new XAttribute("autocheckupdates", AutoCheckUpdates), - new XAttribute("musicvolume", musicVolume), - new XAttribute("soundvolume", soundVolume), - new XAttribute("verboselogging", VerboseLogging), - new XAttribute("savedebugconsolelogs", SaveDebugConsoleLogs), - new XAttribute("enablesplashscreen", EnableSplashScreen), - new XAttribute("usesteammatchmaking", useSteamMatchmaking), - new XAttribute("quickstartsub", QuickStartSubmarineName), - new XAttribute("requiresteamauthentication", requireSteamAuthentication), - new XAttribute("autoupdateworkshopitems", AutoUpdateWorkshopItems), - new XAttribute("aimassistamount", aimAssistAmount)); - - if (!ShowUserStatisticsPrompt) - { - doc.Root.Add(new XAttribute("senduserstatistics", sendUserStatistics)); - } - - XElement gMode = doc.Root.Element("graphicsmode"); - if (gMode == null) - { - gMode = new XElement("graphicsmode"); - doc.Root.Add(gMode); - } if (GraphicsWidth == 0 || GraphicsHeight == 0) { gMode.ReplaceAttributes(new XAttribute("displaymode", windowMode)); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs index df799439a..89ee1b073 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs @@ -641,7 +641,7 @@ namespace Barotrauma.Items.Components if (!doorGap.linkedTo.Contains(hulls[1])) doorGap.linkedTo.Add(hulls[1]); } //make sure the left hull is linked to the gap first (gap logic assumes that the first hull is the one to the left) - if (doorGap.linkedTo[0].Rect.X > doorGap.linkedTo[1].Rect.X) + if (doorGap.linkedTo.Count > 1 && doorGap.linkedTo[0].Rect.X > doorGap.linkedTo[1].Rect.X) { var temp = doorGap.linkedTo[0]; doorGap.linkedTo[0] = doorGap.linkedTo[1]; @@ -659,7 +659,7 @@ namespace Barotrauma.Items.Components if (!doorGap.linkedTo.Contains(hulls[1])) doorGap.linkedTo.Add(hulls[1]); } //make sure the upper hull is linked to the gap first (gap logic assumes that the first hull is above the second one) - if (doorGap.linkedTo[0].Rect.Y < doorGap.linkedTo[1].Rect.Y) + if (doorGap.linkedTo.Count > 1 && doorGap.linkedTo[0].Rect.Y < doorGap.linkedTo[1].Rect.Y) { var temp = doorGap.linkedTo[0]; doorGap.linkedTo[0] = doorGap.linkedTo[1]; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs index 1fe61d323..91d669c94 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs @@ -51,6 +51,11 @@ namespace Barotrauma.Items.Components public PhysicsBody Body { get; private set; } + private float RepairThreshold + { + get { return item.GetComponent()?.ShowRepairUIThreshold ?? 0.0f; } + } + private float stuck; [Serialize(0.0f, false)] public float Stuck @@ -207,7 +212,7 @@ namespace Barotrauma.Items.Components public override bool HasRequiredItems(Character character, bool addMessage) { - if (item.Condition <= 0.0f) return true; //For repairing + if (item.Condition <= RepairThreshold) return true; //For repairing //this is a bit pointless atm because if canBePicked is false it won't allow you to do Pick() anyway, however it's still good for future-proofing. return requiredItems.Any() ? base.HasRequiredItems(character, addMessage) : canBePicked; @@ -215,12 +220,12 @@ namespace Barotrauma.Items.Components public override bool Pick(Character picker) { - return item.Condition <= 0.0f ? true : base.Pick(picker); + return item.Condition <= RepairThreshold ? true : base.Pick(picker); } public override bool OnPicked(Character picker) { - if (item.Condition <= 0.0f) return true; //repairs + if (item.Condition <= RepairThreshold) return true; //repairs SetState(PredictedState == null ? !isOpen : !PredictedState.Value, false, true); //crowbar function #if CLIENT @@ -232,7 +237,7 @@ namespace Barotrauma.Items.Components public override bool Select(Character character) { //can only be selected if the item is broken - return item.Condition <= 0.0f; + return item.Condition <= RepairThreshold; } public override void Update(float deltaTime, Camera cam) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs index 2885ca95f..37c046772 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs @@ -141,6 +141,7 @@ namespace Barotrauma.Items.Components partial void UseProjSpecific(float deltaTime); + private List fireSourcesInRange = new List(); private void Repair(Vector2 rayStart, Vector2 rayEnd, float deltaTime, Character user, float degreeOfSuccess, List ignoredBodies) { var collisionCategories = Physics.CollisionWall | Physics.CollisionCharacter | Physics.CollisionItem | Physics.CollisionLevel | Physics.CollisionRepair; @@ -159,7 +160,7 @@ namespace Barotrauma.Items.Components if (ExtinguishAmount > 0.0f && item.CurrentHull != null) { - List fireSourcesInRange = new List(); + fireSourcesInRange.Clear(); //step along the ray in 10% intervals, collecting all fire sources in the range for (float x = 0.0f; x <= Submarine.LastPickedFraction; x += 0.1f) { @@ -200,7 +201,7 @@ namespace Barotrauma.Items.Components FixStructureProjSpecific(user, deltaTime, targetStructure, sectionIndex); targetStructure.AddDamage(sectionIndex, -StructureFixAmount * degreeOfSuccess, user); - + //if the next section is small enough, apply the effect to it as well //(to make it easier to fix a small "left-over" section) for (int i = -1; i < 2; i += 2) @@ -252,11 +253,11 @@ namespace Barotrauma.Items.Components } } - partial void FixStructureProjSpecific(Character user, float deltaTime, Structure targetStructure, int sectionIndex); partial void FixCharacterProjSpecific(Character user, float deltaTime, Character targetCharacter); partial void FixItemProjSpecific(Character user, float deltaTime, Item targetItem, float prevCondition); + private float sinTime; public override bool AIOperate(float deltaTime, Character character, AIObjectiveOperateItem objective) { Gap leak = objective.OperateTarget as Gap; @@ -280,18 +281,26 @@ namespace Barotrauma.Items.Components { Vector2 standPos = leak.IsHorizontal ? new Vector2(Math.Sign(-fromItemToLeak.X), 0.0f) : new Vector2(0.0f, Math.Sign(-fromItemToLeak.Y) * 0.5f); standPos = leak.WorldPosition + standPos * Range; - // TODO: check if too close to the stand pos -> move away so that the tool can hit the target and not through it? Vector2 dir = Vector2.Normalize(standPos - character.WorldPosition); character.AIController.SteeringManager.SteeringManual(deltaTime, dir / 2); } else { - // TODO: sometimes stuck here, if too close to the target - //close enough -> stop moving - character.AIController.SteeringManager.Reset(); + if (dist < Range / 2) + { + // Too close -> steer away + character.AIController.SteeringManager.SteeringManual(deltaTime, Vector2.Normalize(character.SimPosition - leak.SimPosition) / 2); + } + else if (!character.IsClimbing) + { + // Close enough -> stop if not in ladders. + // In ladders, we most likely want to move back and forth, because we cannot aim -> if the leak is on the side, it should get fixed. + character.AIController.SteeringManager.Reset(); + } } - character.CursorPosition = leak.Position; + sinTime += deltaTime; + character.CursorPosition = leak.Position + VectorExtensions.Forward(Item.body.TransformedRotation + (float)Math.Sin(sinTime), dist); character.SetInput(InputType.Aim, false, true); // Press the trigger only when the tool is approximately facing the target. @@ -300,12 +309,17 @@ namespace Barotrauma.Items.Components { Use(deltaTime, character); } + else + { + sinTime -= deltaTime * 2; + } - // TODO: fix until the wall is fixed? - bool leakFixed = leak.Open <= 0.0f || leak.Removed; + bool leakFixed = (leak.Open <= 0.0f || leak.Removed) && + (leak.ConnectedWall == null || leak.ConnectedWall.Sections.Average(s => s.damage) < 1); if (leakFixed && leak.FlowTargetHull != null) { + sinTime = 0; if (!leak.FlowTargetHull.ConnectedGaps.Any(g => !g.IsRoomToRoom && g.Open > 0.0f)) { character.Speak(TextManager.Get("DialogLeaksFixed").Replace("[roomname]", leak.FlowTargetHull.RoomName), null, 0.0f, "leaksfixed", 10.0f); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs index 24018f2f9..cf13d1288 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs @@ -535,7 +535,6 @@ namespace Barotrauma.Items.Components GameAnalyticsManager.AddErrorEventOnce("ItemComponent.DegreeOfSuccess:CharacterNull", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); return 0.0f; } - float average = skillSuccessSum / requiredSkills.Count; float skillSuccessSum = 0.0f; for (int i = 0; i < requiredSkills.Count; i++) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Engine.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Engine.cs index ae727e482..010f24173 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Engine.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Engine.cs @@ -155,29 +155,5 @@ namespace Barotrauma.Items.Components } } } - - public void ServerWrite(NetBuffer msg, Client c, object[] extraData = null) - { - //force can only be adjusted at 10% intervals -> no need for more accuracy than this - msg.WriteRangedInteger(-10, 10, (int)(targetForce / 10.0f)); - } - - public void ServerRead(ClientNetObject type, NetBuffer msg, Client c) - { - float newTargetForce = msg.ReadRangedInteger(-10, 10) * 10.0f; - - if (item.CanClientAccess(c)) - { - if (Math.Abs(newTargetForce - targetForce) > 0.01f) - { - GameServer.Log(c.Character.LogName + " set the force of " + item.Name + " to " + (int)(newTargetForce) + " %", ServerLog.MessageType.ItemInteraction); - } - - targetForce = newTargetForce; - } - - //notify all clients of the changed state - item.CreateServerEvent(this); - } } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/LightComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/LightComponent.cs index 0155f497f..021ad6197 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/LightComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/LightComponent.cs @@ -160,7 +160,6 @@ namespace Barotrauma.Items.Components public override void Update(float deltaTime, Camera cam) { UpdateOnActiveEffects(deltaTime); - if (AITarget != null) AITarget.Enabled = voltage > minVoltage || powerConsumption <= 0.0f; #if CLIENT light.ParentSub = item.Submarine; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs index 29fda4341..8b89d237a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs @@ -177,12 +177,21 @@ namespace Barotrauma.Items.Components Vector2 nodePos = refSub == null ? newConnection.Item.Position : newConnection.Item.Position - refSub.HiddenSubPosition; - - + if (nodes.Count > 0 && nodes[0] == nodePos) break; if (nodes.Count > 1 && nodes[nodes.Count - 1] == nodePos) break; - if (i == 0) + //make sure we place the node at the correct end of the wire (the end that's closest to the new node pos) + int newNodeIndex = 0; + if (nodes.Count > 1) + { + if (Vector2.DistanceSquared(nodes[nodes.Count-1], nodePos) < Vector2.DistanceSquared(nodes[0], nodePos)) + { + newNodeIndex = nodes.Count; + } + } + + if (newNodeIndex == 0) { nodes.Insert(0, nodePos); } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Turret.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Turret.cs index a74c4f4e2..3dfbf16d9 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Turret.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Turret.cs @@ -433,9 +433,10 @@ namespace Barotrauma.Items.Components if (usableProjectileCount == 0 || (usableProjectileCount < maxProjectileCount && objective.Option.ToLowerInvariant() != "fireatwill")) { ItemContainer container = null; + Item containerItem = null; foreach (MapEntity e in item.linkedTo) { - var containerItem = e as Item; + containerItem = e as Item; if (containerItem == null) continue; container = containerItem.GetComponent(); @@ -453,7 +454,7 @@ namespace Barotrauma.Items.Components var containShellObjective = new AIObjectiveContainItem(character, container.ContainableItems[0].Identifiers[0], container); character?.Speak(TextManager.Get("DialogLoadTurret").Replace("[itemname]", item.Name), null, 0.0f, "loadturret", 30.0f); containShellObjective.MinContainedAmount = usableProjectileCount + 1; - containShellObjective.IgnoreAlreadyContainedItems = true; + containShellObjective.ignoredContainerIdentifiers = new string[] { containerItem.prefab.Identifier }; objective.AddSubObjective(containShellObjective); return false; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 29915b1d1..beb21b83d 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -1631,12 +1631,13 @@ namespace Barotrauma SerializableProperty property = extraData[1] as SerializableProperty; if (property != null) { + var propertyOwner = allProperties.Find(p => p.Second == property); if (allProperties.Count > 1) { msg.WriteRangedInteger(0, allProperties.Count - 1, allProperties.FindIndex(p => p.Second == property)); } - object value = property.GetValue(this); + object value = property.GetValue(propertyOwner.First); if (value is string) { msg.Write((string)value); diff --git a/Barotrauma/BarotraumaShared/Source/Map/Map/LocationType.cs b/Barotrauma/BarotraumaShared/Source/Map/Map/LocationType.cs index 9b11b8c59..42039e967 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Map/LocationType.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Map/LocationType.cs @@ -89,7 +89,9 @@ namespace Barotrauma } CommonnessPerZone[zoneIndex] = zoneCommonness; } - catch (Exception e) + + hireableJobs = new List>(); + foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { diff --git a/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs b/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs index c3d5d2926..ba0ba04d5 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Map/Map.cs @@ -269,9 +269,6 @@ namespace Barotrauma } } - //remove orphans - Locations.RemoveAll(c => !connectedLocations.Contains(c)); - for (int i = connections.Count - 1; i >= 0; i--) { i = Math.Min(i, connections.Count - 1); @@ -428,7 +425,6 @@ namespace Barotrauma GameAnalyticsManager.AddErrorEventOnce("Map.SelectLocation:LocationNotFound", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); return; } - CurrentLocation.SelectedMissionIndex = missionIndex; SelectedLocation = location; SelectedConnection = connections.Find(c => c.Locations.Contains(CurrentLocation) && c.Locations.Contains(SelectedLocation)); diff --git a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs index 763b0b250..53466bc5a 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs @@ -134,7 +134,7 @@ namespace Barotrauma public HashSet Tags { - get { return prefab; } + get { return prefab.Tags; } } protected Color spriteColor; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs index 44fbb7299..1e7294d22 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs @@ -523,30 +523,6 @@ namespace Barotrauma { maxX = Math.Min(maxX, ruin.Area.X - 100.0f); } - else - { - maxX = Math.Min(maxX, ruin.Area.X - 100.0f); - } - } - - if (minX < 0.0f && maxX > Level.Loaded.Size.X) - { - //no walls found at either side, just use the initial spawnpos and hope for the best - } - else if (minX < 0) - { - //no wall found at the left side, spawn to the left from the right-side wall - spawnPos.X = maxX - minWidth - 100.0f; - } - else if (maxX > Level.Loaded.Size.X) - { - //no wall found at right side, spawn to the right from the left-side wall - spawnPos.X = minX + minWidth + 100.0f; - } - else - { - //walls found at both sides, use their midpoint - spawnPos.X = (minX + maxX) / 2; } if (minX < 0.0f && maxX > Level.Loaded.Size.X) @@ -1016,26 +992,6 @@ namespace Barotrauma return closest; } - public List GetHulls(bool alsoFromConnectedSubs) => GetEntities(alsoFromConnectedSubs, Hull.hullList); - public List GetGaps(bool alsoFromConnectedSubs) => GetEntities(alsoFromConnectedSubs, Gap.GapList); - public List GetItems(bool alsoFromConnectedSubs) => GetEntities(alsoFromConnectedSubs, Item.ItemList); - - public List GetEntities(bool includingConnectedSubs, List list) where T : MapEntity - { - return list.FindAll(e => IsEntityFoundOnThisSub(e, includingConnectedSubs)); - } - - public bool IsEntityFoundOnThisSub(MapEntity entity, bool includingConnectedSubs) - { - if (entity.Submarine == this) { return true; } - if (entity.Submarine == null) { return false; } - if (includingConnectedSubs) - { - return GetConnectedSubs().Any(s => s == entity.Submarine && entity.Submarine.TeamID == TeamID); - } - return false; - } - /// /// Returns true if the sub is same as the other. /// diff --git a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs index 0a1b5fa21..a0d500ade 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs @@ -700,6 +700,23 @@ namespace Barotrauma Vector2 impulse = direction * impact * 0.5f; impulse = impulse.ClampLength(5.0f); + if (!MathUtils.IsValid(impulse)) + { + string errorMsg = + "Invalid impulse in SubmarineBody.ApplyImpact: " + impulse + + ". Direction: " + direction + ", body position: " + Body.SimPosition + ", impact: " + impact + "."; + if (GameMain.NetworkMember != null) + { + errorMsg += GameMain.NetworkMember.IsClient ? " Playing as a client." : " Hosting a server."; + } + if (GameSettings.VerboseLogging) DebugConsole.ThrowError(errorMsg); + GameAnalyticsManager.AddErrorEventOnce( + "SubmarineBody.ApplyImpact:InvalidImpulse", + GameAnalyticsSDK.Net.EGAErrorSeverity.Error, + errorMsg); + return; + } + #if CLIENT if (Character.Controlled != null && Character.Controlled.Submarine == submarine) { diff --git a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs index 2c9f0ed38..9e7228401 100644 --- a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs @@ -522,7 +522,12 @@ namespace Barotrauma string errorMsg = "Attempted to apply invalid " + valueName + " to a physics body (userdata: " + userData + - "), value: " + value + "\n" + Environment.StackTrace; + "), value: " + value; + if (GameMain.NetworkMember != null) + { + errorMsg += GameMain.NetworkMember.IsClient ? " Playing as a client." : " Hosting a server."; + } + errorMsg += "\n" + Environment.StackTrace; if (GameSettings.VerboseLogging) DebugConsole.ThrowError(errorMsg); GameAnalyticsManager.AddErrorEventOnce( @@ -544,7 +549,12 @@ namespace Barotrauma string errorMsg = "Attempted to apply invalid " + valueName + " to a physics body (userdata: " + userData + - "), value: " + value + "\n" + Environment.StackTrace; + "), value: " + value; + if (GameMain.NetworkMember != null) + { + errorMsg += GameMain.NetworkMember.IsClient ? " Playing as a client." : " Hosting a server."; + } + errorMsg += "\n" + Environment.StackTrace; if (GameSettings.VerboseLogging) DebugConsole.ThrowError(errorMsg); GameAnalyticsManager.AddErrorEventOnce( diff --git a/Barotrauma/BarotraumaShared/Source/PlayerInput.cs b/Barotrauma/BarotraumaShared/Source/PlayerInput.cs index dac0e7d44..6de3c7927 100644 --- a/Barotrauma/BarotraumaShared/Source/PlayerInput.cs +++ b/Barotrauma/BarotraumaShared/Source/PlayerInput.cs @@ -54,7 +54,7 @@ namespace Barotrauma case 6: return PlayerInput.MouseWheelDownClicked(); } - + return false; } @@ -113,14 +113,7 @@ namespace Barotrauma { private bool hit, hitQueue; private bool held, heldQueue; - -#if CLIENT - private InputType inputType; - public Key(InputType inputType) - { - this.inputType = inputType; - } private InputType inputType; @@ -138,17 +131,6 @@ namespace Barotrauma { get { return binding; } } -#endif - - public void SetState() - { - hit = binding.IsHit(); - if (hit) hitQueue = true; - - held = binding.IsDown(); - if (held) heldQueue = true; - } -#endif public void SetState() { diff --git a/Barotrauma/BarotraumaShared/Source/StatusEffects/StatusEffect.cs b/Barotrauma/BarotraumaShared/Source/StatusEffects/StatusEffect.cs index dd1fbb2e8..55d8c62fe 100644 --- a/Barotrauma/BarotraumaShared/Source/StatusEffects/StatusEffect.cs +++ b/Barotrauma/BarotraumaShared/Source/StatusEffects/StatusEffect.cs @@ -717,11 +717,6 @@ namespace Barotrauma } } } - - bool isNotClient = true; -#if CLIENT - isNotClient = GameMain.Client == null; -#endif if (FireSize > 0.0f && entity != null) { diff --git a/Barotrauma/BarotraumaShared/Source/TextManager.cs b/Barotrauma/BarotraumaShared/Source/TextManager.cs index a4b006c84..1d5d074c8 100644 --- a/Barotrauma/BarotraumaShared/Source/TextManager.cs +++ b/Barotrauma/BarotraumaShared/Source/TextManager.cs @@ -153,49 +153,59 @@ namespace Barotrauma string[] messages = serverMessage.Split('/'); - for (int i = 0; i < messages.Length; i++) + try { - if (!IsServerMessageWithVariables(messages[i])) // No variables, try to translate + for (int i = 0; i < messages.Length; i++) { - if (messages[i].Contains(" ")) continue; // Spaces found, do not translate - - string msg = Get(messages[i], true); - - if (msg != null) // If a translation was found, otherwise use the original + if (!IsServerMessageWithVariables(messages[i])) // No variables, try to translate { - messages[i] = msg; - } - } - else - { - string[] messageWithVariables = messages[i].Split('~'); - string msg = Get(messageWithVariables[0], true); - - if (msg != null) // If a translation was found, otherwise use the original - { - messages[i] = msg; + if (messages[i].Contains(" ")) continue; // Spaces found, do not translate + string msg = Get(messages[i], true); + if (msg != null) // If a translation was found, otherwise use the original + { + messages[i] = msg; + } } else { - continue; // No translation found, probably caused by player input -> skip variable handling - } + string[] messageWithVariables = messages[i].Split('~'); + string msg = Get(messageWithVariables[0], true); - // First index is always the message identifier -> start at 1 - for (int j = 1; j < messageWithVariables.Length; j++) - { - string[] variableAndValue = messageWithVariables[j].Split('='); - messages[i] = messages[i].Replace(variableAndValue[0], variableAndValue[1]); + if (msg != null) // If a translation was found, otherwise use the original + { + messages[i] = msg; + } + else + { + continue; // No translation found, probably caused by player input -> skip variable handling + } + + // First index is always the message identifier -> start at 1 + for (int j = 1; j < messageWithVariables.Length; j++) + { + string[] variableAndValue = messageWithVariables[j].Split('='); + messages[i] = messages[i].Replace(variableAndValue[0], variableAndValue[1]); + } } } + + string translatedServerMessage = string.Empty; + for (int i = 0; i < messages.Length; i++) + { + translatedServerMessage += messages[i]; + } + return translatedServerMessage; } - string translatedServerMessage = string.Empty; - for (int i = 0; i < messages.Length; i++) + catch (IndexOutOfRangeException exception) { - translatedServerMessage += messages[i]; + string errorMsg = "Failed to translate server message \"" + serverMessage + "\"."; +#if DEBUG + DebugConsole.ThrowError(errorMsg, exception); +#endif + GameAnalyticsManager.AddErrorEventOnce("TextManager.GetServerMessage:" + serverMessage, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); + return errorMsg; } - - return translatedServerMessage; } public static bool IsServerMessageWithVariables(string message) diff --git a/Barotrauma/BarotraumaShared/Source/TextPack.cs b/Barotrauma/BarotraumaShared/Source/TextPack.cs index a9cf50356..91366d043 100644 --- a/Barotrauma/BarotraumaShared/Source/TextPack.cs +++ b/Barotrauma/BarotraumaShared/Source/TextPack.cs @@ -33,7 +33,11 @@ namespace Barotrauma texts.Add(infoName, infoList); } - infoList.Add(subElement.ElementInnerText()); + string text = subElement.ElementInnerText(); + text = text.Replace("&", "&"); + text = text.Replace("<", "<"); + text = text.Replace(">", ">"); + infoList.Add(text); } } diff --git a/Barotrauma/BarotraumaShared/Submarines/Dugong.sub b/Barotrauma/BarotraumaShared/Submarines/Dugong.sub index 97196e8ece1593cbec71e27d30674de1ebf3b5af..d2cd1ff1950d20f582cab440abb7bed57b4d63a6 100644 GIT binary patch literal 71982 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

xf)VEfKC^Oo9Nvp|Ko8A*#e3jq`_y7p4K9 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 literal 69867 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

UZ=VQNZ29NZcIqiL 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 z

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%0A&2t08X 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 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not see +# +# Answer for "How to setup a git driver to ignore a folder on merge?" +# See http://stackoverflow.com/questions/3111515 + +#Defaults: +msgcommit="remove files from '' before merge" +msgmerge="Merge stripped branch ''" +verbose=0 +quiet=(--quiet) + +usage() { + cat <<- USAGE + Usage: $myname [git-merge options] [-M ] FILE... + USAGE + if [[ "$1" ]] ; then + cat >&2 <<- USAGE + Try '$myname --help' for more information. + USAGE + exit 1 + fi + cat <<-USAGE + git-merge that delete files on "foreign" before merging + Useful for ignoring a folder in before merging it with + current branch. Works by deleting FILE(S) in a detached commit based + on , and then performing the merge of this new commit in the + current branch. Note that is not changed by this procedure. + Also note that may actually be any reference, like a tag, + or a remote branch, or even a commit SHA. + For more information, see + Options: + -h, --help + show this page. + -v, --verbose + do not use -q to suppress normal output of internal steps from git + checkout, rm, commit. By default, only git merge output is shown. + Errors, however, are never suppressed + -M , --msgcommit= + message for the removal commit in . Not to be confused + with the message of the merge commit, which is set by -m. Default + message is: "$msgcommit" + -m , --message= + message for the merge commit. Since we are not merging + directly, but rather a detached commit based on it, we forge a + message similar to git's default for a branch merge. Otherwise + git would use in message the full and ugly SHA1 of our commit. + Default message is: "$msgmerge" + For both commit messages, the token "" is replaced for the + actual name. + Additional options are passed unchecked to git merge. + All options must precede and FILE(s), except -h and --help + that may appear anywhere on the command line. + Example: + $myname design "photoshop/*" + Copyright (C) 2012 Rodrigo Silva (MestreLion) + License: GPLv3 or later. See + USAGE + exit 0 +} + +# Helper functions +myname="${0##*/}" +argerr() { printf "%s: %s\n" "${0##*/}" "${1:-error}" >&2 ; usage 1 ; } +invalid() { argerr "invalid option: $1" ; } +missing() { argerr "missing ${2:+$2 }operand${1:+ from $1}." ; } + +# Option handling +files=() +mergeopts=() +for arg in "$@"; do case "$arg" in -h|--help) usage ;; esac; done +while (( $# )); do + case "$1" in + -v|--verbose ) verbose=1 ;; + -M ) shift ; msgcommit=$1 ;; + -m ) shift ; msgmerge=$1 ;; + --msgcommit=* ) msgcommit=${1#*=} ;; + --message=* ) msgmerge=${1#*=} ;; + -* ) mergeopts+=( "$1" ) ;; + * ) branch="$1" + shift ; break ;; + esac + shift +done +files+=( "$@" ) + +# Argument handling + +msgcommit=${msgcommit///$branch} +msgmerge=${msgmerge///$branch} + +[[ "$msgcommit" ]] || missing "msgcommit" "MSG" +[[ "$branch" ]] || missing "" "" +(( ${#files[@]} )) || missing "" "FILE" + +((verbose)) && quiet=() + +# Here the fun begins... +gitsha() { git rev-parse "$1" ; } +gitbranch() { + git symbolic-ref "$1" 2> /dev/null | sed 's/refs\/heads\///' || + gitsha "$1" +} + +original=$(gitbranch HEAD) +branchsha=$(gitsha "$branch") + +logmsg="$(git log .."$branchsha")" + +trap 'git checkout --quiet "$original"' EXIT + +git checkout "$branchsha" "${quiet[@]}" && +git rm -rf -r "${files[@]}" "${quiet[@]}" && +git commit -m "$msgcommit" "${quiet[@]}" && +newsha=$(gitsha HEAD) && +git checkout "$original" "${quiet[@]}" && +#original +#git merge -m "$msgmerge" "${mergeopts[@]}" "$newsha" + +#baro additions +git merge -m "$msgmerge" "--squash" "$newsha" +git commit -m "$logmsg" + +#./git-strip-merge --no-commit --no-ff barotrauma-development/dev -f Barotrauma/BarotraumaShared/Content/*