From 22227f13e5cd0c704ebb0f362752d4200f4b5c0f Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 13 May 2025 14:52:23 +0300 Subject: [PATCH 1/3] Update bug-reports.yml --- .github/DISCUSSION_TEMPLATE/bug-reports.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/bug-reports.yml b/.github/DISCUSSION_TEMPLATE/bug-reports.yml index 1ac7cf06e..387e3dc2e 100644 --- a/.github/DISCUSSION_TEMPLATE/bug-reports.yml +++ b/.github/DISCUSSION_TEMPLATE/bug-reports.yml @@ -74,6 +74,8 @@ body: description: Which version of the game did the bug happen in? You can see the current version number in the bottom left corner of your screen in the main menu. options: - v1.8.8.1 (Calm Before the Storm Hotfix 2) + - v1.9.0.0 (Unstable) + - Other validations: required: true From ea5a2bc693dda85a22649439ea5f562f12dff398 Mon Sep 17 00:00:00 2001 From: Regalis11 Date: Tue, 17 Jun 2025 16:38:11 +0300 Subject: [PATCH 2/3] Release 1.9.7.0 - Summer Update 2025 --- .../ClientSource/Characters/Character.cs | 7 + .../ClientSource/Characters/CharacterHUD.cs | 10 +- .../ClientSource/Characters/CharacterInfo.cs | 72 +--- .../Characters/CharacterNetworking.cs | 5 +- .../Characters/Health/CharacterHealth.cs | 31 +- .../ClientSource/DebugConsole.cs | 186 +++++++- .../Events/Missions/SalvageMission.cs | 2 +- .../BarotraumaClient/ClientSource/GUI/GUI.cs | 79 +++- .../ClientSource/GUI/GUIButton.cs | 2 +- .../ClientSource/GUI/GUIListBox.cs | 7 +- .../ClientSource/GUI/HRManagerUI.cs | 8 + .../ClientSource/GUI/MedicalClinicUI.cs | 4 +- .../ClientSource/GUI/TalentMenu.cs | 42 +- .../ClientSource/GUI/UpgradeStore.cs | 24 +- .../BarotraumaClient/ClientSource/GameMain.cs | 11 +- .../ClientSource/GameSession/CrewManager.cs | 8 +- .../GameModes/SinglePlayerCampaign.cs | 50 +-- .../ClientSource/GameSession/GameSession.cs | 1 - .../ClientSource/GameSession/RoundSummary.cs | 2 +- .../ClientSource/Items/CharacterInventory.cs | 2 + .../ClientSource/Items/Components/Growable.cs | 2 +- .../Items/Components/Holdable/Holdable.cs | 52 ++- .../Items/Components/Holdable/RangedWeapon.cs | 2 +- .../Items/Components/ItemComponent.cs | 8 +- .../Items/Components/ItemContainer.cs | 4 +- .../Items/Components/Machines/Fabricator.cs | 26 +- .../Items/Components/Machines/Reactor.cs | 4 +- .../Items/Components/Machines/Sonar.cs | 15 +- .../Items/Components/Machines/Steering.cs | 1 + .../Components/Power/PowerDistributor.cs | 180 ++++++++ .../Items/Components/Power/PowerTransfer.cs | 137 +++--- .../Items/Components/Power/Powered.cs | 2 +- .../Items/Components/RepairTool.cs | 6 +- .../Items/Components/Signal/ButtonTerminal.cs | 2 +- .../ClientSource/Items/Components/Turret.cs | 8 +- .../ClientSource/Items/Inventory.cs | 31 +- .../ClientSource/Items/Item.cs | 26 +- .../Map/Levels/LevelObjects/LevelObject.cs | 2 +- .../ClientSource/Map/Lights/LightManager.cs | 20 +- .../ClientSource/Map/Map/Map.cs | 32 +- .../ClientSource/Map/MapEntity.cs | 9 - .../ClientSource/Map/RoundSound.cs | 12 +- .../ClientSource/Map/Structure.cs | 16 +- .../ClientSource/Map/Submarine.cs | 18 +- .../ClientSource/Networking/ChatMessage.cs | 3 + .../ClientSource/Networking/GameClient.cs | 40 +- .../ClientSource/Networking/ServerSettings.cs | 11 + .../CampaignSetupUI/CampaignSetupUI.cs | 64 ++- .../MultiPlayerCampaignSetupUI.cs | 2 + .../SinglePlayerCampaignSetupUI.cs | 6 +- .../ClientSource/Screens/CampaignUI.cs | 33 +- .../ClientSource/Screens/LevelEditorScreen.cs | 7 +- .../ClientSource/Screens/NetLobbyScreen.cs | 85 +++- .../Screens/SpriteEditorScreen.cs | 1 + .../ClientSource/Screens/SubEditorScreen.cs | 175 +++++++- .../FriendProviders/SteamFriendProvider.cs | 2 +- .../ClientSource/Sounds/OggSound.cs | 6 +- .../ClientSource/Sounds/Sound.cs | 11 +- .../ClientSource/Sounds/SoundManager.cs | 40 +- .../ClientSource/Sounds/SoundPlayer.cs | 24 +- .../ClientSource/Sounds/VideoSound.cs | 19 +- .../ClientSource/Sounds/VoipSound.cs | 2 + .../ClientSource/Sprite/SpriteSheet.cs | 13 +- .../StatusEffects/StatusEffect.cs | 14 +- .../ClientSource/Steam/SteamIcons.cs | 87 ++++ .../ClientSource/Steam/SteamManager.cs | 2 + .../Steam/SteamTimelineManager.cs | 345 +++++++++++++++ .../WorkshopMenu/Mutable/InstalledTab.cs | 8 +- .../Steam/WorkshopMenu/Mutable/PublishTab.cs | 4 +- .../ClientSource/SubEditorCommands.cs | 93 +++- .../BarotraumaClient/LinuxClient.csproj | 4 +- Barotrauma/BarotraumaClient/MacClient.csproj | 4 +- .../BarotraumaClient/WindowsClient.csproj | 4 +- .../BarotraumaServer/LinuxServer.csproj | 4 +- Barotrauma/BarotraumaServer/MacServer.csproj | 4 +- .../Characters/CharacterNetworking.cs | 1 + .../ServerSource/DebugConsole.cs | 30 +- .../GameModes/MultiPlayerCampaign.cs | 25 +- .../ServerSource/Items/Components/Growable.cs | 2 +- .../Items/Components/Holdable/Holdable.cs | 9 +- .../Components/Power/PowerDistributor.cs | 33 ++ .../ServerSource/Items/Item.cs | 1 + .../BarotraumaServer/ServerSource/Map/Hull.cs | 15 +- .../ServerSource/Networking/ChatMessage.cs | 16 +- .../ServerSource/Networking/Client.cs | 2 + .../ServerSource/Networking/GameServer.cs | 14 + .../BarotraumaServer/WindowsServer.csproj | 4 +- .../PowerTestSub.sub | Bin 0 -> 161576 bytes .../[DebugOnlyTest]PowerTestSub/filelist.xml | 4 + .../RotationAndFlippingTests.sub | Bin 9607 -> 10094 bytes .../SharedSource/AchievementManager.cs | 87 +++- .../Characters/AI/EnemyAIController.cs | 6 +- .../Characters/AI/HumanAIController.cs | 7 + .../Objectives/AIObjectiveFindDivingGear.cs | 1 + .../AI/Objectives/AIObjectiveGetItem.cs | 8 + .../AI/Objectives/AIObjectiveGoTo.cs | 145 ++++--- .../Characters/Animation/AnimController.cs | 5 +- .../SharedSource/Characters/CauseOfDeath.cs | 6 +- .../SharedSource/Characters/Character.cs | 14 +- .../SharedSource/Characters/CharacterInfo.cs | 39 +- .../Health/Afflictions/AfflictionPrefab.cs | 14 + .../SharedSource/Characters/HumanPrefab.cs | 2 +- .../SharedSource/Characters/Jobs/Job.cs | 1 + .../SharedSource/Characters/Limb.cs | 36 +- .../Characters/Params/CharacterParams.cs | 3 + .../AbilityConditionals/AbilityCondition.cs | 5 +- .../CharacterAbilityApplyStatusEffects.cs | 2 +- .../CharacterAbilityPsychoClown.cs | 9 +- ...erAbilityUnlockApprenticeshipTalentTree.cs | 1 + .../CircuitBox/CircuitBoxInputOutputNode.cs | 2 + .../ContentManagement/ContentFile/TextFile.cs | 2 +- .../ContentManagement/ContentXElement.cs | 2 + .../SharedSource/DebugConsole.cs | 83 +++- .../BarotraumaShared/SharedSource/Enums.cs | 2 +- .../SharedSource/Eos/Session.cs | 4 +- .../Events/EventActions/CombatAction.cs | 7 +- .../Events/EventActions/GodModeAction.cs | 16 +- .../Events/EventActions/NPCWaitAction.cs | 9 +- .../Events/EventActions/SpawnAction.cs | 28 +- .../SharedSource/Events/EventManager.cs | 10 +- .../Missions/AbandonedOutpostMission.cs | 25 ++ .../Events/Missions/EscortMission.cs | 79 ++-- .../SharedSource/Events/Missions/Mission.cs | 9 + .../Events/Missions/MissionPrefab.cs | 20 +- .../Events/Missions/MonsterMission.cs | 11 + .../Events/Missions/SalvageMission.cs | 29 +- .../Events/Missions/ScanMission.cs | 11 + .../GameSession/Data/Reputation.cs | 4 +- .../GameSession/GameModes/CampaignMode.cs | 100 ++++- .../GameModes/MultiPlayerCampaign.cs | 46 +- .../SharedSource/GameSession/GameSession.cs | 31 +- .../GameSession/UpgradeManager.cs | 38 +- .../SharedSource/Items/CharacterInventory.cs | 16 + .../Items/Components/DockingPort.cs | 26 +- .../SharedSource/Items/Components/Growable.cs | 74 ++-- .../Items/Components/Holdable/Holdable.cs | 184 ++++++-- .../Items/Components/Holdable/MeleeWeapon.cs | 90 ++-- .../Items/Components/Holdable/RepairTool.cs | 2 +- .../Items/Components/Holdable/Throwable.cs | 26 +- .../Items/Components/ItemComponent.cs | 8 +- .../Items/Components/ItemContainer.cs | 32 +- .../Items/Components/Machines/Controller.cs | 2 +- .../Items/Components/Machines/Reactor.cs | 2 +- .../Items/Components/Machines/Steering.cs | 2 +- .../SharedSource/Items/Components/Planter.cs | 10 +- .../Components/Power/PowerDistributor.cs | 230 ++++++++++ .../Items/Components/Power/PowerTransfer.cs | 111 ++--- .../Items/Components/Power/Powered.cs | 93 ++-- .../Items/Components/Signal/CircuitBox.cs | 1 + .../Items/Components/Signal/Connection.cs | 12 +- .../Items/Components/Signal/MotionSensor.cs | 15 +- .../Items/Components/Signal/Wire.cs | 4 +- .../Items/Components/TriggerComponent.cs | 6 +- .../SharedSource/Items/Components/Wearable.cs | 4 + .../SharedSource/Items/Item.cs | 105 +++-- .../SharedSource/Items/ItemPrefab.cs | 41 +- .../SharedSource/Map/CoreEntityPrefab.cs | 1 + .../Map/Creatures/BallastFloraBehavior.cs | 4 +- .../SharedSource/Map/DummyFireSource.cs | 2 + .../SharedSource/Map/FireSource.cs | 14 +- .../BarotraumaShared/SharedSource/Map/Gap.cs | 7 +- .../BarotraumaShared/SharedSource/Map/Hull.cs | 13 +- .../SharedSource/Map/Levels/Biome.cs | 1 + .../SharedSource/Map/Levels/Level.cs | 14 +- .../SharedSource/Map/Levels/LevelData.cs | 31 +- .../Map/Levels/Ruins/RuinGenerator.cs | 2 +- .../SharedSource/Map/Map/Location.cs | 23 +- .../SharedSource/Map/Map/LocationType.cs | 373 ++++++++++++++-- .../SharedSource/Map/Map/Map.cs | 149 ++++--- .../Map/Map/MapLocationTypeGenerator.cs | 397 ++++++++++++++++++ .../SharedSource/Map/MapEntity.cs | 25 +- .../Map/Outposts/OutpostGenerationParams.cs | 7 + .../Map/Outposts/OutpostGenerator.cs | 159 +++++-- .../Map/Outposts/OutpostModuleInfo.cs | 11 +- .../SharedSource/Map/Structure.cs | 28 +- .../SharedSource/Map/Submarine.cs | 15 + .../SharedSource/Map/SubmarineInfo.cs | 44 +- .../SharedSource/Networking/ChatMessage.cs | 17 +- .../SharedSource/Networking/Client.cs | 18 +- .../SharedSource/Networking/EntitySpawner.cs | 1 + .../SharedSource/Networking/NetworkMember.cs | 5 +- .../SteamAuthTicketForEosHostAuthenticator.cs | 14 +- .../Prefabs/IImplementsVariants.cs | 24 +- .../SharedSource/Prefabs/PrefabCollection.cs | 14 + .../SharedSource/Screens/GameScreen.cs | 5 +- .../SerializableProperty.cs | 16 +- .../Serialization/XMLExtensions.cs | 22 +- .../SharedSource/Settings/GameSettings.cs | 2 +- .../SharedSource/Sprite/SpriteSheet.cs | 1 - .../StatusEffects/DelayedEffect.cs | 36 +- .../StatusEffects/StatusEffect.cs | 57 ++- .../SharedSource/Steam/AuthTicket.cs | 12 +- .../SharedSource/Steam/SteamManager.cs | 3 + .../BarotraumaShared/SharedSource/Tags.cs | 4 + .../SharedSource/Text/TextManager.cs | 19 + .../SharedSource/Text/TextPack.cs | 42 +- .../SharedSource/Utils/Rand.cs | 17 +- Barotrauma/BarotraumaShared/changelog.txt | 123 ++++++ Barotrauma/BarotraumaTest/LinuxTest.csproj | 2 +- Barotrauma/BarotraumaTest/MacTest.csproj | 2 +- Barotrauma/BarotraumaTest/WindowsTest.csproj | 2 +- Deploy/DeployAll/DeployAll.csproj | 2 +- Deploy/DeployAll/DotnetCmd.cs | 4 +- .../BarotraumaCore/BarotraumaCore.csproj | 2 +- .../Extensions/EnumerableExtensionsCore.cs | 16 +- .../Extensions/RectangleExtensions.cs | 9 + .../Utils/IEnumerableExtensionsCore.cs | 7 + .../EosInterface/EosInterface.csproj | 2 +- .../EosInterface.Implementation.Linux.csproj | 2 +- .../EosInterface.Implementation.MacOS.csproj | 2 +- .../EosInterface.Implementation.Win64.csproj | 2 +- .../InterfaceImpl/IdAndAuth/LoginPrivate.cs | 6 +- .../InterfaceImpl/Util/ResultExtension.cs | 2 +- .../Classes/AuthTicketForWebApi.cs | 38 -- .../Facepunch.Steamworks/Classes/SteamApi.cs | 14 +- .../Classes/SteamInternal.cs | 14 +- .../Facepunch.Steamworks.targets | 4 +- .../Generated/CustomEnums.cs | 12 +- .../Generated/Interfaces/ISteamAppList.cs | 2 +- .../Generated/Interfaces/ISteamApps.cs | 81 +++- .../Generated/Interfaces/ISteamClient.cs | 196 +++++---- .../Generated/Interfaces/ISteamController.cs | 24 +- .../Generated/Interfaces/ISteamFriends.cs | 81 ++-- .../Generated/Interfaces/ISteamGameSearch.cs | 32 +- .../Generated/Interfaces/ISteamGameServer.cs | 88 ++-- .../Interfaces/ISteamGameServerStats.cs | 59 +-- .../Generated/Interfaces/ISteamHTMLSurface.cs | 58 ++- .../Generated/Interfaces/ISteamHTTP.cs | 63 +-- .../Generated/Interfaces/ISteamInput.cs | 31 +- .../Generated/Interfaces/ISteamInventory.cs | 70 +-- .../Generated/Interfaces/ISteamMatchmaking.cs | 72 ++-- .../ISteamMatchmakingPingResponse.cs | 3 +- .../ISteamMatchmakingPlayersResponse.cs | 10 +- .../ISteamMatchmakingRulesResponse.cs | 11 +- .../ISteamMatchmakingServerListResponse.cs | 3 +- .../Interfaces/ISteamMatchmakingServers.cs | 59 +-- .../Generated/Interfaces/ISteamMusic.cs | 3 +- .../Generated/Interfaces/ISteamMusicRemote.cs | 38 +- .../Generated/Interfaces/ISteamNetworking.cs | 3 +- .../Interfaces/ISteamNetworkingFakeUDPPort.cs | 3 +- .../Interfaces/ISteamNetworkingMessages.cs | 3 +- .../Interfaces/ISteamNetworkingSockets.cs | 29 +- .../Interfaces/ISteamNetworkingUtils.cs | 56 +-- .../Interfaces/ISteamParentalSettings.cs | 3 +- .../Generated/Interfaces/ISteamParties.cs | 23 +- .../Generated/Interfaces/ISteamRemotePlay.cs | 21 +- .../Interfaces/ISteamRemoteStorage.cs | 108 +++-- .../Generated/Interfaces/ISteamScreenshots.cs | 26 +- .../Generated/Interfaces/ISteamTimeline.cs | 231 ++++++++++ .../Generated/Interfaces/ISteamUGC.cs | 299 ++++++++----- .../Generated/Interfaces/ISteamUser.cs | 30 +- .../Generated/Interfaces/ISteamUserStats.cs | 209 ++++----- .../Generated/Interfaces/ISteamUtils.cs | 47 ++- .../Generated/Interfaces/ISteamVideo.cs | 18 +- .../Generated/SteamCallbacks.cs | 138 +++--- .../Generated/SteamConstants.cs | 8 + .../Generated/SteamEnums.cs | 92 +++- .../Generated/SteamStructFunctions.cs | 18 +- .../Generated/SteamStructs.cs | 49 +-- .../Generated/SteamTypes.cs | 16 + .../Interfaces/ISteamMatchmakingServers.cs | 42 ++ .../Networking/Connection.cs | 2 +- .../Networking/ConnectionManager.cs | 2 +- .../Facepunch.Steamworks/ServerList/Base.cs | 27 +- .../ServerList/Favourites.cs | 10 +- .../ServerList/Friends.cs | 10 +- .../ServerList/History.cs | 10 +- .../ServerList/Internet.cs | 12 +- .../Facepunch.Steamworks/ServerList/IpList.cs | 29 +- .../ServerList/LocalNetwork.cs | 6 +- .../ServerList/ServerFilterMarshaler.cs | 58 +++ Libraries/Facepunch.Steamworks/SteamApps.cs | 2 + Libraries/Facepunch.Steamworks/SteamClient.cs | 33 +- .../SteamNetworkingUtils.cs | 4 +- Libraries/Facepunch.Steamworks/SteamServer.cs | 18 +- .../Facepunch.Steamworks/SteamTimeline.cs | 221 ++++++++++ Libraries/Facepunch.Steamworks/SteamUser.cs | 120 ++++-- .../Facepunch.Steamworks/SteamUserStats.cs | 9 +- .../Facepunch.Steamworks/Structs/Friend.cs | 27 +- .../Facepunch.Steamworks/Structs/GameId.cs | 75 +++- .../Structs/GamePhaseRecordingInfo.cs | 10 + .../Structs/InventoryDef.cs | 2 +- .../Structs/InventoryItem.cs | 10 +- .../Facepunch.Steamworks/Structs/Lobby.cs | 2 +- .../Structs/MatchMakingKeyValuePair.cs | 2 +- .../Facepunch.Steamworks/Structs/UgcEditor.cs | 2 +- .../Facepunch.Steamworks/Structs/UgcItem.cs | 8 +- .../Facepunch.Steamworks/Utility/Helpers.cs | 14 +- .../Utility/SteamInterface.cs | 2 +- .../Utility/Utf8String.cs | 53 +-- .../Facepunch.Steamworks/Utility/Utility.cs | 4 +- .../Facepunch.Steamworks/libsteam_api64.dylib | Bin 610496 -> 414656 bytes .../Facepunch.Steamworks/libsteam_api64.so | Bin 391056 -> 386864 bytes Libraries/Facepunch.Steamworks/steam_api.dll | Bin 0 -> 266336 bytes .../Facepunch.Steamworks/steam_api64.dll | Bin 298856 -> 319584 bytes changelogs/combine_changelogs.bat | 56 +++ changelogs/combine_changelogs.sh | 57 +++ 297 files changed, 7344 insertions(+), 2421 deletions(-) create mode 100644 Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/PowerDistributor.cs create mode 100644 Barotrauma/BarotraumaClient/ClientSource/Steam/SteamIcons.cs create mode 100644 Barotrauma/BarotraumaClient/ClientSource/Steam/SteamTimelineManager.cs create mode 100644 Barotrauma/BarotraumaServer/ServerSource/Items/Components/Power/PowerDistributor.cs create mode 100644 Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]PowerTestSub/PowerTestSub.sub create mode 100644 Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]PowerTestSub/filelist.xml create mode 100644 Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/PowerDistributor.cs create mode 100644 Barotrauma/BarotraumaShared/SharedSource/Map/Map/MapLocationTypeGenerator.cs delete mode 100644 Libraries/Facepunch.Steamworks/Classes/AuthTicketForWebApi.cs create mode 100644 Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamTimeline.cs create mode 100644 Libraries/Facepunch.Steamworks/Interfaces/ISteamMatchmakingServers.cs create mode 100644 Libraries/Facepunch.Steamworks/ServerList/ServerFilterMarshaler.cs create mode 100644 Libraries/Facepunch.Steamworks/SteamTimeline.cs create mode 100644 Libraries/Facepunch.Steamworks/Structs/GamePhaseRecordingInfo.cs create mode 100644 Libraries/Facepunch.Steamworks/steam_api.dll create mode 100644 changelogs/combine_changelogs.bat create mode 100644 changelogs/combine_changelogs.sh diff --git a/Barotrauma/BarotraumaClient/ClientSource/Characters/Character.cs b/Barotrauma/BarotraumaClient/ClientSource/Characters/Character.cs index 0d0b65cb1..7b92c12ac 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Characters/Character.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Characters/Character.cs @@ -435,6 +435,13 @@ namespace Barotrauma { cam.OffsetAmount = targetOffsetAmount = item.Prefab.OffsetOnSelected * item.OffsetOnSelectedMultiplier; } + else if (HeldItems.SelectMany(static item => item.GetComponents()) + .Where(static holdable => holdable.Aimable) + .MaxOrNull(static holdable => holdable.CameraAimOffset) is float maxOffset + && maxOffset > 0f && IsKeyDown(InputType.Aim)) + { + cam.OffsetAmount = targetOffsetAmount = maxOffset; + } else if (SelectedItem != null && ViewTarget == null && SelectedItem.Components.Any(ic => ic?.GuiFrame != null && ic.ShouldDrawHUD(this))) { diff --git a/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterHUD.cs b/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterHUD.cs index 8c95ece49..77f71ceca 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterHUD.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterHUD.cs @@ -653,7 +653,10 @@ namespace Barotrauma (int)(HUDLayoutSettings.BottomRightInfoArea.Width / 2), (int)(HUDLayoutSettings.BottomRightInfoArea.Height * 0.7f)), character.Info.IsDisguisedAsAnother); float yOffset = (GameMain.GameSession?.Campaign is MultiPlayerCampaign ? -10 : 4) * GUI.Scale; - character.Info.DrawPortrait(spriteBatch, HUDLayoutSettings.PortraitArea.Location.ToVector2(), new Vector2(-12 * GUI.Scale, yOffset), targetWidth: HUDLayoutSettings.PortraitArea.Width, true, character.Info.IsDisguisedAsAnother); + + character.Info?.DrawIcon(spriteBatch, + new Vector2(HUDLayoutSettings.PortraitArea.Center.X - 12 * GUI.Scale, HUDLayoutSettings.PortraitArea.Center.Y), HUDLayoutSettings.PortraitArea.Size.ToVector2(), + flip: true); character.Info.DrawForeground(spriteBatch); } mouseOnPortrait = MouseOnCharacterPortrait() && !character.ShouldLockHud(); @@ -733,8 +736,9 @@ namespace Barotrauma string focusName = character.FocusedCharacter.Info == null ? character.FocusedCharacter.DisplayName : character.FocusedCharacter.Info.DisplayName; Vector2 textPos = startPos; - Vector2 textSize = GUIStyle.Font.MeasureString(focusName); - Vector2 largeTextSize = GUIStyle.SubHeadingFont.MeasureString(focusName); + //measure arbitrary one-line text instead of the potentially-multi-line name + Vector2 textSize = GUIStyle.Font.MeasureString("T"); + Vector2 largeTextSize = GUIStyle.SubHeadingFont.MeasureString("T"); textPos -= new Vector2(textSize.X / 2, textSize.Y); diff --git a/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterInfo.cs b/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterInfo.cs index 5afb4c2d0..028b373b2 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterInfo.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterInfo.cs @@ -360,64 +360,6 @@ namespace Barotrauma GUIStyle.Font.DrawString(spriteBatch, str, new Vector2(barRect.Right - iconXOffset - scaledTextSizeX - GUI.IntScale(4), barRect.Center.Y - scaledTextSizeY / 2), GUIStyle.TextColorNormal, 0f, Vector2.Zero, textScale, SpriteEffects.None, 0f); } - public void DrawPortrait(SpriteBatch spriteBatch, Vector2 screenPos, Vector2 offset, float targetWidth, bool flip = false, bool evaluateDisguise = false) - { - if (evaluateDisguise && IsDisguised) { return; } - - Vector2? sheetIndex; - Sprite portraitToDraw; - List attachmentsToDraw; - - Color hairColor; - Color facialHairColor; - Color skinColor; - - if (!IsDisguisedAsAnother || !evaluateDisguise) - { - sheetIndex = Head.SheetIndex; - portraitToDraw = Portrait; - attachmentsToDraw = AttachmentSprites; - - hairColor = Head.HairColor; - facialHairColor = Head.FacialHairColor; - skinColor = Head.SkinColor; - } - else - { - sheetIndex = disguisedSheetIndex; - portraitToDraw = disguisedPortrait; - attachmentsToDraw = disguisedAttachmentSprites; - - hairColor = disguisedHairColor; - facialHairColor = disguisedFacialHairColor; - skinColor = disguisedSkinColor; - } - - if (portraitToDraw != null) - { - var currEffect = spriteBatch.GetCurrentEffect(); - // Scale down the head sprite 10% - float scale = targetWidth * 0.9f / Portrait.size.X; - if (sheetIndex.HasValue) - { - SetHeadEffect(spriteBatch); - portraitToDraw.SourceRect = new Rectangle(CalculateOffset(portraitToDraw, sheetIndex.Value.ToPoint()), portraitToDraw.SourceRect.Size); - } - portraitToDraw.Draw(spriteBatch, screenPos + offset, skinColor, portraitToDraw.Origin, scale: scale, spriteEffect: flip ? SpriteEffects.FlipHorizontally : SpriteEffects.None); - if (attachmentsToDraw != null) - { - float depthStep = 0.000001f; - foreach (var attachment in attachmentsToDraw) - { - SetAttachmentEffect(spriteBatch, attachment); - DrawAttachmentSprite(spriteBatch, attachment, portraitToDraw, sheetIndex, screenPos + offset, scale, depthStep, GetAttachmentColor(attachment, hairColor, facialHairColor), flip ? SpriteEffects.FlipHorizontally : SpriteEffects.None); - depthStep += depthStep; - } - } - spriteBatch.SwapEffect(currEffect); - } - } - //TODO: I hate this so much :( private SpriteBatch.EffectWithParams headEffectParameters; private Dictionary attachmentEffectParameters @@ -466,23 +408,26 @@ namespace Barotrauma } } - public void DrawIcon(SpriteBatch spriteBatch, Vector2 screenPos, Vector2 targetAreaSize) + public void DrawIcon(SpriteBatch spriteBatch, Vector2 screenPos, Vector2 targetAreaSize, bool flip = false) { var headSprite = HeadSprite; if (headSprite != null) { + var spriteEffects = flip ? SpriteEffects.FlipHorizontally : SpriteEffects.None; + var currEffect = spriteBatch.GetCurrentEffect(); float scale = Math.Min(targetAreaSize.X / headSprite.size.X, targetAreaSize.Y / headSprite.size.Y); headSprite.SourceRect = new Rectangle(CalculateOffset(headSprite, Head.SheetIndex.ToPoint()), headSprite.SourceRect.Size); SetHeadEffect(spriteBatch); - headSprite.Draw(spriteBatch, screenPos, scale: scale, color: Head.SkinColor); + headSprite.Draw(spriteBatch, screenPos, scale: scale, color: Head.SkinColor, spriteEffect: spriteEffects); if (AttachmentSprites != null) { float depthStep = 0.000001f; foreach (var attachment in AttachmentSprites) { SetAttachmentEffect(spriteBatch, attachment); - DrawAttachmentSprite(spriteBatch, attachment, headSprite, Head.SheetIndex, screenPos, scale, depthStep, GetAttachmentColor(attachment, Head.HairColor, Head.FacialHairColor)); + DrawAttachmentSprite(spriteBatch, attachment, headSprite, Head.SheetIndex, screenPos, scale, depthStep, GetAttachmentColor(attachment, Head.HairColor, Head.FacialHairColor), + spriteEffects: spriteEffects); depthStep += depthStep; } } @@ -534,9 +479,6 @@ namespace Barotrauma { origin.Y = attachment.Sprite.size.Y - origin.Y; } - //the portrait's origin is forced to 0,0 (presumably for easier drawing on the UI?), see LoadHeadElement - //we need to take that into account here and draw the attachment at where the origin of the "actual" head sprite would be - drawPos += HeadSprite.Origin * scale; } float depth = attachment.Sprite.Depth; if (attachment.InheritLimbDepth) @@ -545,7 +487,6 @@ namespace Barotrauma } attachment.Sprite.Draw(spriteBatch, drawPos, color ?? Color.White, origin, rotate: 0, scale: scale, depth: depth, spriteEffect: spriteEffects); } - public static CharacterInfo ClientRead(Identifier speciesName, IReadMessage inc, bool requireJobPrefabFound = true) { ushort infoID = inc.ReadUInt16(); @@ -568,7 +509,6 @@ namespace Barotrauma Color hairColor = inc.ReadColorR8G8B8(); Color facialHairColor = inc.ReadColorR8G8B8(); - Identifier npcId = inc.ReadIdentifier(); Identifier factionId = inc.ReadIdentifier(); diff --git a/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterNetworking.cs index 06e788eb3..3b937d68a 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterNetworking.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Characters/CharacterNetworking.cs @@ -833,6 +833,9 @@ namespace Barotrauma causeOfDeathAffliction = afflictionPrefab; } } + + Character killer = FindEntityByID(msg.ReadUInt16()) as Character; + bool containsAfflictionData = msg.ReadBoolean(); if (!IsDead) { @@ -842,7 +845,7 @@ namespace Barotrauma } else { - Kill(causeOfDeathType, causeOfDeathAffliction?.Instantiate(1.0f), true); + Kill(causeOfDeathType, causeOfDeathAffliction?.Instantiate(1.0f, killer), true); } } if (containsAfflictionData) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Characters/Health/CharacterHealth.cs b/Barotrauma/BarotraumaClient/ClientSource/Characters/Health/CharacterHealth.cs index 275d5ce4d..c7bfa8924 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Characters/Health/CharacterHealth.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Characters/Health/CharacterHealth.cs @@ -221,7 +221,7 @@ namespace Barotrauma new GUICustomComponent(new RectTransform(new Vector2(0.2f, 1.0f), nameContainer.RectTransform, Anchor.CenterLeft), onDraw: (spriteBatch, component) => { - character.Info?.DrawPortrait(spriteBatch, new Vector2(component.Rect.X, component.Rect.Center.Y - component.Rect.Width / 2), Vector2.Zero, component.Rect.Width, false, character != Character.Controlled); + character.Info?.DrawIcon(spriteBatch, component.Rect.Center.ToVector2(), component.Rect.Size.ToVector2()); }); characterName = new GUITextBlock(new RectTransform(new Vector2(0.6f, 1.0f), nameContainer.RectTransform), "", textAlignment: Alignment.CenterLeft, font: GUIStyle.SubHeadingFont) { @@ -1041,8 +1041,29 @@ namespace Barotrauma foreach (KeyValuePair kvp in afflictions) { var affliction = kvp.Key; - affliction.Prefab.AfflictionOverlay?.Draw(spriteBatch, Vector2.Zero, Color.White * affliction.GetAfflictionOverlayMultiplier(), Vector2.Zero, 0.0f, - new Vector2(GameMain.GraphicsWidth / DamageOverlay.size.X, GameMain.GraphicsHeight / DamageOverlay.size.Y)); + if (affliction.Prefab is AfflictionPrefab { AfflictionOverlay: not null } afflictionPrefab) + { + Vector2 screenSize = new Vector2(GameMain.GraphicsWidth, GameMain.GraphicsHeight); + if (afflictionPrefab.AfflictionOverlay is SpriteSheet spriteSheet) + { + spriteSheet.Draw(spriteBatch, + spriteIndex: spriteSheet.GetAnimatedSpriteIndex(afflictionPrefab.AfflictionOverlayAnimSpeed), + pos: Vector2.Zero, + color: Color.White * affliction.GetAfflictionOverlayMultiplier(), + origin: Vector2.Zero, + rotate: 0, + scale: screenSize / spriteSheet.FrameSize.ToVector2()); + } + else if (afflictionPrefab.AfflictionOverlay is Sprite sprite) + { + sprite.Draw(spriteBatch, + pos: Vector2.Zero, + color: Color.White * affliction.GetAfflictionOverlayMultiplier(), + origin: Vector2.Zero, + rotate: 0, + scale: screenSize / sprite.size); + } + } var activeEffect = affliction.GetActiveEffect(); if (activeEffect is { ThermalOverlayRange: > 0.0f }) @@ -1554,9 +1575,9 @@ namespace Barotrauma }; var description = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.3f), parent.RectTransform), - affliction.Prefab.GetDescription( + RichString.Rich(affliction.Prefab.GetDescription( affliction.Strength, - Character == Character.Controlled ? AfflictionPrefab.Description.TargetType.Self : AfflictionPrefab.Description.TargetType.OtherCharacter), + Character == Character.Controlled ? AfflictionPrefab.Description.TargetType.Self : AfflictionPrefab.Description.TargetType.OtherCharacter)), textAlignment: Alignment.TopLeft, wrap: true) { CanBeFocused = false diff --git a/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs b/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs index f11273dc5..1d00ad15f 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs @@ -902,6 +902,14 @@ namespace Barotrauma DebugConsole.ThrowError("The command 'wikiimage_sub' failed.", e); } })); + + AssignOnExecute("loslightingfreecam", (string[] args) => + { + ExecuteCommand("los"); + ExecuteCommand("lighting"); + ExecuteCommand("freecam"); + }); + AssignRelayToServer("loslightingfreecam", false); AssignRelayToServer("kick", false); AssignRelayToServer("kickid", false); @@ -1091,6 +1099,42 @@ namespace Barotrauma (lightComponent.LightColor.A / 255.0f) * value.W); } }, isCheat: false)); + + commands.Add(new Command("steamtimelinetest", "steamtimelinetest: Test the Steamworks timeline feature.", (string[] args) => + { + // Add an instantaneous event to the Steam timeline + var eventHandle = Steamworks.SteamTimeline.AddInstantaneousTimelineEvent( + "Barotrauma Test Event", + "This is a test event created from the debug console", + "steam_marker", // Important: icon must be specified, or it does nothing :D + 1, // Priority + 0.0f, // Current time (no offset) + Steamworks.TimelineEventClipPriority.Standard); + + NewMessage($"Steamworks timeline test: Added instantaneous event with handle: {eventHandle}", Color.Yellow); + })); + + commands.Add(new Command("setsteamtimelinegamemode", "setsteamtimelinegamemode [gamemode]: Sets the Steam timeline gamemode to the specified value.", args => + { + if (args.Length == 0) + { + NewMessage("Please specify a gamemode. Available modes: " + string.Join(", ", Enum.GetNames(typeof(SteamTimelineManager.TimelineGameMode))), Color.Red); + return; + } + + if (Enum.TryParse(args[0], ignoreCase: true, out var gameMode)) + { + SteamTimelineManager.SetTimelineGameMode(gameMode); + NewMessage($"Timeline gamemode set to: {gameMode}", Color.Green); + } + else + { + NewMessage($"Invalid gamemode '{args[0]}'. Available modes: " + string.Join(", ", Enum.GetNames(typeof(SteamTimelineManager.TimelineGameMode))), Color.Red); + } + }, isCheat: true, getValidArgs: () => + { + return new[] { Enum.GetNames(typeof(SteamTimelineManager.TimelineGameMode)) }; + })); commands.Add(new Command("color|colour", "Change color (as bytes from 0 to 255) of the selected item/structure instances. Applied only in the subeditor.", (string[] args) => { @@ -2525,6 +2569,85 @@ namespace Barotrauma #if DEBUG + commands.Add(new Command( + "listachievements", + "listachievements: Lists all achievement identifiers, names, descriptions, and their current Steam status (Locked/Unlocked).", + (string[] args) => + { + NewMessage("--- Achievement Status: Name - (Identifier) - [Status] - Description ---", Color.Cyan); + + var supportedIds = AchievementManager.SupportedAchievements; + + if (supportedIds == null || !supportedIds.Any()) + { + NewMessage("No achievement identifiers found in AchievementManager.SupportedAchievements.", Color.Yellow); + NewMessage("-------------------------------------------------------------------", Color.Cyan); + return; + } + + if (!SteamManager.IsInitialized || !Steamworks.SteamClient.IsValid) + { + NewMessage("Steam not initialized. Cannot fetch achievement status or texts.", Color.Red); + foreach (Identifier id in supportedIds.OrderBy(i => i.Value)) + { + NewMessage($"- Name N/A - ({id.Value}) - [Status Unknown] - Description N/A", Color.Red); + } + } + else + { + try + { + var steamAchievements = Steamworks.SteamUserStats.Achievements + .ToDictionary(a => a.Identifier, StringComparer.OrdinalIgnoreCase); + + foreach (Identifier id in supportedIds.OrderBy(i => i.Value)) + { + string statusText; + string nameText = "Name N/A"; + string descText = "Description N/A"; + Color statusColor; + + if (steamAchievements.TryGetValue(id.Value, out var steamAch)) + { + nameText = steamAch.Name ?? "Name N/A"; + descText = steamAch.Description ?? "Description N/A"; + + if (steamAch.State) + { + statusText = "[Unlocked]"; + statusColor = Color.LimeGreen; + } + else + { + statusText = "[Locked]"; + statusColor = Color.Orange; + } + } + else + { + statusText = "[Not Found on Steam]"; + statusColor = Color.Red; + } + + string output = $"- {nameText} - ({id.Value}) - {statusText} - {descText}"; + NewMessage(output, statusColor); + } + } + catch (Exception e) + { + ThrowError("Error retrieving achievement statuses/texts from Steam.", e); + foreach (Identifier id in supportedIds.OrderBy(i => i.Value)) + { + NewMessage($"- Name N/A - ({id.Value}) - [Status Error] - Description N/A", Color.Red); + } + } + } + + NewMessage("-------------------------------------------------------------------", Color.Cyan); + }, + isCheat: true + )); + commands.Add(new Command("unlockachievement", "unlockachievement [identifier]: Unlocks the specified achievement.", (string[] args) => { if (args.Length < 1) @@ -2535,6 +2658,60 @@ namespace Barotrauma NewMessage($"Unlocked \"{args[0]}\"."); AchievementManager.UnlockAchievement(args[0].ToIdentifier()); }, isCheat: true)); + + commands.Add(new Command( + "resetachievement", + "resetachievement [identifier]: Clears (locks) the specified Steam achievement for testing.", + args => + { + if (args.Length < 1) + { + ThrowError("Please specify the achievement identifier to reset."); + return; + } + + if (!SteamManager.IsInitialized || !Steamworks.SteamClient.IsValid) + { + ThrowError("Steam not initialized."); + return; + } + + string achievementId = args[0]; + bool found = false; + bool success = false; + + try + { + var achievement = Steamworks.SteamUserStats.Achievements + .FirstOrDefault(a => a.Identifier.Equals(achievementId, StringComparison.OrdinalIgnoreCase)); + + if (achievement.Identifier == null) + { + ThrowError($"Achievement with identifier \"{achievementId}\" not found."); + return; + } + + found = true; + success = achievement.Clear(); + + if (success) + { + // IMPORTANT: Store the stats to make the change persistent + SteamManager.StoreStats(); + NewMessage($"Reset achievement \"{achievementId}\".", Color.Yellow); + } + else + { + ThrowError($"Failed to clear achievement \"{achievementId}\" (Steamworks returned false)."); + } + } + catch (Exception e) + { + ThrowError($"An error occurred while trying to reset achievement \"{achievementId}\". Found: {found}, Success: {success}", e); + } + }, + isCheat: true + )); commands.Add(new Command("deathprompt", "Shows the death prompt for testing purposes.", (string[] args) => { @@ -2696,7 +2873,14 @@ namespace Barotrauma { int amount = 1; if (args.Length > 0) { int.TryParse(args[0], out amount); } - GameMain.LevelEditorScreen.TestLevelGenerationForErrors(amount); + try + { + GameMain.LevelEditorScreen.TestLevelGenerationForErrors(amount); + } + catch (Exception e) + { + ThrowError("Failed to generate levels", e); + } } else { diff --git a/Barotrauma/BarotraumaClient/ClientSource/Events/Missions/SalvageMission.cs b/Barotrauma/BarotraumaClient/ClientSource/Events/Missions/SalvageMission.cs index ac06e10fd..2009a3819 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Events/Missions/SalvageMission.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Events/Missions/SalvageMission.cs @@ -139,6 +139,6 @@ namespace Barotrauma } } - public override IEnumerable HudIconTargets => targets.Where(static t => !t.Retrieved && t.Item.GetRootInventoryOwner() is not Character { IsLocalPlayer: true }).Select(static t => t.Item); + public override IEnumerable HudIconTargets => targets.Where(static t => !t.Retrieved && t.Item?.GetRootInventoryOwner() is not Character { IsLocalPlayer: true }).Select(static t => t.Item); } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/GUI/GUI.cs b/Barotrauma/BarotraumaClient/ClientSource/GUI/GUI.cs index c67ad7794..bf67f7b93 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GUI/GUI.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GUI/GUI.cs @@ -2236,6 +2236,29 @@ namespace Barotrauma return textBox; } + /// + /// Creates a pre-built filter box. + /// + /// + /// The filter function must be set using .. + /// + public static GUITextBox CreateFilterBox(RectTransform rectT) + { + GUITextBox textBox = new(rectT, createClearButton: true) + { + OnEnterPressed = (tb, _) => + { + tb.Deselect(); + return true; + } + }; + GUITextBlock label = new(new RectTransform(Vector2.One, textBox.TextBlock.RectTransform, Anchor.CenterLeft), TextManager.Get("serverlog.filter"), GUIStyle.TextColorNormal * 0.75f); + textBox.OnSelected += (_, _) => label.Visible = false; + textBox.OnDeselected += (tb, _) => label.Visible = tb.Text.IsNullOrEmpty(); + textBox.OnTextChanged += (tb, text) => label.Visible = !tb.Selected && text.IsNullOrEmpty(); + return textBox; + } + public static void NotifyPrompt(LocalizedString header, LocalizedString body) { GUIMessageBox msgBox = new GUIMessageBox(header, body, new[] { TextManager.Get("Ok") }, new Vector2(0.2f, 0.175f), minSize: new Point(300, 175)); @@ -2295,9 +2318,61 @@ namespace Barotrauma return msgBox; } -#endregion +#nullable enable + #region Item UI + /// + /// Creates a 7-segment display. + /// + /// Returns if is or empty. + /// Defaults to TextManager.Get("kilowatt"). + /// Defaults to . + public static GUITextBlock CreateDigitalDisplay(RectTransform rect, out GUITextBlock? leftLabel, out GUITextBlock rightLabel, LocalizedString? leftLabelText = null, LocalizedString? rightLabelText = null, LocalizedString? tooltip = null, GUIFont? leftLabelFont = null) + { + GUILayoutGroup textArea = new(rect, isHorizontal: true, childAnchor: Anchor.CenterLeft) + { + Stretch = true, + CanBeFocused = true, + ToolTip = tooltip!, + AbsoluteSpacing = 5 + }; -#region Element positioning + leftLabel = null; + if (!leftLabelText.IsNullOrEmpty()) + { + leftLabel = new GUITextBlock(new RectTransform(new Vector2(0.4f, 1f), textArea.RectTransform), leftLabelText, textColor: GUIStyle.TextColorBright, font: leftLabelFont ?? GUIStyle.LargeFont, textAlignment: Alignment.CenterRight); + } + + GUIFrame displayBackground = new(new RectTransform(new Vector2(0.55f, 0.8f), textArea.RectTransform), style: "DigitalFrameDark"); + GUITextBlock displayText = new(new RectTransform(new Vector2(0.9f, 0.95f), displayBackground.RectTransform, Anchor.Center), "8888", font: GUIStyle.DigitalFont, textColor: GUIStyle.TextColorDark, textAlignment: Alignment.CenterRight); + displayText.TextScale = Math.Max((displayText.Rect.Height - 10) / GUIStyle.DigitalFont.LineHeight, 0.1f); + + rightLabel = new GUITextBlock(new RectTransform(Vector2.Zero, textArea.RectTransform), rightLabelText ?? TextManager.Get("kilowatt"), textColor: GUIStyle.TextColorNormal, font: GUIStyle.Font, textAlignment: Alignment.CenterRight) + { + Padding = Vector4.Zero + }; + rightLabel.RectTransform.MinSize = rightLabel.TextSize.ToPoint(); + + textArea.GetAllChildren().ForEach(child => child.CanBeFocused = false); + return displayText; + } + + /// Defaults to . + public static GUITickBox CreateIndicatorLight(RectTransform rect, string style = "", LocalizedString? label = null, LocalizedString? tooltip = null, GUIFont? labelFont = null) + { + GUITickBox indicator = new(rect, label, font: labelFont ?? GUIStyle.SubHeadingFont, style: style) + { + Enabled = false, + ToolTip = tooltip! + }; + indicator.TextBlock.OverrideTextColor(GUIStyle.TextColorNormal); + return indicator; + } + #endregion +#nullable restore + + #endregion + + #region Element positioning private static List CreateElements(int count, RectTransform parent, Func constructor, Vector2? relativeSize = null, Point? absoluteSize = null, Anchor anchor = Anchor.TopLeft, Pivot? pivot = null, Point? minSize = null, Point? maxSize = null, diff --git a/Barotrauma/BarotraumaClient/ClientSource/GUI/GUIButton.cs b/Barotrauma/BarotraumaClient/ClientSource/GUI/GUIButton.cs index da33ae1cf..a5e5aa8c8 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GUI/GUIButton.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GUI/GUIButton.cs @@ -211,7 +211,7 @@ namespace Barotrauma } var selfStyle = Style; - textBlock = new GUITextBlock(new RectTransform(Vector2.One, rectT, Anchor.Center), text, textAlignment: textAlignment, style: null) + textBlock = new GUITextBlock(new RectTransform(Vector2.One, rectT, Anchor.Center), RichString.Rich(text), textAlignment: textAlignment, style: null) { TextColor = selfStyle?.TextColor ?? Color.Black, HoverTextColor = selfStyle?.HoverTextColor ?? Color.Black, diff --git a/Barotrauma/BarotraumaClient/ClientSource/GUI/GUIListBox.cs b/Barotrauma/BarotraumaClient/ClientSource/GUI/GUIListBox.cs index a96e57bf9..965b7ed90 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GUI/GUIListBox.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GUI/GUIListBox.cs @@ -446,19 +446,22 @@ namespace Barotrauma UpdateScrollBarSize(); } - public void Select(object userData, Force force = Force.No, AutoScroll autoScroll = AutoScroll.Enabled) + public bool Select(object userData, Force force = Force.No, AutoScroll autoScroll = AutoScroll.Enabled) { var children = Content.Children; int i = 0; + bool wasSelected = false; foreach (GUIComponent child in children) { if (Equals(child.UserData, userData)) { + wasSelected = true; Select(i, force, autoScroll); - if (!SelectMultiple) { return; } + if (!SelectMultiple) { return true; } } i++; } + return wasSelected; } private Point CalculateFrameSize(bool isHorizontal, int scrollBarSize) diff --git a/Barotrauma/BarotraumaClient/ClientSource/GUI/HRManagerUI.cs b/Barotrauma/BarotraumaClient/ClientSource/GUI/HRManagerUI.cs index cff44b879..928ae3519 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GUI/HRManagerUI.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GUI/HRManagerUI.cs @@ -1021,6 +1021,14 @@ namespace Barotrauma { MaxTextLength = Client.MaxNameLength }; + nameBox.OnTextChanged += (GUITextBox textBox, string text) => + { + if (text.Contains('\n') || text.Contains('\r')) + { + textBox.Text = text.Replace("\r\n", " ").Replace('\n', ' ').Replace('\r', ' '); + } + return true; + }; new GUIButton(new RectTransform(groupElementSize, layoutGroup.RectTransform), text: TextManager.Get("confirm")) { OnClicked = (button, userData) => diff --git a/Barotrauma/BarotraumaClient/ClientSource/GUI/MedicalClinicUI.cs b/Barotrauma/BarotraumaClient/ClientSource/GUI/MedicalClinicUI.cs index 85fe74086..99c4e785d 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GUI/MedicalClinicUI.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GUI/MedicalClinicUI.cs @@ -1,4 +1,4 @@ -#nullable enable +#nullable enable using System; using System.Collections.Generic; @@ -749,7 +749,7 @@ namespace Barotrauma { new GUICustomComponent(new RectTransform(Vector2.One, parent.RectTransform, scaleBasis: ScaleBasis.BothHeight), (spriteBatch, component) => { - info.DrawPortrait(spriteBatch, component.Rect.Location.ToVector2(), Vector2.Zero, component.Rect.Width); + info.DrawIcon(spriteBatch, component.Rect.Center.ToVector2(), component.Rect.Size.ToVector2()); }); GUILayoutGroup textGroup = new GUILayoutGroup(new RectTransform(new Vector2(1f, 0.8f), parent.RectTransform)); diff --git a/Barotrauma/BarotraumaClient/ClientSource/GUI/TalentMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/GUI/TalentMenu.cs index 871dd8133..94aa5638e 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GUI/TalentMenu.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GUI/TalentMenu.cs @@ -273,7 +273,7 @@ namespace Barotrauma new GUICustomComponent(new RectTransform(new Vector2(0.25f, 1f), topLayout.RectTransform), onDraw: (batch, component) => { - info.DrawPortrait(batch, component.Rect.Location.ToVector2(), Vector2.Zero, component.Rect.Width, false, false); + info.DrawIcon(batch, component.Rect.Center.ToVector2(), component.Rect.Size.ToVector2()); }); GUILayoutGroup nameLayout = new GUILayoutGroup(new RectTransform(new Vector2(0.3f, 1f), topLayout.RectTransform)) @@ -327,7 +327,7 @@ namespace Barotrauma if (extraTalent.IsHiddenExtraTalent) { continue; } GUIImage talentImg = new GUIImage(new RectTransform(Vector2.One, extraTalentList.Content.RectTransform, scaleBasis: ScaleBasis.BothHeight), sprite: extraTalent.Icon, scaleToFit: true) { - ToolTip = RichString.Rich($"‖color:{Color.White.ToStringHex()}‖{extraTalent.DisplayName}‖color:end‖" + "\n\n" + ToolBox.ExtendColorToPercentageSigns(extraTalent.Description.Value)), + ToolTip = GetTalentTooltip(extraTalent, characterInfo), Color = GUIStyle.Green }; } @@ -637,7 +637,7 @@ namespace Barotrauma GUIFrame croppedTalentFrame = new GUIFrame(new RectTransform(Vector2.One, talentFrame.RectTransform, anchor: Anchor.Center, scaleBasis: ScaleBasis.BothHeight), style: null); GUIButton talentButton = new GUIButton(new RectTransform(Vector2.One, croppedTalentFrame.RectTransform, anchor: Anchor.Center), style: null) { - ToolTip = CreateTooltip(talent, characterInfo), + ToolTip = GetTalentTooltip(talent, characterInfo), UserData = talent.Identifier, PressedColor = pressedColor, Enabled = info.Character != null, @@ -703,24 +703,6 @@ namespace Barotrauma }, }; - static RichString CreateTooltip(TalentPrefab talent, CharacterInfo? character) - { - LocalizedString progress = string.Empty; - - if (character is not null && talent.TrackedStat.TryUnwrap(out var stat)) - { - var statValue = character.GetSavedStatValue(StatTypes.None, stat.PermanentStatIdentifier); - var intValue = (int)MathF.Round(statValue); - progress = "\n\n"; - progress += statValue < stat.Max - ? TextManager.GetWithVariables("talentprogress", ("[amount]", intValue.ToString()), ("[max]", stat.Max.ToString())) - : TextManager.Get("talentprogresscompleted"); - } - - RichString tooltip = RichString.Rich($"‖color:{Color.White.ToStringHex()}‖{talent.DisplayName}‖color:end‖\n\n{ToolBox.ExtendColorToPercentageSigns(talent.Description.Value)}{progress}"); - return tooltip; - } - talentButton.Color = talentButton.HoverColor = talentButton.PressedColor = talentButton.SelectedColor = talentButton.DisabledColor = Color.Transparent; GUIComponent iconImage; @@ -814,6 +796,24 @@ namespace Barotrauma GUITextBlock.AutoScaleAndNormalize(talentResetButton.TextBlock, talentApplyButton.TextBlock); } + private static RichString GetTalentTooltip(TalentPrefab talent, CharacterInfo? character) + { + LocalizedString progress = string.Empty; + + if (character is not null && talent.TrackedStat.TryUnwrap(out var stat)) + { + var statValue = character.GetSavedStatValue(StatTypes.None, stat.PermanentStatIdentifier); + var intValue = (int)MathF.Round(statValue); + progress = "\n\n"; + progress += statValue < stat.Max + ? TextManager.GetWithVariables("talentprogress", ("[amount]", intValue.ToString()), ("[max]", stat.Max.ToString())) + : TextManager.Get("talentprogresscompleted"); + } + + RichString tooltip = RichString.Rich($"‖color:{Color.White.ToStringHex()}‖{talent.DisplayName}‖color:end‖\n\n{ToolBox.ExtendColorToPercentageSigns(talent.Description.Value)}{progress}"); + return tooltip; + } + private bool ResetTalentSelection(GUIButton guiButton, object userData) { if (characterInfo is null) { return false; } diff --git a/Barotrauma/BarotraumaClient/ClientSource/GUI/UpgradeStore.cs b/Barotrauma/BarotraumaClient/ClientSource/GUI/UpgradeStore.cs index dc2913de1..e8e9dd49f 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GUI/UpgradeStore.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GUI/UpgradeStore.cs @@ -7,6 +7,7 @@ using System.Diagnostics; using System.Linq; using Barotrauma.Extensions; using Barotrauma.Items.Components; +using Barotrauma.Networking; using FarseerPhysics; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; @@ -949,7 +950,7 @@ namespace Barotrauma GUILayoutGroup buttonLayout = new GUILayoutGroup(rectT(1f, 1f, toggleButton.Frame), isHorizontal: true); LocalizedString slotText = ""; - if (linkedItems.Count() > 1) + if (linkedItems.Count > 1) { slotText = TextManager.GetWithVariable("weaponslot", "[number]", string.Join(", ", linkedItems.Select(it => (swappableEntities.IndexOf(it) + 1).ToString()))); } @@ -978,7 +979,7 @@ namespace Barotrauma List frames = new List(); if (currentOrPending != null) { - bool canUninstall = item.PendingItemSwap != null || !(currentOrPending.SwappableItem?.ReplacementOnUninstall.IsEmpty ?? true); + bool canUninstall = HasPermission && (item.PendingItemSwap != null || !(currentOrPending.SwappableItem?.ReplacementOnUninstall.IsEmpty ?? true)); bool isUninstallPending = item.Prefab.SwappableItem != null && item.PendingItemSwap?.Identifier == item.Prefab.SwappableItem.ReplacementOnUninstall; if (isUninstallPending) { canUninstall = false; } @@ -1030,7 +1031,8 @@ namespace Barotrauma buttonStyle: isPurchased ? "WeaponInstallButton" : "StoreAddToCrateButton").Frame); if (!(frames.Last().FindChild(c => c is GUIButton, recursive: true) is GUIButton buyButton)) { continue; } - if (PlayerBalance >= price) + + if (HasPermission && PlayerBalance >= price) { buyButton.Enabled = true; buyButton.OnClicked += (button, o) => @@ -1272,7 +1274,7 @@ namespace Barotrauma if (!prefabFrame.BuyButton.TryUnwrap(out BuyButtonFrame buyButtonFrame)) { return; } - if (!HasPermission || !prefab.IsApplicable(submarine.Info) || (itemsOnSubmarine != null && !itemsOnSubmarine.Any(it => category.CanBeApplied(it, prefab)))) + if (!prefab.IsApplicable(submarine.Info) || (itemsOnSubmarine != null && !itemsOnSubmarine.Any(it => category.CanBeApplied(it, prefab)))) { prefabFrame.Frame.Enabled = false; prefabFrame.Description.Enabled = false; @@ -1289,12 +1291,14 @@ namespace Barotrauma ("[amount]", prefab.Price.GetBuyPrice(prefab, Campaign.UpgradeManager.GetUpgradeLevel(prefab, category), Campaign.Map?.CurrentLocation, characterList).ToString())); currectConfirmation = EventEditorScreen.AskForConfirmation(TextManager.Get("Upgrades.PurchasePromptTitle"), promptBody, () => { - if (GameMain.NetworkMember != null) + if (Campaign.UpgradeManager.TryPurchaseUpgrade(prefab, category)) { - WaitForServerUpdate = true; + if (GameMain.NetworkMember != null) + { + WaitForServerUpdate = true; + } + GameMain.Client?.SendCampaignState(); } - Campaign.UpgradeManager.PurchaseUpgrade(prefab, category); - GameMain.Client?.SendCampaignState(); return true; }, overrideConfirmButtonSound: GUISoundType.ConfirmTransaction); @@ -1722,7 +1726,7 @@ namespace Barotrauma if (buttonParent.FindChild(UpgradeStoreUserData.BuyButton, recursive: true) is GUIButton button) { - bool canBuy = !WaitForServerUpdate && !isMax && campaign.GetBalance() >= price && prefab.HasResourcesToUpgrade(Character.Controlled, currentLevel + 1); + bool canBuy = !WaitForServerUpdate && HasPermission && !isMax && campaign.GetBalance() >= price && prefab.HasResourcesToUpgrade(Character.Controlled, currentLevel + 1); button.Enabled = canBuy; } @@ -1935,7 +1939,7 @@ namespace Barotrauma return frames.ToArray(); } - private bool HasPermission => true; + private static bool HasPermission => CampaignMode.AllowedToManageCampaign(ClientPermissions.ManageCampaign); // just a shortcut to create new RectTransforms since all the new RectTransform and new Vector2 confuses my IDE (and me) private static RectTransform rectT(float x, float y, GUIComponent parentComponent, Anchor anchor = Anchor.TopLeft, ScaleBasis scaleBasis = ScaleBasis.Normal) diff --git a/Barotrauma/BarotraumaClient/ClientSource/GameMain.cs b/Barotrauma/BarotraumaClient/ClientSource/GameMain.cs index 062a0c393..ebe52c9fe 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GameMain.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GameMain.cs @@ -680,6 +680,7 @@ namespace Barotrauma private void OnInvitedToSteamGame(string connectCommand) { + DebugConsole.NewMessage($"Invited to Steam game, connect command: {connectCommand}", Color.Lime); try { ConnectCommand = Barotrauma.Networking.ConnectCommand.Parse(ToolBox.SplitCommand(connectCommand)); @@ -819,6 +820,7 @@ namespace Barotrauma { if (ConnectCommand.TryUnwrap(out var connectCommand)) { + DebugConsole.NewMessage($"Processing connect command: {connectCommand}...", Color.Lime); if (Client != null) { Client.Quit(); @@ -830,6 +832,7 @@ namespace Barotrauma if (connectCommand.SteamLobbyIdOption.TryUnwrap(out var lobbyId)) { + DebugConsole.NewMessage($"Connecting to lobby ID {lobbyId}...", Color.Lime); SteamManager.JoinLobby(lobbyId.Value, joinServer: true); } else if ((connectCommand.NameAndP2PEndpointsOption.TryUnwrap(out var nameAndEndpoint) && nameAndEndpoint is { ServerName: var serverName, Endpoints: var endpoints })) @@ -838,6 +841,7 @@ namespace Barotrauma endpoints.Cast().ToImmutableArray(), string.IsNullOrWhiteSpace(serverName) ? endpoints.First().StringRepresentation : serverName, Option.None()); + DebugConsole.NewMessage($"Connecting to endpoint {endpoints.First().StringRepresentation}...", Color.Lime); } else if ((connectCommand.NameAndLidgrenEndpointOption.TryUnwrap(out var nameAndLidgrenEndpoint) && nameAndLidgrenEndpoint is { ServerName: var lidgrenServerName, Endpoint: var endpoint })) { @@ -847,6 +851,10 @@ namespace Barotrauma string.IsNullOrWhiteSpace(lidgrenServerName) ? endpoint.StringRepresentation : lidgrenServerName, Option.None()); } + else + { + DebugConsole.NewMessage($"Cannot connect: unrecognized connect command.", Color.Lime); + } ConnectCommand = Option.None(); } @@ -1187,8 +1195,9 @@ namespace Barotrauma CoroutineManager.StopCoroutines("EndCinematic"); - if (GameSession != null) + if (GameSession != null && GameSession.IsRunning) { + AchievementManager.OnRoundEnded(GameSession, roundInterrupted: true); GameAnalyticsManager.AddProgressionEvent(GameAnalyticsManager.ProgressionStatus.Fail, GameSession.GameMode?.Preset.Identifier.Value ?? "none", GameSession.RoundDuration); diff --git a/Barotrauma/BarotraumaClient/ClientSource/GameSession/CrewManager.cs b/Barotrauma/BarotraumaClient/ClientSource/GameSession/CrewManager.cs index a6735757e..08bf2e2be 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GameSession/CrewManager.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GameSession/CrewManager.cs @@ -592,8 +592,7 @@ namespace Barotrauma public bool CharacterClicked(GUIComponent component, object selection) { if (!AllowCharacterSwitch) { return false; } - if (selection is not Character character || character.IsDead || character.IsUnconscious) { return false; } - if (!character.IsOnPlayerTeam) { return false; } + if (selection is not Character character || !character.IsOnPlayerTeam) { return false; } if (GameMain.IsMultiplayer) { @@ -605,6 +604,8 @@ namespace Barotrauma return true; } + if (character.IsDead || character.IsUnconscious) { return false; } + SelectCharacter(character); if (GUI.KeyboardDispatcher.Subscriber == crewList) { GUI.KeyboardDispatcher.Subscriber = null; } return true; @@ -3703,7 +3704,8 @@ namespace Barotrauma canIssueOrders = ChatMessage.CanUseRadio(Character.Controlled) && Character.Controlled?.CurrentHull?.Submarine?.TeamID == Character.Controlled.TeamID && - !Character.Controlled.CurrentHull.Submarine.Info.IsWreck; + !Character.Controlled.CurrentHull.Submarine.Info.IsWreck && + GameMain.Client is not { IsBlockedBySpamFilter: true }; } if (canIssueOrders) diff --git a/Barotrauma/BarotraumaClient/ClientSource/GameSession/GameModes/SinglePlayerCampaign.cs b/Barotrauma/BarotraumaClient/ClientSource/GameSession/GameModes/SinglePlayerCampaign.cs index cdd4d140c..3c49e47eb 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GameSession/GameModes/SinglePlayerCampaign.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GameSession/GameModes/SinglePlayerCampaign.cs @@ -133,56 +133,15 @@ namespace Barotrauma case "map": map = Map.Load(this, subElement); break; - case "cargo": - CargoManager.LoadPurchasedItems(subElement); - break; - case "pendingupgrades": //backwards compatibility - case "upgrademanager": - UpgradeManager = new UpgradeManager(this, subElement, isSingleplayer: true); - break; - case "pets": - petsElement = subElement; - break; - case Wallet.LowerCaseSaveElementName: - Bank = new Wallet(Option.None(), subElement); - break; - case "stats": - LoadStats(subElement); - break; - case "eventmanager": - GameMain.GameSession.EventManager.Load(subElement); - break; } } + LoadSaveSharedSingleAndMultiplayer(element); + UpgradeManager ??= new UpgradeManager(this); InitUI(); - //backwards compatibility for saves made prior to the addition of personal wallets - int oldMoney = element.GetAttributeInt("money", 0); - if (oldMoney > 0) - { - Bank = new Wallet(Option.None()) - { - Balance = oldMoney - }; - } - - PurchasedLostShuttlesInLatestSave = element.GetAttributeBool("purchasedlostshuttles", false); - PurchasedHullRepairsInLatestSave = element.GetAttributeBool("purchasedhullrepairs", false); - PurchasedItemRepairsInLatestSave = element.GetAttributeBool("purchaseditemrepairs", false); - CheatsEnabled = element.GetAttributeBool("cheatsenabled", false); - if (CheatsEnabled) - { - DebugConsole.CheatsEnabled = true; - if (!AchievementManager.CheatsEnabled) - { - AchievementManager.CheatsEnabled = true; - new GUIMessageBox("Cheats enabled", "Cheat commands have been enabled on the campaign. You will not receive Steam Achievements until you restart the game."); - } - } - if (map == null) { throw new System.Exception("Failed to load the campaign save file (saved with an older, incompatible version of Barotrauma)."); @@ -687,6 +646,11 @@ namespace Barotrauma modeElement.Add(GameMain.GameSession?.EventManager.Save()); } + foreach (Identifier unlockedRecipe in GameMain.GameSession.UnlockedRecipes) + { + modeElement.Add(new XElement("unlockedrecipe", new XAttribute("identifier", unlockedRecipe))); + } + //save and remove all items that are in someone's inventory so they don't get included in the sub file as well foreach (Character c in Character.CharacterList) { diff --git a/Barotrauma/BarotraumaClient/ClientSource/GameSession/GameSession.cs b/Barotrauma/BarotraumaClient/ClientSource/GameSession/GameSession.cs index df8b52048..26aa85a53 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GameSession/GameSession.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GameSession/GameSession.cs @@ -346,7 +346,6 @@ namespace Barotrauma /// public void RefreshAnyOpenPlayerInfo() { - DebugConsole.NewMessage($"Refreshing any open player info"); if (IsTabMenuOpen && TabMenu.SelectedTab == TabMenu.InfoFrameTab.Talents) { TabMenuInstance.SelectInfoFrameTab(TabMenu.InfoFrameTab.Talents); diff --git a/Barotrauma/BarotraumaClient/ClientSource/GameSession/RoundSummary.cs b/Barotrauma/BarotraumaClient/ClientSource/GameSession/RoundSummary.cs index 008011bf6..5b95c0428 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/GameSession/RoundSummary.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/GameSession/RoundSummary.cs @@ -907,7 +907,7 @@ namespace Barotrauma void SetReputationText(GUITextBlock textBlock) { LocalizedString reputationText = Reputation.GetFormattedReputationText(reputation.NormalizedValue, reputation.Value, addColorTags: true); - int reputationChange = (int)Math.Round(reputation.Value - initialReputation); + int reputationChange = (int)reputation.Value - (int)initialReputation; if (Math.Abs(reputationChange) > 0) { string changeText = $"{(reputationChange > 0 ? "+" : "") + reputationChange}"; diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/CharacterInventory.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/CharacterInventory.cs index 8d3ad40d5..59e6c3f11 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/CharacterInventory.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/CharacterInventory.cs @@ -771,6 +771,8 @@ namespace Barotrauma private QuickUseAction GetQuickUseAction(Item item, bool allowEquip, bool allowInventorySwap, bool allowApplyTreatment) { + if (!item.IsInteractable(Character.Controlled)) { return QuickUseAction.None; } + if (allowApplyTreatment && CharacterHealth.OpenHealthWindow != null && //if the item can be equipped in the health interface slot, don't use it as a treatment but try to equip it !item.AllowedSlots.Contains(InvSlotType.HealthInterface)) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Growable.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Growable.cs index 5b8af4a6a..b9d3604f3 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Growable.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Growable.cs @@ -158,7 +158,7 @@ namespace Barotrauma.Items.Components public void ClientEventRead(IReadMessage msg, float sendingTime) { - Health = msg.ReadRangedSingle(0, MaxHealth, 8); + Health = msg.ReadRangedSingle(0, MaxWater, 8); int startOffset = msg.ReadRangedInteger(-1, MaximumVines); if (startOffset > -1) { diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Holdable/Holdable.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Holdable/Holdable.cs index 0d532b2c2..bcd08e213 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Holdable/Holdable.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Holdable/Holdable.cs @@ -1,8 +1,9 @@ -using Barotrauma.Networking; +using Barotrauma.Extensions; +using Barotrauma.Networking; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; -using System.Diagnostics.Tracing; +using System.Collections.Generic; namespace Barotrauma.Items.Components { @@ -15,18 +16,33 @@ namespace Barotrauma.Items.Components public void Draw(SpriteBatch spriteBatch, bool editing, float itemDepth = -1, Color? overrideColor = null) { - if (!IsActive || picker == null || !CanBeAttached(picker) || !picker.IsKeyDown(InputType.Aim) || picker != Character.Controlled) + if (!IsActive || picker == null || !picker.IsKeyDown(InputType.Aim) || picker != Character.Controlled || !attachable) { Drawable = false; return; } - Vector2 gridPos = picker.Position; - Vector2 roundedGridPos = new Vector2( - MathUtils.RoundTowardsClosest(picker.Position.X, Submarine.GridSize.X), - MathUtils.RoundTowardsClosest(picker.Position.Y, Submarine.GridSize.Y)); + Color indicatorColor = Color.White; + if (!CanBeAttached(picker, out IEnumerable overlappingItems)) + { + foreach (var overlappingItem in overlappingItems) + { + overlappingItem.Draw(spriteBatch, editing: false, overrideColor: Color.Red * 0.7f, overrideDepth: 0.0f); + } + indicatorColor = Color.Red; + } + Vector2 attachPos = GetAttachPosition(picker); + Vector2 gridPos = picker.Position; + if (AttachesToFloor) + { + gridPos.Y = attachPos.Y - item.Rect.Height / 2; + } + Vector2 roundedGridPos = new Vector2( + MathUtils.RoundTowardsClosest(gridPos.X, Submarine.GridSize.X), + MathUtils.RoundTowardsClosest(gridPos.Y, Submarine.GridSize.Y)); + if (item.Submarine == null) { Structure attachTarget = Structure.GetAttachTarget(item.WorldPosition); @@ -35,20 +51,20 @@ namespace Barotrauma.Items.Components if (attachTarget.Submarine != null) { //set to submarine-relative position - gridPos += attachTarget.Submarine.Position; - roundedGridPos += attachTarget.Submarine.Position; - attachPos += attachTarget.Submarine.Position; + gridPos += attachTarget.Submarine.DrawPosition; + roundedGridPos += attachTarget.Submarine.DrawPosition; + attachPos += attachTarget.Submarine.DrawPosition; } } } else { - gridPos += item.Submarine.Position; - roundedGridPos += item.Submarine.Position; - attachPos += item.Submarine.Position; + gridPos += item.Submarine.DrawPosition; + roundedGridPos += item.Submarine.DrawPosition; + attachPos += item.Submarine.DrawPosition; } - Submarine.DrawGrid(spriteBatch, 14, gridPos, roundedGridPos, alpha: 0.4f); + Submarine.DrawGrid(spriteBatch, 14, gridPos, roundedGridPos, alpha: 0.4f, color: indicatorColor); Sprite sprite = item.Sprite; foreach (ContainedItemSprite containedSprite in item.Prefab.ContainedSprites) @@ -63,7 +79,7 @@ namespace Barotrauma.Items.Components sprite.Draw( spriteBatch, new Vector2(attachPos.X, -attachPos.Y), - item.SpriteColor * 0.5f, + item.SpriteColor.Multiply(indicatorColor) * 0.5f, item.RotationRad, item.Scale, SpriteEffects.None, 0.0f); @@ -75,7 +91,7 @@ namespace Barotrauma.Items.Components public void ClientEventWrite(IWriteMessage msg, NetEntityEvent.IData extraData = null) { - if (!attachable || body == null) { return; } + if (!attachable || originalBody == null) { return; } var eventData = ExtractEventData(extraData); @@ -115,9 +131,9 @@ namespace Barotrauma.Items.Components if (attached) { DropConnectedWires(null); - if (body != null) + if (originalBody != null) { - item.body = body; + item.body = originalBody; item.body.Enabled = true; } IsActive = false; diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Holdable/RangedWeapon.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Holdable/RangedWeapon.cs index 7ceb067e3..42bdee14d 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Holdable/RangedWeapon.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Holdable/RangedWeapon.cs @@ -76,7 +76,7 @@ namespace Barotrauma.Items.Components particleEmitterCharges.Add(new ParticleEmitter(subElement)); break; case "chargesound": - chargeSound = RoundSound.Load(subElement, false); + chargeSound = RoundSound.Load(subElement); break; } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/ItemComponent.cs index aa5e3883a..8f01d40f2 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/ItemComponent.cs @@ -236,7 +236,11 @@ namespace Barotrauma.Items.Components public ItemComponent GetReplacementOrThis() { - return ReplacedBy?.GetReplacementOrThis() ?? this; + if (ReplacedBy != null && ReplacedBy != this) + { + return ReplacedBy.GetReplacementOrThis(); + } + return this; } public bool NeedsSoundUpdate() @@ -511,7 +515,7 @@ namespace Barotrauma.Items.Components if (HUDOverlay is SpriteSheet spriteSheet) { spriteSheet.Draw(spriteBatch, - spriteIndex: (int)(Math.Floor(Timing.TotalTimeUnpaused * HUDOverlayAnimSpeed) % spriteSheet.FrameCount), + spriteIndex: spriteSheet.GetAnimatedSpriteIndex(HUDOverlayAnimSpeed), pos: screenSize / 2, color: Color.White, origin: HUDOverlay.Origin, rotate: 0, scale: screenSize / spriteSheet.FrameSize.ToVector2()); } else diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/ItemContainer.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/ItemContainer.cs index 353bb290b..da3a36e6a 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/ItemContainer.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/ItemContainer.cs @@ -553,12 +553,12 @@ namespace Barotrauma.Items.Components bool flipX = rootBody is { Dir: -1 } || flippedX; if (flipX) { - spriteEffects |= MathUtils.NearlyEqual(spriteRotation % 180, 90.0f) ? SpriteEffects.FlipVertically : SpriteEffects.FlipHorizontally; + spriteEffects |= SpriteEffects.FlipHorizontally; } bool flipY = flippedY; if (flipY) { - spriteEffects |= MathUtils.NearlyEqual(spriteRotation % 180, 90.0f) ? SpriteEffects.FlipHorizontally : SpriteEffects.FlipVertically; + spriteEffects |= SpriteEffects.FlipVertically; } contained.Item.Sprite.Draw( diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Fabricator.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Fabricator.cs index b54aaef03..68451d63e 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Fabricator.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Fabricator.cs @@ -434,12 +434,19 @@ namespace Barotrauma.Items.Components foreach (FabricationRecipe fi in fabricationRecipes.Values) { + RichString recipeTooltip = RichString.Rich(fi.TargetItem.Description); + if (fi.RequiresRecipe) + { + recipeTooltip += "\n\n" + $"‖color:{XMLExtensions.ToStringHex(GUIStyle.Red)}‖{TextManager.Get("fabricatorrequiresrecipe")}‖color:end‖"; + } + recipeTooltip = RichString.Rich(recipeTooltip); + var frame = new GUIFrame(new RectTransform(new Point(itemList.Content.Rect.Width, (int)(40 * GUI.yScale)), itemList.Content.RectTransform), style: null) { UserData = fi, HoverColor = Color.Gold * 0.2f, SelectedColor = Color.Gold * 0.5f, - ToolTip = RichString.Rich(fi.TargetItem.Description) + ToolTip = recipeTooltip }; var container = new GUILayoutGroup(new RectTransform(Vector2.One, frame.RectTransform), @@ -451,8 +458,8 @@ namespace Barotrauma.Items.Components new GUIImage(new RectTransform(new Point(frame.Rect.Height,frame.Rect.Height), container.RectTransform), itemIcon, scaleToFit: true) { - Color = fi.TargetItem.InventoryIconColor, - ToolTip = RichString.Rich(fi.TargetItem.Description) + Color = itemIcon == fi.TargetItem.Sprite ? fi.TargetItem.SpriteColor : fi.TargetItem.InventoryIconColor, + ToolTip = recipeTooltip }; } @@ -461,7 +468,7 @@ namespace Barotrauma.Items.Components { Padding = Vector4.Zero, AutoScaleVertical = true, - ToolTip = RichString.Rich(fi.TargetItem.Description) + ToolTip = recipeTooltip }; new GUITextBlock(new RectTransform(new Vector2(0.85f, 1f), frame.RectTransform, Anchor.BottomRight), @@ -513,7 +520,7 @@ namespace Barotrauma.Items.Components var nonItems = itemList.Content.Children.Where(c => c.UserData is not FabricationRecipe).ToList(); nonItems.ForEach(i => i.Visible = false); - SortItems(character: null); + SortItems(character); FilterEntities(selectedItemCategory, itemFilterBox?.Text ?? string.Empty); HideEmptyItemListCategories(); } @@ -1196,6 +1203,15 @@ namespace Barotrauma.Items.Components new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), paddedReqFrame.RectTransform), TextManager.FormatCurrency(SelectedItem.RequiredMoney), font: GUIStyle.SmallFont); } + + if (selectedRecipe.RequiresRecipe && !AnyOneHasRecipeForItem(Character.Controlled, selectedRecipe.TargetItem)) + { + new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), paddedReqFrame.RectTransform), + TextManager.Get("fabricatorrequiresrecipe"), textColor: GUIStyle.Red, font: GUIStyle.SubHeadingFont) + { + AutoScaleHorizontal = true, + }; + } } public void HighlightRecipe(string identifier, Color color) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Reactor.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Reactor.cs index ce3d63e73..ad7d75434 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Reactor.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Reactor.cs @@ -92,10 +92,10 @@ namespace Barotrauma.Items.Components switch (subElement.Name.ToString().ToLowerInvariant()) { case "temperatureboostsoundup": - temperatureBoostSoundUp = RoundSound.Load(subElement, false); + temperatureBoostSoundUp = RoundSound.Load(subElement); break; case "temperatureboostsounddown": - temperatureBoostSoundDown = RoundSound.Load(subElement, false); + temperatureBoostSoundDown = RoundSound.Load(subElement); break; } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Sonar.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Sonar.cs index dc0d6dcbf..9129002e4 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Sonar.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Sonar.cs @@ -1060,6 +1060,7 @@ namespace Barotrauma.Items.Components int missionIndex = 0; foreach (Mission mission in GameMain.GameSession.Missions) { + if (!mission.Prefab.ShowSonarLabels) { continue; } int i = 0; foreach ((LocalizedString label, Vector2 position) in mission.SonarLabels) { @@ -1714,15 +1715,15 @@ namespace Barotrauma.Items.Components foreach (Structure structure in Structure.WallList) { if (structure.Submarine != sub) { continue; } - CreateBlips(structure.IsHorizontal, structure.WorldPosition, structure.WorldRect); + CreateBlips(structure.IsHorizontal, structure.WorldPosition, structure.WorldRect, -structure.RotationWithFlipping); } foreach (var door in Door.DoorList) { if (door.Item.Submarine != sub || door.IsOpen) { continue; } - CreateBlips(door.IsHorizontal, door.Item.WorldPosition, door.Item.WorldRect, BlipType.Door); + CreateBlips(door.IsHorizontal, door.Item.WorldPosition, door.Item.WorldRect, rotation: 0.0f, BlipType.Door); } - void CreateBlips(bool isHorizontal, Vector2 worldPos, Rectangle worldRect, BlipType blipType = BlipType.Default) + void CreateBlips(bool isHorizontal, Vector2 worldPos, Rectangle worldRect, float rotation, BlipType blipType = BlipType.Default) { Vector2 point1, point2; if (isHorizontal) @@ -1735,6 +1736,14 @@ namespace Barotrauma.Items.Components point1 = new Vector2(worldPos.X, worldRect.Y); point2 = new Vector2(worldPos.X, worldRect.Y - worldRect.Height); } + + if (!MathUtils.NearlyEqual(rotation, 0.0f)) + { + float rotationRad = MathHelper.ToRadians(rotation); + point1 = MathUtils.RotatePointAroundTarget(point1, worldPos, rotationRad); + point2 = MathUtils.RotatePointAroundTarget(point2, worldPos, rotationRad); + } + CreateBlipsForLine( point1, point2, diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Steering.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Steering.cs index 931672145..dbfc0a1e8 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Steering.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Machines/Steering.cs @@ -973,6 +973,7 @@ namespace Barotrauma.Items.Components } PosToMaintain += nudgeAmount; } + unsentChanges = true; return true; } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/PowerDistributor.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/PowerDistributor.cs new file mode 100644 index 000000000..91d5f5d0f --- /dev/null +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/PowerDistributor.cs @@ -0,0 +1,180 @@ +#nullable enable +using Barotrauma.Extensions; +using Barotrauma.Networking; +using Microsoft.Xna.Framework; +using System.Collections.Generic; +using System.Linq; + +namespace Barotrauma.Items.Components +{ + internal partial class PowerDistributor : PowerTransfer, IServerSerializable, IClientSerializable + { + private partial class PowerGroup + { + private GUIFrame? frame; + private GUITextBox? nameBox; + private GUIScrollBar? ratioSlider; + private readonly List powerUnitLabels = new List(); + private GUIFrame? divider; + + public bool IsVisible { get; private set; } = true; + + public void CreateGUI() + { + frame = new GUIFrame(new RectTransform(new Vector2(1f, 0.25f), distributor.groupList!.Content.RectTransform, minSize: (0, 130)), style: null); + GUIFrame groupContent = new(new RectTransform(frame.Rect.Size - new Point(10), frame.RectTransform, Anchor.Center), style: null); + + GUILayoutGroup nameGroup = new(new RectTransform(new Vector2(0.65f, 0.33f), groupContent.RectTransform, Anchor.TopLeft), isHorizontal: true, childAnchor: Anchor.CenterLeft) + { + Stretch = true + }; + GUIButton penIcon = new(new RectTransform(new Vector2(0.75f), nameGroup.RectTransform, scaleBasis: ScaleBasis.BothHeight), style: "TextBoxIcon") + { + HoverCursor = CursorState.IBeam, + OnClicked = (_, _) => + { + nameBox!.Select(); + return true; + } + }; + nameBox = new GUITextBox(new RectTransform(Vector2.One, nameGroup.RectTransform), Name, font: GUIStyle.SubHeadingFont, style: "GUITextBoxNoStyle") + { + MaxTextLength = MaxNameLength, + OverflowClip = true, + TextBlock = { ForceUpperCase = ForceUpperCase.No }, + OnEnterPressed = static (textBox, _) => + { + textBox.Deselect(); + return true; + } + }; + nameBox.OnDeselected += (tb, _) => + { + Name = tb.Text; + if (GameMain.Client == null) { return; } + distributor.item.CreateClientEvent(distributor, new EventData(this, EventType.NameChange)); + }; + + GUITextBlock loadDisplay = GUI.CreateDigitalDisplay(new RectTransform(new Vector2(0.35f, 0.33f), groupContent.RectTransform, Anchor.TopRight) { AbsoluteOffset = (5, 0) }, + out GUITextBlock? _, out GUITextBlock loadDisplayUnitLabel, TextManager.Get("PowerTransferLoadLabel"), tooltip: TextManager.Get("PowerTransferTipLoad"), leftLabelFont: GUIStyle.Font); + loadDisplay.TextGetter = () => MathUtils.RoundToInt(Load).ToString(); + + ratioSlider = new GUIScrollBar(new RectTransform(new Vector2(1f, 0.33f), groupContent.RectTransform, Anchor.Center), barSize: 0.15f, style: "DeviceSlider") + { + Step = SupplyRatioStep, + BarScroll = SupplyRatio, + OnMoved = (GUIScrollBar scrollBar, float barScroll) => + { + if (MathUtils.NearlyEqual(barScroll, SupplyRatio)) { return false; } + SupplyRatio = barScroll; + if (GameMain.Client != null) + { + distributor.item.CreateClientEvent(distributor, new EventData(this, EventType.RatioChange)); + distributor.correctionTimer = CorrectionDelay; + } + return true; + } + }; + ratioSlider.Bar.RectTransform.MaxSize = new Point(ratioSlider.Bar.Rect.Height); + + GUITextBlock ratioDisplay = GUI.CreateDigitalDisplay(new RectTransform(new Vector2(0.2f, 0.33f), groupContent.RectTransform, Anchor.BottomLeft), + out GUITextBlock? _, out GUITextBlock _, + rightLabelText: "%"); + ratioDisplay.TextGetter = () => DisplayRatio.ToString(); + + GUITextBlock outputDisplay = GUI.CreateDigitalDisplay(new RectTransform(new Vector2(0.35f, 0.33f), groupContent.RectTransform, Anchor.BottomRight) { AbsoluteOffset = (5, 0) }, + out GUITextBlock? _, out GUITextBlock outputDisplayUnitLabel, + TextManager.Get("powerdistributor.supplylabel"), tooltip: TextManager.Get("PowerTransferTipPower"), leftLabelFont: GUIStyle.Font); + outputDisplay.TextGetter = () => distributor.IsShortCircuited(PowerOut) ? "err" : MathUtils.RoundToInt(distributor.CalculatePowerOut(this)).ToString(); + + powerUnitLabels.Add(loadDisplayUnitLabel); + powerUnitLabels.Add(outputDisplayUnitLabel); + GUITextBlock.AutoScaleAndNormalize(powerUnitLabels); + + divider = new GUIFrame(new RectTransform(Vector2.UnitX, distributor.groupList!.Content.RectTransform), style: "HorizontalLine"); + } + + private void UpdateNameBox() + { + if (nameBox == null || nameBox.Text == DisplayName) { return; } + nameBox.Text = DisplayName?.Value ?? string.Empty; + } + + private void UpdateSlider() + { + if (ratioSlider == null || MathUtils.NearlyEqual(ratioSlider.BarScroll, supplyRatio)) { return; } + ratioSlider.BarScroll = supplyRatio; + } + + public void UpdateGUI() + { + IsVisible = PowerOut.Wires.Count >= 1; + frame!.Visible = IsVisible; + divider!.Visible = IsVisible && distributor.powerGroups.Last(group => group.frame!.Visible) != this; + if (distributor.prevLanguage != GameSettings.CurrentConfig.Language) { GUITextBlock.AutoScaleAndNormalize(powerUnitLabels); } + } + } + + private GUIListBox? groupList; + + private GUITextBlock? noConnectionsText; + + protected override void CreateGUI() + { + if (GuiFrame == null) { return; } + guiContent = new GUILayoutGroup(new RectTransform(GuiFrame.Rect.Size - GUIStyle.ItemFrameMargin, GuiFrame.RectTransform, Anchor.Center) { AbsoluteOffset = GUIStyle.ItemFrameOffset }) + { + Stretch = true + }; + + GUIFrame defaultUIContainer = new(new RectTransform(Vector2.UnitX, guiContent.RectTransform, minSize: (0, 125)), style: null) + { + CanBeFocused = false + }; + CreateDefaultPowerUI(defaultUIContainer); + + groupList = new(new RectTransform(Vector2.One, guiContent.RectTransform)) { Enabled = false }; + noConnectionsText = new GUITextBlock(new RectTransform(new Vector2(0.8f, 0.0f), groupList.Content.RectTransform, Anchor.Center), TextManager.Get("powerdistributor.noconnections"), wrap: true) + { + Visible = false + }; + powerGroups.ForEach(group => group.CreateGUI()); + } + + public override void UpdateHUDComponentSpecific(Character character, float deltaTime, Camera cam) + { + if (GuiFrame == null) { return; } + powerGroups.ForEach(group => group.UpdateGUI()); + noConnectionsText!.Visible = powerGroups.None(group => group.IsVisible); + base.UpdateHUDComponentSpecific(character, deltaTime, cam); + } + + #region Networking + public void ClientEventWrite(IWriteMessage msg, NetEntityEvent.IData? extraData = null) => SharedEventWrite(msg, extraData); + + public void ClientEventRead(IReadMessage msg, float sendingTime) + { + int msgStartPos = msg.BitPosition; + SharedEventRead(msg, out EventType eventType, out PowerGroup powerGroup, out string newName, out float newRatio); + + if (correctionTimer > 0f) + { + int msgBits = msg.BitPosition - msgStartPos; + msg.BitPosition -= msgBits; + StartDelayedCorrection(msg.ExtractBits(msgBits), sendingTime); + return; + } + + switch (eventType) + { + case EventType.NameChange: + powerGroup.Name = newName; + break; + case EventType.RatioChange: + powerGroup.SupplyRatio = newRatio; + break; + } + } + #endregion + } +} diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/PowerTransfer.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/PowerTransfer.cs index cd4053924..128804360 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/PowerTransfer.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/PowerTransfer.cs @@ -6,125 +6,84 @@ namespace Barotrauma.Items.Components { partial class PowerTransfer : Powered { + public override bool RecreateGUIOnResolutionChange => true; + protected GUIComponent guiContent; + private GUITickBox powerIndicator; private GUITickBox highVoltageIndicator; private GUITickBox lowVoltageIndicator; private GUITextBlock powerLabel, loadLabel; + protected GUITextBlock powerDisplay, loadDisplay; - private LanguageIdentifier prevLanguage; + protected LanguageIdentifier prevLanguage; partial void InitProjectSpecific(XElement element) { if (GuiFrame == null) { return; } + CreateGUI(); + prevLanguage = GameSettings.CurrentConfig.Language; + } - var paddedFrame = new GUIFrame(new RectTransform(GuiFrame.Rect.Size - GUIStyle.ItemFrameMargin, GuiFrame.RectTransform, Anchor.Center) { AbsoluteOffset = GUIStyle.ItemFrameOffset }, - style: null) + protected override void CreateGUI() + { + if (GuiFrame == null) { return; } + guiContent = new GUIFrame(new RectTransform(GuiFrame.Rect.Size - GUIStyle.ItemFrameMargin, GuiFrame.RectTransform, Anchor.Center) { AbsoluteOffset = GUIStyle.ItemFrameOffset }, style: null) { CanBeFocused = false }; + CreateDefaultPowerUI(guiContent); + } - var lightsArea = new GUILayoutGroup(new RectTransform(new Vector2(0.4f, 1), paddedFrame.RectTransform, Anchor.CenterLeft)) + protected void CreateDefaultPowerUI(GUIComponent parent) + { + GUILayoutGroup lightsArea = new(new RectTransform(new Vector2(0.4f, 1f), parent.RectTransform, Anchor.CenterLeft)) { Stretch = true }; - powerIndicator = new GUITickBox(new RectTransform(new Vector2(1, 0.33f), lightsArea.RectTransform), - TextManager.Get("PowerTransferPowered"), font: GUIStyle.SubHeadingFont, style: "IndicatorLightGreen") - { - CanBeFocused = false - }; - highVoltageIndicator = new GUITickBox(new RectTransform(new Vector2(1, 0.33f), lightsArea.RectTransform), - TextManager.Get("PowerTransferHighVoltage"), font: GUIStyle.SubHeadingFont, style: "IndicatorLightRed") - { - ToolTip = TextManager.Get("PowerTransferTipOvervoltage"), - Enabled = false - }; - lowVoltageIndicator = new GUITickBox(new RectTransform(new Vector2(1, 0.33f), lightsArea.RectTransform), - TextManager.Get("PowerTransferLowVoltage"), font: GUIStyle.SubHeadingFont, style: "IndicatorLightRed") - { - ToolTip = TextManager.Get("PowerTransferTipLowvoltage"), - Enabled = false - }; - powerIndicator.TextBlock.OverrideTextColor(GUIStyle.TextColorNormal); - highVoltageIndicator.TextBlock.OverrideTextColor(GUIStyle.TextColorNormal); - lowVoltageIndicator.TextBlock.OverrideTextColor(GUIStyle.TextColorNormal); + powerIndicator = GUI.CreateIndicatorLight(new RectTransform(new Vector2(1, 0.33f), lightsArea.RectTransform), + "IndicatorLightGreen", TextManager.Get("PowerTransferPowered")); + highVoltageIndicator = GUI.CreateIndicatorLight(new RectTransform(new Vector2(1, 0.33f), lightsArea.RectTransform), + "IndicatorLightRed", TextManager.Get("PowerTransferHighVoltage"), TextManager.Get("PowerTransferTipOvervoltage")); + lowVoltageIndicator = GUI.CreateIndicatorLight(new RectTransform(new Vector2(1, 0.33f), lightsArea.RectTransform), + "IndicatorLightRed", TextManager.Get("PowerTransferLowVoltage"), TextManager.Get("PowerTransferTipLowvoltage")); GUITextBlock.AutoScaleAndNormalize(powerIndicator.TextBlock, highVoltageIndicator.TextBlock, lowVoltageIndicator.TextBlock); - var textContainer = new GUIFrame(new RectTransform(new Vector2(0.58f, 1.0f), paddedFrame.RectTransform, Anchor.CenterRight), style: null); - var upperTextArea = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.5f), textContainer.RectTransform, Anchor.TopLeft), isHorizontal: true, childAnchor: Anchor.CenterLeft) - { - Stretch = true - }; - var lowerTextArea = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.5f), textContainer.RectTransform, Anchor.BottomLeft), isHorizontal: true, childAnchor: Anchor.CenterLeft) - { - Stretch = true - }; + GUIFrame textContainer = new(new RectTransform(new Vector2(0.58f, 1f), parent.RectTransform, Anchor.CenterRight), style: null); - powerLabel = new GUITextBlock(new RectTransform(new Vector2(0.4f, 1), upperTextArea.RectTransform), - TextManager.Get("PowerTransferPowerLabel"), textColor: GUIStyle.TextColorBright, font: GUIStyle.LargeFont, textAlignment: Alignment.CenterRight) - { - ToolTip = TextManager.Get("PowerTransferTipPower") - }; - loadLabel = new GUITextBlock(new RectTransform(new Vector2(0.4f, 1), lowerTextArea.RectTransform), - TextManager.Get("PowerTransferLoadLabel"), textColor: GUIStyle.TextColorBright, font: GUIStyle.LargeFont, textAlignment: Alignment.CenterRight) - { - ToolTip = TextManager.Get("PowerTransferTipLoad") - }; + powerDisplay = GUI.CreateDigitalDisplay(new RectTransform(new Vector2(1f, 0.5f), textContainer.RectTransform, Anchor.TopLeft), + out powerLabel, out GUITextBlock unitLabel1, TextManager.Get("PowerTransferPowerLabel"), TextManager.Get("kilowatt"), TextManager.Get("PowerTransferTipPower")); - var digitalBackground = new GUIFrame(new RectTransform(new Vector2(0.55f, 0.8f), upperTextArea.RectTransform), style: "DigitalFrameDark"); - var powerText = new GUITextBlock(new RectTransform(new Vector2(0.9f, 0.95f), digitalBackground.RectTransform, Anchor.Center), - "", font: GUIStyle.DigitalFont, textColor: GUIStyle.TextColorDark) + powerDisplay.TextGetter = () => { - TextAlignment = Alignment.CenterRight, - ToolTip = TextManager.Get("PowerTransferTipPower"), - TextGetter = () => { - float currPower = powerLoad < 0 ? -powerLoad: 0; - if (this is not RelayComponent && PowerConnections != null && PowerConnections.Count > 0 && PowerConnections[0].Grid != null) - { - currPower = PowerConnections[0].Grid.Power; - } - return ((int)Math.Round(currPower)).ToString(); - } - }; - var kw1 = new GUITextBlock(new RectTransform(new Vector2(0.15f, 0.5f), upperTextArea.RectTransform), - TextManager.Get("kilowatt"), textColor: GUIStyle.TextColorNormal, font: GUIStyle.Font) - { - Padding = Vector4.Zero, - TextAlignment = Alignment.BottomCenter - }; - - digitalBackground = new GUIFrame(new RectTransform(new Vector2(0.55f, 0.8f), lowerTextArea.RectTransform), style: "DigitalFrameDark"); - var loadText = new GUITextBlock(new RectTransform(new Vector2(0.9f, 0.95f), digitalBackground.RectTransform, Anchor.Center), - "", font: GUIStyle.DigitalFont, textColor: GUIStyle.TextColorDark) - { - TextAlignment = Alignment.CenterRight, - ToolTip = TextManager.Get("PowerTransferTipLoad"), - TextGetter = () => + float currPower = powerLoad < 0 ? -powerLoad : 0; + if (this is not RelayComponent && PowerConnections != null && PowerConnections.Count > 0 && PowerConnections[0].Grid != null) { - float load = PowerLoad; - if (this is RelayComponent relay) - { - load = relay.DisplayLoad; - } - else if (load < 0) - { - load = 0; - } - return ((int)Math.Round(load)).ToString(); + currPower = PowerConnections[0].Grid.Power; } + return MathUtils.RoundToInt(currPower).ToString(); }; - var kw2 = new GUITextBlock(new RectTransform(new Vector2(0.15f, 0.5f), lowerTextArea.RectTransform), - TextManager.Get("kilowatt"), textColor: GUIStyle.TextColorNormal, font: GUIStyle.Font) + + loadDisplay = GUI.CreateDigitalDisplay(new RectTransform(new Vector2(1f, 0.5f), textContainer.RectTransform, Anchor.BottomLeft), + out loadLabel, out GUITextBlock unitLabel2, TextManager.Get("PowerTransferLoadLabel"), TextManager.Get("kilowatt"), TextManager.Get("PowerTransferTipLoad")); + + loadDisplay.TextGetter = () => { - Padding = Vector4.Zero, - TextAlignment = Alignment.BottomCenter + float load = PowerLoad; + if (this is RelayComponent relay) + { + load = relay.DisplayLoad; + } + else if (load < 0) + { + load = 0; + } + return MathUtils.RoundToInt(load).ToString(); }; GUITextBlock.AutoScaleAndNormalize(powerLabel, loadLabel); - GUITextBlock.AutoScaleAndNormalize(true, true, powerText, loadText); - GUITextBlock.AutoScaleAndNormalize(kw1, kw2); - - prevLanguage = GameSettings.CurrentConfig.Language; + GUITextBlock.AutoScaleAndNormalize(true, true, powerDisplay, loadDisplay); + GUITextBlock.AutoScaleAndNormalize(unitLabel1, unitLabel2); } public override void UpdateHUDComponentSpecific(Character character, float deltaTime, Camera cam) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/Powered.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/Powered.cs index ae0b6e456..e52b73182 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/Powered.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Power/Powered.cs @@ -12,7 +12,7 @@ switch (subElement.Name.ToString().ToLowerInvariant()) { case "poweronsound": - powerOnSound = RoundSound.Load(subElement, false); + powerOnSound = RoundSound.Load(subElement); break; } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/RepairTool.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/RepairTool.cs index c7413f039..e0b154569 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/RepairTool.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/RepairTool.cs @@ -4,10 +4,6 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Xml.Linq; namespace Barotrauma.Items.Components { @@ -28,7 +24,7 @@ namespace Barotrauma.Items.Components private readonly List particleEmitterHitCharacter = new List(); private readonly List<(RelatedItem relatedItem, ParticleEmitter emitter)> particleEmitterHitItem = new List<(RelatedItem relatedItem, ParticleEmitter emitter)>(); - private float prevProgressBarState; + private float prevProgressBarState = 1; private Item prevProgressBarTarget = null; partial void InitProjSpecific(ContentXElement element) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Signal/ButtonTerminal.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Signal/ButtonTerminal.cs index bea101f3b..393662631 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Signal/ButtonTerminal.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Signal/ButtonTerminal.cs @@ -1,4 +1,4 @@ -using Barotrauma.Extensions; +using Barotrauma.Extensions; using Barotrauma.Networking; using Microsoft.Xna.Framework; using System; diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Turret.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Turret.cs index 885af0a17..7d29d3928 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Turret.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Components/Turret.cs @@ -150,16 +150,16 @@ namespace Barotrauma.Items.Components crosshairPointerSprite = new Sprite(subElement, path: textureDir); break; case "startmovesound": - startMoveSound = RoundSound.Load(subElement, false); + startMoveSound = RoundSound.Load(subElement); break; case "endmovesound": - endMoveSound = RoundSound.Load(subElement, false); + endMoveSound = RoundSound.Load(subElement); break; case "movesound": - moveSound = RoundSound.Load(subElement, false); + moveSound = RoundSound.Load(subElement); break; case "chargesound": - chargeSound = RoundSound.Load(subElement, false); + chargeSound = RoundSound.Load(subElement); break; case "particleemitter": particleEmitters.Add(new ParticleEmitter(subElement)); diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Inventory.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Inventory.cs index 0c73cf49e..fd2dc5ef0 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Inventory.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Inventory.cs @@ -357,6 +357,18 @@ namespace Barotrauma #if DEBUG toolTip += $" ({item.Prefab.Identifier})"; #endif + if (!item.Prefab.UnlockedRecipeInToolTip.IsEmpty && GameMain.GameSession is { } GameSession) + { + if (GameSession.UnlockedRecipes.Contains(item.Prefab.UnlockedRecipeInToolTip)) + { + toolTip += TextManager.Get("unlockedrecipe.true"); + } + else + { + toolTip += $"\n‖color:{XMLExtensions.ToStringHex(GUIStyle.Yellow)}‖{TextManager.Get("unlockedrecipe.false")}‖color:end‖"; + } + } + if (PlayerInput.KeyDown(InputType.ContextualCommand)) { toolTip += $"\n‖color:gui.blue‖{TextManager.ParseInputTypes(TextManager.Get("itemmsgcontextualorders"))}‖color:end‖"; @@ -365,7 +377,8 @@ namespace Barotrauma { var colorStr = XMLExtensions.ToStringHex(Color.LightGray * 0.7f); toolTip += $"\n‖color:{colorStr}‖{TextManager.Get("itemmsg.morreoptionsavailable")}‖color:end‖"; - } + } + return RichString.Rich(toolTip); } @@ -425,9 +438,9 @@ namespace Barotrauma } } - public Inventory GetReplacementOrThiS() + public Inventory GetReplacementOrThis() { - return ReplacedBy?.GetReplacementOrThiS() ?? this; + return ReplacedBy?.GetReplacementOrThis() ?? this; } public virtual void CreateSlots() @@ -1255,7 +1268,7 @@ namespace Barotrauma container.AllowDragAndDrop && inventory.CanBePut(DraggingItems.FirstOrDefault()); - bool isTargetingValidCharacter = IsValidTargetForDragDropGive(Character.Controlled, Character.Controlled.FocusedCharacter); + bool isTargetingValidCharacter = IsValidTargetForDragDropGive(Character.Controlled, Character.Controlled.FocusedCharacter, DraggingItems); if (DraggingItemToWorld && (isTargetingValidContainer || isTargetingValidCharacter)) { @@ -1418,11 +1431,13 @@ namespace Barotrauma } } - private static bool IsValidTargetForDragDropGive(Character giver, Character receiver) + private static bool IsValidTargetForDragDropGive(Character giver, Character receiver, IEnumerable draggedItems) { - if (giver == null || receiver == null) { return false; } + if (giver == null || receiver == null || draggedItems.None()) { return false; } if (receiver == giver) { return false; } - return receiver.IsInventoryAccessibleTo(giver, IsDragAndDropGiveAllowed ? CharacterInventory.AccessLevel.Allowed : CharacterInventory.AccessLevel.Limited); + return + receiver.IsInventoryAccessibleTo(giver, IsDragAndDropGiveAllowed ? CharacterInventory.AccessLevel.Allowed : CharacterInventory.AccessLevel.Limited) && + receiver.Inventory.CanBePut(draggedItems.FirstOrDefault(), InvSlotType.Any); } private static bool CanSelectSlot(SlotReference selectedSlot) @@ -1651,7 +1666,7 @@ namespace Barotrauma (LocalizedString, Color) GetDragLabelTextAndColor(bool mouseOnHealthInterface) { - bool useDragDropGive = IsValidTargetForDragDropGive(Character.Controlled, Character.Controlled.FocusedCharacter); + bool useDragDropGive = IsValidTargetForDragDropGive(Character.Controlled, Character.Controlled.FocusedCharacter, DraggingItems); Color toolTipColor = Color.LightGreen; diff --git a/Barotrauma/BarotraumaClient/ClientSource/Items/Item.cs b/Barotrauma/BarotraumaClient/ClientSource/Items/Item.cs index e70235e79..7a96851e2 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Items/Item.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Items/Item.cs @@ -316,9 +316,6 @@ namespace Barotrauma if (worldPosition.X + extents.X > worldView.Right || worldPosition.X + extents.Width < worldView.X) { return false; } if (worldPosition.Y + extents.Height < worldView.Y - worldView.Height || worldPosition.Y + extents.Y > worldView.Y) { return false; } - if (extents.Width * Screen.Selected.Cam.Zoom < 1.0f) { return false; } - if (extents.Height * Screen.Selected.Cam.Zoom < 1.0f) { return false; } - return true; } @@ -327,7 +324,7 @@ namespace Barotrauma Draw(spriteBatch, editing, back, overrideColor: null); } - public void Draw(SpriteBatch spriteBatch, bool editing, bool back = true, Color? overrideColor = null) + public void Draw(SpriteBatch spriteBatch, bool editing, bool back = true, Color? overrideColor = null, float? overrideDepth = null) { if (!Visible || (!editing && IsHidden) || !SubEditorScreen.IsLayerVisible(this)) { return; } @@ -395,7 +392,7 @@ namespace Barotrauma } } - float depth = GetDrawDepth(); + float depth = overrideDepth ?? GetDrawDepth(); if (isWiringMode && isLogic && !PlayerInput.IsShiftDown()) { depth = 0.01f; } if (activeSprite != null) { @@ -427,7 +424,7 @@ namespace Barotrauma textureScale: Vector2.One * Scale, depth: d); } - DrawDecorativeSprites(spriteBatch, DrawPosition, flippedX && Prefab.CanSpriteFlipX, flippedY && Prefab.CanSpriteFlipY, rotation: 0, depth, overrideColor); + DrawDecorativeSprites(spriteBatch, DrawPosition, FlippedX && Prefab.CanSpriteFlipX, FlippedY && Prefab.CanSpriteFlipY, rotation: 0, depth, overrideColor); } } else @@ -448,7 +445,7 @@ namespace Barotrauma Prefab.DamagedInfectedSprite?.Draw(spriteBatch, new Vector2(DrawPosition.X, -DrawPosition.Y) + drawOffset, Infector.HealthColor, Prefab.DamagedInfectedSprite.Origin, RotationRad, Scale, activeSprite.effects, depth - 0.002f); } - DrawDecorativeSprites(spriteBatch, DrawPosition, flippedX && Prefab.CanSpriteFlipX, flippedY && Prefab.CanSpriteFlipY, -RotationRad, depth, overrideColor); + DrawDecorativeSprites(spriteBatch, DrawPosition, FlippedX && Prefab.CanSpriteFlipX, FlippedY && Prefab.CanSpriteFlipY, -RotationRad, depth, overrideColor); } } else if (body.Enabled) @@ -524,8 +521,8 @@ namespace Barotrauma if (!spriteAnimState[decorativeSprite].IsActive) { continue; } float rotation = decorativeSprite.GetRotation(ref spriteAnimState[decorativeSprite].RotationState, spriteAnimState[decorativeSprite].RandomRotationFactor); Vector2 offset = decorativeSprite.GetOffset(ref spriteAnimState[decorativeSprite].OffsetState, spriteAnimState[decorativeSprite].RandomOffsetMultiplier, -RotationRad) * Scale; - if (flippedX && Prefab.CanSpriteFlipX) { offset.X = -offset.X; } - if (flippedY && Prefab.CanSpriteFlipY) { offset.Y = -offset.Y; } + if (FlippedX && Prefab.CanSpriteFlipX) { offset.X = -offset.X; } + if (FlippedY && Prefab.CanSpriteFlipY) { offset.Y = -offset.Y; } decorativeSprite.Sprite.Draw(spriteBatch, new Vector2(DrawPosition.X + offset.X, -(DrawPosition.Y + offset.Y)), color, decorativeSprite.Sprite.Origin, rotation, decorativeSprite.GetScale(ref spriteAnimState[decorativeSprite].ScaleState, spriteAnimState[decorativeSprite].RandomScaleFactor) * Scale, activeSprite.effects, depth: depth + (decorativeSprite.Sprite.Depth - activeSprite.Depth)); @@ -543,7 +540,7 @@ namespace Barotrauma //causing them to be removed from the list for (int i = drawableComponents.Count - 1; i >= 0; i--) { - drawableComponents[i].Draw(spriteBatch, editing, depth, overrideColor); + drawableComponents[i].Draw(spriteBatch, editing && !GameMain.SubEditorScreen.TransformWidgetSelected, depth, overrideColor); } if (GameMain.DebugDraw) @@ -813,6 +810,8 @@ namespace Barotrauma } if (Screen.Selected != GameMain.SubEditorScreen) { return; } + if (Character.Controlled == null) { activeHUDs.Clear(); } + if (GameMain.SubEditorScreen.TransformWidgetSelected) { return; } if (GetComponent() is { } discharger) { @@ -826,8 +825,6 @@ namespace Barotrauma } } - if (Character.Controlled == null) { activeHUDs.Clear(); } - foreach (ItemComponent ic in components) { ic.UpdateEditing(deltaTime); @@ -2341,6 +2338,7 @@ namespace Barotrauma } } + bool onInsertedEffectsAppliedOnPreviousRound = msg.ReadBoolean(); byte bodyType = msg.ReadByte(); bool spawnedInOutpost = msg.ReadBoolean(); bool allowStealing = msg.ReadBoolean(); @@ -2453,6 +2451,10 @@ namespace Barotrauma AllowStealing = allowStealing, Quality = quality }; + if (onInsertedEffectsAppliedOnPreviousRound) + { + item.OnInsertedEffectsApplied = item.OnInsertedEffectsAppliedOnPreviousRound = true; + } } catch (Exception e) { diff --git a/Barotrauma/BarotraumaClient/ClientSource/Map/Levels/LevelObjects/LevelObject.cs b/Barotrauma/BarotraumaClient/ClientSource/Map/Levels/LevelObjects/LevelObject.cs index 300427deb..d56efd35b 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Map/Levels/LevelObjects/LevelObject.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Map/Levels/LevelObjects/LevelObject.cs @@ -132,7 +132,7 @@ namespace Barotrauma SoundTriggers = new LevelTrigger[Prefab.Sounds.Count]; for (int i = 0; i < Prefab.Sounds.Count; i++) { - Sounds[i] = RoundSound.Load(Prefab.Sounds[i].SoundElement, false); + Sounds[i] = RoundSound.Load(Prefab.Sounds[i].SoundElement); SoundTriggers[i] = Prefab.Sounds[i].TriggerIndex > -1 ? Triggers[Prefab.Sounds[i].TriggerIndex] : null; } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Map/Lights/LightManager.cs b/Barotrauma/BarotraumaClient/ClientSource/Map/Lights/LightManager.cs index b65723a52..8202240aa 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Map/Lights/LightManager.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Map/Lights/LightManager.cs @@ -714,21 +714,21 @@ namespace Barotrauma.Lights const float MaxOffset = 256.0f; //the magic numbers here are just based on experimentation float MinHorizontalScale = MathHelper.Lerp(3.5f, 1.5f, ObstructVisionAmount); - float MaxHorizontalScale = MinHorizontalScale * 1.25f; + float MaxHorizontalScale = 10.0f; float VerticalScale = MathHelper.Lerp(4.0f, 1.25f, ObstructVisionAmount); - //Starting point and scale-based modifier that moves the point of origin closer to the edge of the texture if the player moves their mouse further away, or vice versa. - float relativeOriginStartPosition = 0.1f; //Increasing this value moves the origin further behind the character - float originStartPosition = visionCircle.Width * relativeOriginStartPosition * MinHorizontalScale; - float relativeOriginLookAtPosModifier = -0.055f; //Increase this value increases how much the vision changes by moving the mouse - float originLookAtPosModifier = visionCircle.Width * relativeOriginLookAtPosModifier; - Vector2 scale = new Vector2( MathHelper.Clamp(losOffset.Length() / MaxOffset, MinHorizontalScale, MaxHorizontalScale), VerticalScale); + //Increasing this value moves the origin further behind the character (current value chosen by experimentation) + float relativeOriginStartPosition = 0.2f; + //Divide by scale to move the origin closer to the edge of the texture, meaning the visible area moves forwards. + //Just stretching the texture without touching the origin would otherwise mean the blurry edge of visibility moves further behind the character (allowing you to see behind you better when looking far away) + float originStartPosition = visionCircle.Width * relativeOriginStartPosition / scale.X; + spriteBatch.Begin(SpriteSortMode.Deferred, transformMatrix: cam.Transform * Matrix.CreateScale(new Vector3(GameSettings.CurrentConfig.Graphics.LightMapScale, GameSettings.CurrentConfig.Graphics.LightMapScale, 1.0f))); spriteBatch.Draw(visionCircle, new Vector2(ViewTarget.WorldPosition.X, -ViewTarget.WorldPosition.Y), null, Color.White, rotation, - new Vector2(originStartPosition + (scale.X * originLookAtPosModifier), visionCircle.Height / 2), scale, SpriteEffects.None, 0.0f); + new Vector2(originStartPosition, visionCircle.Height / 2), scale, SpriteEffects.None, 0.0f); spriteBatch.End(); } else @@ -788,8 +788,8 @@ namespace Barotrauma.Lights if (!convexHull.Intersects(camView)) { continue; } Vector2 relativeViewPos = pos; - if (convexHull.ParentEntity?.Submarine != null) - { + if (convexHull.ParentEntity?.Submarine != null) + { relativeViewPos -= convexHull.ParentEntity.Submarine.DrawPosition; } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Map/Map/Map.cs b/Barotrauma/BarotraumaClient/ClientSource/Map/Map/Map.cs index c2d8b40dc..5fe6c6acf 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Map/Map/Map.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Map/Map/Map.cs @@ -83,6 +83,8 @@ namespace Barotrauma #if DEBUG private GUIComponent editor; + private bool editorEnabled; + private void CreateEditor() { editor = new GUIFrame(new RectTransform(new Vector2(0.25f, 1.0f), GUI.Canvas, Anchor.TopRight, minSize: new Point(400, 0))); @@ -534,8 +536,15 @@ namespace Barotrauma #if DEBUG if (GameMain.DebugDraw) { - if (editor == null) CreateEditor(); - editor.AddToGUIUpdateList(order: 1); + if (editor == null) { CreateEditor(); } + if (editorEnabled) + { + editor.AddToGUIUpdateList(order: 1); + } + if (PlayerInput.KeyHit(Keys.T)) + { + editorEnabled = !editorEnabled; + } } if (PlayerInput.KeyHit(Keys.Space)) @@ -822,7 +831,7 @@ namespace Barotrauma drawRect.X = (int)pos.X - drawRect.Width / 2; drawRect.Y = (int)pos.Y - drawRect.Width / 2; - if (drawRect.X > rect.Right - GUI.IntScale(100) && generationParams.MissionIcon != null && location.AvailableMissions.Any()) + if (drawRect.X > rect.Right - GUI.IntScale(100) && generationParams.MissionIcon != null && location.AvailableAndVisibleMissions.Any(m => m.Prefab.ShowInMenus)) { Vector2 offScreenMissionIconPos = new Vector2(rect.Right - GUI.IntScale(50), drawRect.Center.Y); generationParams.MissionIcon.Draw(spriteBatch, @@ -934,18 +943,19 @@ namespace Barotrauma } if (location != CurrentLocation && generationParams.MissionIcon != null) { - if ((CurrentLocation == currentDisplayLocation && CurrentLocation.AvailableMissions.Any(m => m.Locations.Contains(location))) || - location.AvailableMissions.Any(m => m.Locations[0] == m.Locations[1])) + var currentLocationVisibleMissions = CurrentLocation.AvailableAndVisibleMissions; + if ((CurrentLocation == currentDisplayLocation && currentLocationVisibleMissions.Any(m => m.Locations.Contains(location))) || + location.AvailableAndVisibleMissions.Any(m => m.Locations[0] == m.Locations[1])) { Vector2 missionIconPos = pos + new Vector2(1.35f, 0.35f) * generationParams.LocationIconSize * 0.5f * zoom; generationParams.MissionIcon.Draw(spriteBatch, missionIconPos, generationParams.IndicatorColor, scale: missionIconScale * zoom); if (Vector2.Distance(PlayerInput.MousePosition, missionIconPos) < generationParams.MissionIcon.SourceRect.Width * zoom && IsPreferredTooltip(missionIconPos)) { - var availableMissions = CurrentLocation.AvailableMissions + var allVisibleMissions = currentLocationVisibleMissions .Where(m => m.Locations.Contains(location)) - .Concat(location.AvailableMissions.Where(m => m.Locations[0] == m.Locations[1])) + .Concat(location.AvailableAndVisibleMissions.Where(m => m.Locations[0] == m.Locations[1])) .Distinct(); - tooltip = (new Rectangle(missionIconPos.ToPoint(), new Point(30)), TextManager.Get("mission") + '\n'+ string.Join('\n', availableMissions.Select(m => "- " + m.Name))); + tooltip = (new Rectangle(missionIconPos.ToPoint(), new Point(30)), TextManager.Get("mission") + '\n'+ string.Join('\n', allVisibleMissions.Select(m => "- " + m.Name))); } } } @@ -992,6 +1002,12 @@ namespace Barotrauma spriteBatch.End(); GameMain.Instance.GraphicsDevice.ScissorRectangle = prevScissorRect; spriteBatch.Begin(SpriteSortMode.Deferred, samplerState: GUI.SamplerState, rasterizerState: GameMain.ScissorTestEnable); +#if DEBUG + if (GameMain.DebugDraw) + { + GUI.DrawString(spriteBatch, new Vector2(mapContainer.Center.X, mapContainer.Rect.Y), "Press T to toggle editing map generation parameters.", Color.Magenta, font: GUIStyle.SmallFont); + } +#endif } public static void DrawNoise(SpriteBatch spriteBatch, Rectangle rect, float strength) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Map/MapEntity.cs b/Barotrauma/BarotraumaClient/ClientSource/Map/MapEntity.cs index 38549dddf..f89edd996 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Map/MapEntity.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Map/MapEntity.cs @@ -1159,15 +1159,6 @@ namespace Barotrauma public virtual void DrawEditing(SpriteBatch spriteBatch, Camera cam) { } - private float RotationRad - => MathHelper.ToRadians( - this switch - { - Structure s => s.Rotation, - Item it => it.Rotation, - _ => 0.0f - }); - private Vector2 GetEditingHandlePos(int x, int y, Camera cam) { Vector2 handleDiff = new Vector2(x * (rect.Width * 0.5f), y * (rect.Height * 0.5f)); diff --git a/Barotrauma/BarotraumaClient/ClientSource/Map/RoundSound.cs b/Barotrauma/BarotraumaClient/ClientSource/Map/RoundSound.cs index ac2eeb854..61ca17006 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Map/RoundSound.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Map/RoundSound.cs @@ -29,6 +29,15 @@ namespace Barotrauma Volume = element.GetAttributeFloat("volume", 1.0f); IgnoreMuffling = element.GetAttributeBool("dontmuffle", false); MuteBackgroundMusic = element.GetAttributeBool("MuteBackgroundMusic", false); + + if (!Stream && Sound.DurationSeconds > 60.0f) + { + DebugConsole.AddWarning( + $"Potential issue in content package: a large audio clip \"{System.IO.Path.GetFileName(Filename)}\" is set to be loaded into memory instead of streaming it from the disk. "+ + "This can lead to excessive memory usage. Large clips should generally be streamed, while small and frequently played sounds should be loaded to memory to avoid the IO overhead of streaming. "+ + "Consider adding stream=\"true\" to the sound's XML element.", + contentPackage: element.ContentPackage); + } FrequencyMultiplierRange = new Vector2(1.0f); string freqMultAttr = element.GetAttributeString("frequencymultiplier", element.GetAttributeString("frequency", "1.0")); @@ -61,10 +70,11 @@ namespace Barotrauma private static readonly List roundSounds = new List(); private static readonly Dictionary roundSoundByPath = new Dictionary(); - public static RoundSound? Load(ContentXElement element, bool stream = false) + public static RoundSound? Load(ContentXElement element) { if (GameMain.SoundManager?.Disabled ?? true) { return null; } + bool stream = element.GetAttributeBool(nameof(Stream), false); var filename = element.GetAttributeContentPath("file") ?? element.GetAttributeContentPath("sound"); if (filename is null) { diff --git a/Barotrauma/BarotraumaClient/ClientSource/Map/Structure.cs b/Barotrauma/BarotraumaClient/ClientSource/Map/Structure.cs index f995583ef..a537a930c 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Map/Structure.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Map/Structure.cs @@ -320,8 +320,8 @@ namespace Barotrauma { RectangleF worldRect = Quad2D.FromSubmarineRectangle(WorldRect).Rotated( FlippedX != FlippedY - ? rotationRad - : -rotationRad).BoundingAxisAlignedRectangle; + ? RotationRad + : -RotationRad).BoundingAxisAlignedRectangle; Vector2 worldPos = WorldPosition; Vector2 min = new Vector2(worldRect.X, worldRect.Y); @@ -451,7 +451,7 @@ namespace Barotrauma MathUtils.PositiveModulo(-textureOffset.X, Prefab.BackgroundSprite.SourceRect.Width * TextureScale.X * Scale), MathUtils.PositiveModulo(-textureOffset.Y, Prefab.BackgroundSprite.SourceRect.Height * TextureScale.Y * Scale)); - float rotationRad = GetRotationForSprite(this.rotationRad, Prefab.BackgroundSprite); + float rotationRad = GetRotationForSprite(RotationRad, Prefab.BackgroundSprite); Prefab.BackgroundSprite.DrawTiled( spriteBatch, @@ -484,7 +484,7 @@ namespace Barotrauma if (back == GetRealDepth() > 0.5f) { - Vector2 advanceX = MathUtils.RotatedUnitXRadians(this.rotationRad).FlipY(); + Vector2 advanceX = MathUtils.RotatedUnitXRadians(RotationRad).FlipY(); Vector2 advanceY = advanceX.YX().FlipX(); if (FlippedX != FlippedY) { @@ -492,7 +492,7 @@ namespace Barotrauma advanceY = advanceY.FlipX(); } - float sectionSpriteRotationRad = GetRotationForSprite(this.rotationRad, Prefab.Sprite); + float sectionSpriteRotationRad = GetRotationForSprite(RotationRad, Prefab.Sprite); for (int i = 0; i < Sections.Length; i++) { @@ -558,9 +558,11 @@ namespace Barotrauma foreach (var decorativeSprite in Prefab.DecorativeSprites) { if (!spriteAnimState[decorativeSprite].IsActive) { continue; } - float rotation = decorativeSprite.GetRotation(ref spriteAnimState[decorativeSprite].RotationState, spriteAnimState[decorativeSprite].RandomRotationFactor) + this.rotationRad; + float rotation = decorativeSprite.GetRotation(ref spriteAnimState[decorativeSprite].RotationState, spriteAnimState[decorativeSprite].RandomRotationFactor) + RotationRad; Vector2 offset = decorativeSprite.GetOffset(ref spriteAnimState[decorativeSprite].OffsetState, spriteAnimState[decorativeSprite].RandomOffsetMultiplier) * Scale; - Vector2 drawPos = DrawPosition + MathUtils.RotatePoint(offset, -this.rotationRad); + if (FlippedX && Prefab.CanSpriteFlipX) { offset.X = -offset.X; } + if (FlippedY && Prefab.CanSpriteFlipY) { offset.Y = -offset.Y; } + Vector2 drawPos = DrawPosition + MathUtils.RotatePoint(offset, -this.RotationRad); decorativeSprite.Sprite.Draw( spriteBatch: spriteBatch, pos: drawPos.FlipY(), diff --git a/Barotrauma/BarotraumaClient/ClientSource/Map/Submarine.cs b/Barotrauma/BarotraumaClient/ClientSource/Map/Submarine.cs index be8ac5b7b..aa50745c8 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Map/Submarine.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Map/Submarine.cs @@ -230,30 +230,28 @@ namespace Barotrauma } } - public static void DrawGrid(SpriteBatch spriteBatch, int gridCells, Vector2 gridCenter, Vector2 roundedGridCenter, float alpha = 1.0f) + public static void DrawGrid(SpriteBatch spriteBatch, int gridCells, Vector2 gridCenter, Vector2 roundedGridCenter, float alpha = 1.0f, Color? color = null) { Vector2 topLeft = roundedGridCenter - Vector2.One * GridSize * gridCells / 2; Vector2 bottomRight = roundedGridCenter + Vector2.One * GridSize * gridCells / 2; for (int i = 0; i < gridCells; i++) { - float distFromGridX = (MathUtils.RoundTowardsClosest(gridCenter.X, GridSize.X) - gridCenter.X) / GridSize.X; - float distFromGridY = (MathUtils.RoundTowardsClosest(gridCenter.Y, GridSize.Y) - gridCenter.Y) / GridSize.Y; + float middleIndex = (gridCells - 1) / 2.0f; + float normalizedPos = Math.Abs((i - middleIndex) / middleIndex); + float expandX = MathHelper.Lerp(30.0f, 0.0f, normalizedPos); + float expandY = expandX; - float normalizedDistX = Math.Abs(i + distFromGridX - gridCells / 2) / (gridCells / 2); - float normalizedDistY = Math.Abs(i - distFromGridY - gridCells / 2) / (gridCells / 2); - - float expandX = MathHelper.Lerp(30.0f, 0.0f, normalizedDistY); - float expandY = MathHelper.Lerp(30.0f, 0.0f, normalizedDistX); + Color lineColor = color ?? Color.White; GUI.DrawLine(spriteBatch, new Vector2(topLeft.X - expandX, -bottomRight.Y + i * GridSize.Y), new Vector2(bottomRight.X + expandX, -bottomRight.Y + i * GridSize.Y), - Color.White * (1.0f - normalizedDistY) * alpha, depth: 0.6f, width: 3); + lineColor * (1.0f - normalizedPos) * alpha, depth: 0.6f, width: 3); GUI.DrawLine(spriteBatch, new Vector2(topLeft.X + i * GridSize.X, -topLeft.Y + expandY), new Vector2(topLeft.X + i * GridSize.X, -bottomRight.Y - expandY), - Color.White * (1.0f - normalizedDistX) * alpha, depth: 0.6f, width: 3); + lineColor * (1.0f - normalizedPos) * alpha, depth: 0.6f, width: 3); } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Networking/ChatMessage.cs b/Barotrauma/BarotraumaClient/ClientSource/Networking/ChatMessage.cs index bbf6fa312..03b91b4a7 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Networking/ChatMessage.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Networking/ChatMessage.cs @@ -150,6 +150,9 @@ namespace Barotrauma.Networking styleSetting = msg.ReadString(); txt = TextManager.GetServerMessage(txt).Value; break; + case ChatMessageType.BlockedBySpamFilter: + GameMain.Client.BlockedBySpamFilterTimer = BlockedBySpamFilterTime; + break; } if (NetIdUtils.IdMoreRecent(id, LastID)) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs b/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs index 3f708532b..d8b8c7f54 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Networking/GameClient.cs @@ -104,6 +104,10 @@ namespace Barotrauma.Networking private UInt16 lastQueueChatMsgID = 0; //last message added to the queue private readonly List chatMsgQueue = new List(); + public float BlockedBySpamFilterTimer; + + public bool IsBlockedBySpamFilter => BlockedBySpamFilterTimer > 0.0f; + public UInt16 LastSentEntityEventID; #if DEBUG @@ -479,6 +483,8 @@ namespace Barotrauma.Networking } #endif + BlockedBySpamFilterTimer -= deltaTime; + foreach (Client c in ConnectedClients) { if (c.Character != null && c.Character.Removed) { c.Character = null; } @@ -866,6 +872,10 @@ namespace Barotrauma.Networking case ServerPacketHeader.ACHIEVEMENT: ReadAchievement(inc); break; + case ServerPacketHeader.UNLOCKRECIPE: + Identifier identifier = inc.ReadIdentifier(); + GameMain.GameSession.UnlockRecipe(identifier, showNotifications: true); + break; case ServerPacketHeader.ACHIEVEMENT_STAT: ReadAchievementStat(inc); break; @@ -1067,13 +1077,15 @@ namespace Barotrauma.Networking CloseReconnectBox(); GUI.ClearCursorWait(); + + string disconnectMessage = $"Client received a disconnect message. Reason: {disconnectPacket.DisconnectReason}"; + SteamTimelineManager.OnClientDisconnect(disconnectMessage); if (disconnectPacket.ShouldCreateAnalyticsEvent) { GameAnalyticsManager.AddErrorEventOnce( "GameClient.HandleDisconnectMessage", - GameAnalyticsManager.ErrorSeverity.Debug, - $"Client received a disconnect message. Reason: {disconnectPacket.DisconnectReason}"); + GameAnalyticsManager.ErrorSeverity.Debug, disconnectMessage); } if (disconnectPacket.DisconnectReason == DisconnectReason.ServerFull) @@ -1233,7 +1245,16 @@ namespace Barotrauma.Networking private void OnConnectionInitializationComplete() { - UpdatePresence($"-connect \"{ToolBox.EscapeCharacters(ServerName)}\" {string.Join(",", serverEndpoints.Select(e => e.StringRepresentation))}"); + //don't allow connecting through the friend list if we're connected to localhost (others can't join to "localhost") + //we could potentially find the public IP of the server (assuming it's a public server) from the Steam API, but maybe not worth the trouble? + bool connectedToLocalHost = serverEndpoints.All(e => e is LidgrenEndpoint lidgrenEndpoint && lidgrenEndpoint.Address.IsLocalHost); + string escapedServerName = ServerName.IsNullOrWhiteSpace() ? "Server" : ToolBox.EscapeCharacters(ServerName); + string connectCommand = + connectedToLocalHost ? + string.Empty : + $"-connect \"{escapedServerName}\" {string.Join(",", serverEndpoints.Select(e => e.StringRepresentation))}"; + + UpdatePresence(connectCommand); canStart = true; connected = true; @@ -2148,11 +2169,14 @@ namespace Barotrauma.Networking if (lobbyUpdated) { + //we don't want the client to create any network events + //when they modify the server lobby to match the server state as a result of this message + ServerSettings.SuppressNetworkMessages = true; + var prevDispatcher = GUI.KeyboardDispatcher.Subscriber; UInt16 updateID = inc.ReadUInt16(); - UInt16 settingsLen = inc.ReadUInt16(); byte[] settingsData = inc.ReadBytes(settingsLen); @@ -2297,6 +2321,9 @@ namespace Barotrauma.Networking } lastSentChatMsgID = inc.ReadUInt16(); + + ServerSettings.SuppressNetworkMessages = false; + break; case ServerNetSegment.ClientList: ReadClientList(inc); @@ -3084,6 +3111,7 @@ namespace Barotrauma.Networking public void RequestSelectSub(SubmarineInfo sub, SelectedSubType type) { if (!HasPermission(ClientPermissions.SelectSub) || sub == null) { return; } + if (ServerSettings.SuppressNetworkMessages) { return; } IWriteMessage msg = new WriteOnlyMessage(); msg.WriteByte((byte)ClientPacketHeader.SERVER_COMMAND); @@ -3385,6 +3413,10 @@ namespace Barotrauma.Networking { msgBox = GameMain.NetLobbyScreen.ChatInput; } + if (msgBox != null) + { + msgBox.Enabled = !IsBlockedBySpamFilter; + } UpdateLogButtonVisibility(); diff --git a/Barotrauma/BarotraumaClient/ClientSource/Networking/ServerSettings.cs b/Barotrauma/BarotraumaClient/ClientSource/Networking/ServerSettings.cs index 082170271..a3bc69b81 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Networking/ServerSettings.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Networking/ServerSettings.cs @@ -12,6 +12,8 @@ namespace Barotrauma.Networking private static readonly LocalizedString packetAmountTooltip = TextManager.Get("ServerSettingsMaxPacketAmountTooltip"); private static readonly RichString packetAmountTooltipWarning = RichString.Rich($"{packetAmountTooltip}\n\n‖color:gui.red‖{TextManager.Get("PacketLimitWarning")}‖end‖"); + public static bool SuppressNetworkMessages; + partial class NetPropertyData { public GUIComponent GUIComponent; @@ -94,6 +96,14 @@ namespace Barotrauma.Networking get { if (GUIComponent == null) { return false; } + if (GUIComponent is GUIDropDown dropDown && + dropDown.SelectedIndex == -1) + { + //nothing selected in the dropdown + //it's not possible to select nothing via the UI, which means the client cannot have selected anything locally + //(so this must mean that either nothing has been selected yet or that there's nothing in the dropdown) + return false; + } return !PropEquals(TempValue, GUIComponentValue); } } @@ -238,6 +248,7 @@ namespace Barotrauma.Networking int traitorDangerLevel = 0) { if (!GameMain.Client.HasPermission(Networking.ClientPermissions.ManageSettings)) { return; } + if (SuppressNetworkMessages) { return; } IWriteMessage outMsg = new WriteOnlyMessage(); diff --git a/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/CampaignSetupUI.cs b/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/CampaignSetupUI.cs index cf804cdbf..3dace2bb2 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/CampaignSetupUI.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/CampaignSetupUI.cs @@ -11,6 +11,14 @@ namespace Barotrauma { abstract class CampaignSetupUI { + protected enum SaveSortingType + { + LastPlayedDescending, LastPlayedAscending, + NameDescending, NameAscending + } + + private const SaveSortingType DefaultSaveSortingType = SaveSortingType.LastPlayedDescending; + protected readonly GUIComponent newGameContainer, loadGameContainer; protected GUIListBox saveList; @@ -111,24 +119,54 @@ namespace Barotrauma return saveFrame; } - protected void SortSaveList() + protected void SortSaveList(SaveSortingType sortingType = DefaultSaveSortingType) => saveList?.Content.RectTransform.SortChildren((rect1, rect2) => { - saveList.Content.RectTransform.SortChildren((c1, c2) => + if (rect1.GUIComponent.UserData is not CampaignMode.SaveInfo file1 || rect2.GUIComponent.UserData is not CampaignMode.SaveInfo file2) { return 0; } + if (!file1.SaveTime.TryUnwrap(out SerializableDateTime file1WriteTime) || !file2.SaveTime.TryUnwrap(out SerializableDateTime file2WriteTime)) { return 0; } + return sortingType switch { - if (c1.GUIComponent.UserData is not CampaignMode.SaveInfo file1 - || c2.GUIComponent.UserData is not CampaignMode.SaveInfo file2) - { - return 0; - } + SaveSortingType.LastPlayedDescending => file2WriteTime.CompareTo(file1WriteTime), + SaveSortingType.LastPlayedAscending => file1WriteTime.CompareTo(file2WriteTime), + SaveSortingType.NameDescending => string.Compare(Path.GetFileNameWithoutExtension(file1.FilePath), Path.GetFileNameWithoutExtension(file2.FilePath), StringComparison.OrdinalIgnoreCase), + SaveSortingType.NameAscending => string.Compare(Path.GetFileNameWithoutExtension(file2.FilePath), Path.GetFileNameWithoutExtension(file1.FilePath), StringComparison.OrdinalIgnoreCase), + _ => 0 + }; + }); - if (!file1.SaveTime.TryUnwrap(out var file1WriteTime) - || !file2.SaveTime.TryUnwrap(out var file2WriteTime)) + protected void CreateSaveFilteringHeader(GUIComponent parent) + { + GUILayoutGroup container = new(new RectTransform(Vector2.UnitX, parent.RectTransform), true) { Stretch = true }; + + GUI.CreateFilterBox(new RectTransform(new Vector2(0.6f, 1f), container.RectTransform)).OnTextChanged += (_, filterText) => + { + filterText = filterText.Trim(); + foreach (GUIComponent saveElement in saveList.Content.Children) { - return 0; + if (saveElement.UserData is not CampaignMode.SaveInfo saveInfo) { continue; } + saveElement.Visible = filterText.IsNullOrEmpty() + || Path.GetFileNameWithoutExtension(saveInfo.FilePath).Contains(filterText, StringComparison.OrdinalIgnoreCase); } - - return file2WriteTime.CompareTo(file1WriteTime); - }); + return true; + }; + + SaveSortingType[] sortingTypes = Enum.GetValues(); + GUIDropDown dropDown = new(new RectTransform(new Vector2(0.4f, 1f), container.RectTransform), elementCount: sortingTypes.Length) + { + OnSelected = (_, data) => + { + SortSaveList((SaveSortingType)data); + return true; + } + }; + + foreach (SaveSortingType sortingType in sortingTypes) + { + dropDown.AddItem(TextManager.Get($"SaveSortingType.{sortingType}"), sortingType); + } + + dropDown.SelectItem(DefaultSaveSortingType); + + container.RectTransform.MinSize = (0, container.Children.Max(child => child.Rect.Size.Y)); } public struct CampaignSettingElements diff --git a/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/MultiPlayerCampaignSetupUI.cs b/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/MultiPlayerCampaignSetupUI.cs index 9e2528488..fb0318eae 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/MultiPlayerCampaignSetupUI.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/MultiPlayerCampaignSetupUI.cs @@ -217,6 +217,8 @@ namespace Barotrauma RelativeSpacing = 0.03f }; + CreateSaveFilteringHeader(leftColumn); + saveList = new GUIListBox(new RectTransform(Vector2.One, leftColumn.RectTransform)) { PlaySoundOnSelect = true, diff --git a/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/SinglePlayerCampaignSetupUI.cs b/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/SinglePlayerCampaignSetupUI.cs index 9cd40f9a1..f91c3c158 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/SinglePlayerCampaignSetupUI.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignSetupUI/SinglePlayerCampaignSetupUI.cs @@ -320,14 +320,14 @@ namespace Barotrauma if (string.IsNullOrWhiteSpace(sender.Text)) { characterInfo.Name = characterInfo.GetRandomName(Rand.RandSync.Unsynced); - sender.Text = characterInfo.Name; sender.UserData = "random"; } else { - characterInfo.Name = sender.Text; + characterInfo.Rename(sender.Text); sender.UserData = "user"; } + sender.Text = characterInfo.Name; }; characterName.OnEnterPressed += (sender, text) => { @@ -594,6 +594,8 @@ namespace Barotrauma RelativeSpacing = 0.03f }; + CreateSaveFilteringHeader(leftColumn); + saveList = new GUIListBox(new RectTransform(Vector2.One, leftColumn.RectTransform)) { PlaySoundOnSelect = true, diff --git a/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignUI.cs b/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignUI.cs index 280bc2c7f..6f1f6fb86 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignUI.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Screens/CampaignUI.cs @@ -352,7 +352,7 @@ namespace Barotrauma Location currentDisplayLocation = Campaign.GetCurrentDisplayLocation(); if (connection != null && connection.Locations.Contains(currentDisplayLocation)) { - List availableMissions = currentDisplayLocation.GetMissionsInConnection(connection).ToList(); + List availableMissions = currentDisplayLocation.GetMissionsInConnection(connection).Where(m => m.Prefab.ShowInMenus || GameMain.DebugDraw).ToList(); if (!availableMissions.Any()) { availableMissions.Insert(0, null); } @@ -389,19 +389,26 @@ namespace Barotrauma AbsoluteSpacing = GUI.IntScale(5) }; - var missionName = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), missionTextContent.RectTransform), mission?.Name ?? TextManager.Get("NoMission"), font: GUIStyle.SubHeadingFont, wrap: true); - missionName.RectTransform.MinSize = new Point(0, GUI.IntScale(15)); + LocalizedString missionName = mission?.Name ?? TextManager.Get("NoMission"); + if (GameMain.DebugDraw && mission != null) + { + if (!mission.Prefab.ShowInMenus) { missionName = $"[HIDDEN] {missionName}"; } + missionName += $" ({mission.Prefab.Identifier})"; + } + + var missionNameBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), missionTextContent.RectTransform), missionName, font: GUIStyle.SubHeadingFont, wrap: true); + missionNameBlock.RectTransform.MinSize = new Point(0, GUI.IntScale(15)); if (mission == null) { - missionTextContent.RectTransform.MinSize = missionName.RectTransform.MinSize = new Point(0, GUI.IntScale(35)); + missionTextContent.RectTransform.MinSize = missionNameBlock.RectTransform.MinSize = new Point(0, GUI.IntScale(35)); missionTextContent.ChildAnchor = Anchor.CenterLeft; } else { GUITickBox tickBox = null; - if (!isMissionInNextLocation) + if (!isMissionInNextLocation && mission.Prefab.ShowInMenus) { - tickBox = new GUITickBox(new RectTransform(Vector2.One * 0.9f, missionName.RectTransform, anchor: Anchor.CenterLeft, scaleBasis: ScaleBasis.Smallest) { AbsoluteOffset = new Point((int)missionName.Padding.X, 0) }, label: string.Empty) + tickBox = new GUITickBox(new RectTransform(Vector2.One * 0.9f, missionNameBlock.RectTransform, anchor: Anchor.CenterLeft, scaleBasis: ScaleBasis.Smallest) { AbsoluteOffset = new Point((int)missionNameBlock.Padding.X, 0) }, label: string.Empty) { UserData = mission, Selected = Campaign.Map.CurrentLocation?.SelectedMissions.Contains(mission) ?? false @@ -443,7 +450,7 @@ namespace Barotrauma GUILayoutGroup difficultyIndicatorGroup = null; if (mission.Difficulty.HasValue) { - difficultyIndicatorGroup = new GUILayoutGroup(new RectTransform(new Vector2(0.5f, 0.9f), missionName.RectTransform, anchor: Anchor.CenterRight) { AbsoluteOffset = new Point((int)missionName.Padding.Z, 0) }, + difficultyIndicatorGroup = new GUILayoutGroup(new RectTransform(new Vector2(0.5f, 0.9f), missionNameBlock.RectTransform, anchor: Anchor.CenterRight) { AbsoluteOffset = new Point((int)missionNameBlock.Padding.Z, 0) }, isHorizontal: true, childAnchor: Anchor.CenterRight) { AbsoluteSpacing = 1, @@ -465,11 +472,11 @@ namespace Barotrauma float extraPadding = 0;// 0.8f * tickBox.Rect.Width; float extraZPadding = difficultyIndicatorGroup != null ? mission.Difficulty.Value * (difficultyIndicatorGroup.Children.First().Rect.Width + difficultyIndicatorGroup.AbsoluteSpacing) : 0; - missionName.Padding = new Vector4(missionName.Padding.X + (tickBox?.Rect.Width ?? 0) * 1.2f + extraPadding, - missionName.Padding.Y, - missionName.Padding.Z + extraZPadding + extraPadding, - missionName.Padding.W); - missionName.CalculateHeightFromText(); + missionNameBlock.Padding = new Vector4(missionNameBlock.Padding.X + (tickBox?.Rect.Width ?? 0) * 1.2f + extraPadding, + missionNameBlock.Padding.Y, + missionNameBlock.Padding.Z + extraZPadding + extraPadding, + missionNameBlock.Padding.W); + missionNameBlock.CalculateHeightFromText(); //spacing new GUIFrame(new RectTransform(new Vector2(1.0f, 0.0f), missionTextContent.RectTransform) { MinSize = new Point(0, GUI.IntScale(10)) }, style: null); @@ -544,7 +551,7 @@ namespace Barotrauma OnClicked = (GUIButton btn, object obj) => { if (missionList.Content.FindChild(c => c is GUITickBox tickBox && tickBox.Selected, recursive: true) == null && - missionList.Content.Children.Any(c => c.UserData is Mission mission && mission.Locations.Contains(Campaign?.Map?.CurrentLocation))) + missionList.Content.Children.Any(c => c.UserData is Mission { Prefab.ShowInMenus: true } mission && mission.Locations.Contains(Campaign?.Map?.CurrentLocation))) { var noMissionVerification = new GUIMessageBox(string.Empty, TextManager.Get("nomissionprompt"), new LocalizedString[] { TextManager.Get("yes"), TextManager.Get("no") }); noMissionVerification.Buttons[0].OnClicked = (btn, userdata) => diff --git a/Barotrauma/BarotraumaClient/ClientSource/Screens/LevelEditorScreen.cs b/Barotrauma/BarotraumaClient/ClientSource/Screens/LevelEditorScreen.cs index 2cb36e846..ebd75d00b 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Screens/LevelEditorScreen.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Screens/LevelEditorScreen.cs @@ -482,6 +482,11 @@ namespace Barotrauma public void TestLevelGenerationForErrors(int amountOfLevelsToGenerate) { + if (selectedParams == null) + { + throw new InvalidOperationException("No level generation parameters selected in the level editor."); + } + CoroutineManager.StartCoroutine(GenerateLevels()); IEnumerable GenerateLevels() @@ -520,7 +525,7 @@ namespace Barotrauma errorCatcher.Errors.ToList().ForEach(e => DebugConsole.ThrowError(e.Text)); yield return CoroutineStatus.Success; } - yield return CoroutineStatus.Running; + yield return new WaitForSeconds(0.1f); } } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Screens/NetLobbyScreen.cs b/Barotrauma/BarotraumaClient/ClientSource/Screens/NetLobbyScreen.cs index e871f9430..a2fb9b852 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Screens/NetLobbyScreen.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Screens/NetLobbyScreen.cs @@ -740,6 +740,30 @@ namespace Barotrauma List missionTypes = MissionPrefab.GetAllMultiplayerSelectableMissionTypes().ToList(); + GUILayoutGroup buttonGroup = new(new RectTransform(Vector2.UnitX, missionTypeList.Content.RectTransform), true) { Stretch = true }; + GUIButton selectAllMissionsButton = new(new RectTransform(new Vector2(0.5f, 1f), buttonGroup.RectTransform), TextManager.Get("selectall")) + { + OnClicked = (_, _) => + { + IEnumerable validMissions = GetValidMissions(); + validMissions.ForEach(missionType => GameMain.Client.ServerSettings?.ClientAdminWrite(ServerSettings.NetFlags.Misc, addedMissionType: missionType)); + return true; + } + }; + GUIButton deselectAllMissionsButton = new(new RectTransform(new Vector2(0.5f, 1f), buttonGroup.RectTransform), TextManager.Get("deselectall")) + { + OnClicked = (_, _) => + { + IEnumerable validMissions = GetValidMissions(); + + // The server must have at least one mission selected, so ensure the first in the list is enabled. + GameMain.Client?.ServerSettings.ClientAdminWrite(ServerSettings.NetFlags.Misc, addedMissionType: validMissions.First()); + validMissions.Skip(1).ForEach(missionType => GameMain.Client?.ServerSettings.ClientAdminWrite(ServerSettings.NetFlags.Misc, removedMissionType: missionType)); + return true; + } + }; + buttonGroup.RectTransform.MinSize = (0, buttonGroup.Children.Max(child => child.Rect.Height)); + missionTypeTickBoxes = new GUITickBox[missionTypes.Count]; int index = 0; foreach (var missionType in missionTypes.OrderBy(t => TextManager.Get("MissionType." + t.Value).Value)) @@ -763,6 +787,13 @@ namespace Barotrauma } else { + Identifier firstValidMission = GetValidMissions().First(); + if (missionTypeTickBoxes.None(tickBox => tickBox.Selected && tickBox.Parent.Visible)) + { + GameMain.Client?.ServerSettings.ClientAdminWrite(ServerSettings.NetFlags.Misc, addedMissionType: firstValidMission); + if ((Identifier)tickbox.UserData == firstValidMission) { return true; } + } + GameMain.Client?.ServerSettings.ClientAdminWrite(ServerSettings.NetFlags.Misc, removedMissionType: (Identifier)tickbox.UserData); } return true; @@ -771,9 +802,16 @@ namespace Barotrauma frame.RectTransform.MinSize = missionTypeTickBoxes[index].RectTransform.MinSize; index++; } + + clientDisabledElements.Add(selectAllMissionsButton); + clientDisabledElements.Add(deselectAllMissionsButton); clientDisabledElements.AddRange(missionTypeTickBoxes); return gameModeSpecificFrame; + + IEnumerable GetValidMissions() => missionTypeTickBoxes + .Where(tickBox => tickBox.Parent.Visible) + .Select(tickBox => (Identifier)tickBox.UserData); } private GUIFrame gameModeSettingsContent; @@ -2884,6 +2922,11 @@ namespace Barotrauma UserData = new JobVariant(jobPrefab, variant) }; jobVariantTooltip.RectTransform.AbsoluteOffset = new Point(parentSlot.Rect.Right, parentSlot.Rect.Y); + if (jobVariantTooltip.Rect.X < 0) + { + jobVariantTooltip.RectTransform.SetPosition(anchor: Anchor.TopLeft, pivot: Pivot.BottomLeft); + jobVariantTooltip.RectTransform.AbsoluteOffset = new Point(parentSlot.Rect.X, parentSlot.Rect.Y); + } var content = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 0.95f), jobVariantTooltip.RectTransform, Anchor.Center)) { @@ -3049,6 +3092,8 @@ namespace Barotrauma private void RefreshOutpostDropdown() { + Identifier randomOutpostIdentifier = "Random".ToIdentifier(); + outpostDropdown.Parent.Visible = MissionTypeFrame.Visible; if (!outpostDropdown.Parent.Visible) { return; } @@ -3057,7 +3102,7 @@ namespace Barotrauma Identifier prevSelected = GameMain.NetworkMember?.ServerSettings.SelectedOutpostName ?? Identifier.Empty; outpostDropdown.ClearChildren(); - outpostDropdown.AddItem(TextManager.Get("Random"), "Random".ToIdentifier()); + outpostDropdown.AddItem(TextManager.Get("Random"), randomOutpostIdentifier); HashSet validOutpostTagsForMissions = new HashSet(); IEnumerable suitableMissionClasses = @@ -3081,12 +3126,22 @@ namespace Barotrauma foreach (var submarineInfo in SubmarineInfo.SavedSubmarines.DistinctBy(s => s.Name)) { if (submarineInfo.Type == SubmarineType.Outpost && - validOutpostTagsForMissions.Any(tag => submarineInfo.OutpostTags.Contains(tag))) + validOutpostTagsForMissions.Any(submarineInfo.OutpostTags.Contains)) { outpostDropdown.AddItem(submarineInfo.DisplayName, userData: submarineInfo.Name.ToIdentifier(), toolTip: submarineInfo.Description); } } - outpostDropdown.ListBox.Select(prevSelected); + if (!outpostDropdown.ListBox.Select(prevSelected)) + { + //could not select the previously selected outpost (not suitable for the selected missions) + // -> choose random instead + if (outpostDropdown.SelectedData is Identifier selectedIdentifier && + selectedIdentifier != randomOutpostIdentifier) + { + outpostDropdown.Flash(GUIStyle.Red); + } + outpostDropdown.ListBox.Select(randomOutpostIdentifier); + } GameMain.Client.ServerSettings.AssignGUIComponent(nameof(ServerSettings.SelectedOutpostName), outpostDropdown); } else @@ -4496,26 +4551,16 @@ namespace Barotrauma void PositionJobSelectionFrame() { - JobSelectionFrame.RectTransform.AbsoluteOffset = new Point(characterInfoFrame.Rect.Right - JobSelectionFrame.Rect.Width, characterInfoFrame.Rect.Bottom); - if (characterInfoFrame.Rect.Bottom + JobSelectionFrame.Rect.Height > GameMain.GraphicsHeight) + //move to the left side of the info frame + JobSelectionFrame.RectTransform.AbsoluteOffset = new Point(characterInfoFrame.Rect.X - JobSelectionFrame.Rect.Width, JobList.Rect.Y); + if (JobSelectionFrame.Rect.X < 0) { - //move to the left side of the info frame if the bottom goes below the screen - JobSelectionFrame.RectTransform.AbsoluteOffset = new Point(characterInfoFrame.Rect.X - JobSelectionFrame.Rect.Width, characterInfoFrame.Rect.Bottom - JobSelectionFrame.Rect.Height / 2); - if (JobSelectionFrame.Rect.X < 0) - { - //scale if goes outside the screen horizontally - JobSelectionFrame.RectTransform.Resize(new Point(characterInfoFrame.Rect.X, JobSelectionFrame.Rect.Height)); - JobSelectionFrame.RectTransform.AbsoluteOffset = new Point(characterInfoFrame.Rect.X - JobSelectionFrame.Rect.Width, JobSelectionFrame.RectTransform.AbsoluteOffset.Y); - } - } + //scale if goes outside the screen horizontally + JobSelectionFrame.RectTransform.Resize(new Point(characterInfoFrame.Rect.X, JobSelectionFrame.Rect.Height)); + JobSelectionFrame.RectTransform.AbsoluteOffset = new Point(characterInfoFrame.Rect.X - JobSelectionFrame.Rect.Width, JobSelectionFrame.RectTransform.AbsoluteOffset.Y); + } } - new GUIFrame(new RectTransform(new Vector2(1.25f, 1.25f), JobSelectionFrame.RectTransform, anchor: Anchor.Center), style: "OuterGlow", color: Color.Black) - { - UserData = "outerglow", - CanBeFocused = false - }; - var jobSelectionList = new GUIListBox(new RectTransform(Vector2.One * listBoxRelativeSize, JobSelectionFrame.RectTransform, Anchor.Center), style: "GUIFrameListBox") { Padding = Vector4.One * GUI.IntScale(10) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Screens/SpriteEditorScreen.cs b/Barotrauma/BarotraumaClient/ClientSource/Screens/SpriteEditorScreen.cs index 24fc2ae37..8c9232d06 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Screens/SpriteEditorScreen.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Screens/SpriteEditorScreen.cs @@ -368,6 +368,7 @@ namespace Barotrauma "DecorativeSprite", "BarrelSprite", "RailSprite", + "ChargeSprite", "SchematicSprite", "WeldedSprite" }; diff --git a/Barotrauma/BarotraumaClient/ClientSource/Screens/SubEditorScreen.cs b/Barotrauma/BarotraumaClient/ClientSource/Screens/SubEditorScreen.cs index 3180a795c..cd3420642 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Screens/SubEditorScreen.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Screens/SubEditorScreen.cs @@ -8,6 +8,7 @@ using Microsoft.Xna.Framework.Input; using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Globalization; using System.Linq; using System.Threading; using System.Xml.Linq; @@ -37,6 +38,151 @@ namespace Barotrauma Wiring } + #region Transform Editor + private const float TransformWidgetOffset = 300f; + + private GUITickBox rotateToolToggle, scaleToolToggle; + public bool TransformWidgetSelected => TransformWidget.IsSelected; + + private static Vector2 GetSelectionCenter() + { + IEnumerable nonWireEntities = MapEntity.FilteredSelectedList.Where(static entity => (entity as Item)?.GetComponent() is not { Drawable: true }); + if (nonWireEntities.None()) { return Vector2.Zero; } + + float minX = nonWireEntities.Min(static entity => entity.DrawPosition.X); + float minY = nonWireEntities.Min(static entity => entity.DrawPosition.Y); + float maxX = nonWireEntities.Max(static entity => entity.DrawPosition.X); + float maxY = nonWireEntities.Max(static entity => entity.DrawPosition.Y); + return new Vector2(minX + maxX, minY + maxY) / 2f; + } + + private Vector2 oldWidgetWorldPos; + + public record struct TransformData(float Scale, float RotationRad, Vector2 Pos, Rectangle Rect, Vector2? TexOffset, + Dictionary Nodes, float Width)> Wires, + Dictionary TextScales, + Dictionary LightRanges, + Dictionary TurretLimits); + private TransformToolCommand transformCommand; + + private Widget transformWidget; + private Widget TransformWidget + { + get + { + if (transformWidget != null) { return transformWidget; } + + int size = GUI.IntScale(16f); + transformWidget = new Widget("scale", size, WidgetShape.Rectangle) + { + Enabled = false, + Color = GUIStyle.Yellow, + InputAreaMargin = 20, + RequireMouseOn = false, + TooltipOffset = (size / 2f, -size / 2f), + IsFilled = true + }; + transformWidget.PreUpdate += _ => + { + transformWidget.Enabled = MapEntity.FilteredSelectedList.Any() && (rotateToolToggle.Selected || scaleToolToggle.Selected); + if (transformWidget.IsSelected && PlayerInput.PrimaryMouseButtonReleased()) + { + if (MapEntity.EditingHUD.GetChild() is GUIListBox listBox) + { + SerializableEntityEditor.LockEditing = true; + listBox.Content.Children.OfType().ForEach(editor => editor.RefreshValues()); + SerializableEntityEditor.LockEditing = false; + } + Widget.SelectedWidgets.Remove(transformWidget); + StoreCommand(transformCommand); + transformWidget.Color = Color.Yellow; + } + }; + transformWidget.Selected += () => + { + transformWidget.Color = GUIStyle.Blue; + + IEnumerable containedItems = MapEntity.SelectedList.OfType().SelectManyRecursive(item => item.ContainedItems); + IEnumerable allEntities = MapEntity.SelectedList.Concat(containedItems).Distinct(); + + Dictionary oldTransformData = allEntities.ToDictionary(static entity => entity, static entity => + { + Item item = entity as Item; + Structure structure = entity as Structure; + + float rotation = entity switch + { + Structure => MathHelper.ToRadians(structure.Rotation), + Item => item.RotationRad, + _ => 0f + }; + return new TransformData(entity.Scale, rotation, entity.DrawPosition, entity.Rect, structure?.TextureOffset, + GetPropertyDict, float)>(static wire => (wire.GetNodes(), wire.Width)), + GetPropertyDict(static label => label.TextScale), + GetPropertyDict(static light => light.Range), + GetPropertyDict(static turret => turret.RotationLimits)); + + Dictionary GetPropertyDict(Func propSelector) where TComponent : ItemComponent + => item?.GetComponents().ToDictionary(static comp => comp, propSelector); + }); + + transformCommand = new TransformToolCommand(oldTransformData, GetSelectionCenter()); + }; + transformWidget.MouseHeld += _ => + { + MapEntity.DisableSelect = true; + + Vector2 widgetWorldPos = Cam.ScreenToWorld(transformWidget.DrawPos * 2f); // Scale position to account for camera zooming as well. + if (MathUtils.NearlyEqual(widgetWorldPos, oldWidgetWorldPos)) { return; } + oldWidgetWorldPos = widgetWorldPos; + + transformCommand.RotationRad = null; + LocalizedString rotationString = null; + if (rotateToolToggle.Selected) + { + transformCommand.RotationRad = MathUtils.VectorToAngle(PlayerInput.MousePosition - Cam.WorldToScreen(transformCommand.Pivot)); + rotationString = TextManager.GetWithVariable("SubEditor.TransformWidget.Rotation", "[value]", MathHelper.ToDegrees(transformCommand.RotationRad.Value).ToString("0.000", CultureInfo.CurrentCulture)); + } + + transformCommand.ScaleMult = null; + LocalizedString scaleString = null; + if (scaleToolToggle.Selected) + { + transformCommand.ScaleMult = Math.Clamp(Vector2.Distance(PlayerInput.MousePosition, Cam.WorldToScreen(transformCommand.Pivot)) / (TransformWidgetOffset * GUI.Scale), transformCommand.MinScale, transformCommand.MaxScale); + scaleString = TextManager.GetWithVariable("SubEditor.TransformWidget.Scale", "[value]", transformCommand.ScaleMult.Value.ToString("0.000", CultureInfo.CurrentCulture)); + } + + transformWidget.Tooltip = !rotationString.IsNullOrEmpty() && !scaleString.IsNullOrEmpty() + ? LocalizedString.Join("\n", rotationString, scaleString) + : transformWidget.Tooltip = rotationString ?? scaleString; + + transformCommand.Execute(); + }; + transformWidget.PreDraw += (sb, _) => + { + Vector2 selectionCenterScreenPos = Cam.WorldToScreen(transformWidget.IsSelected ? transformCommand.Pivot : GetSelectionCenter()); + + if (!GameMain.Instance.Paused) + { + if (transformWidget.IsSelected && scaleToolToggle.Selected) + { + transformWidget.DrawPos = PlayerInput.MousePosition; + } + else + { + Vector2 dir = transformWidget.IsSelected ? Vector2.Normalize(PlayerInput.MousePosition - Cam.WorldToScreen(transformCommand.Pivot)) : Vector2.UnitX; + transformWidget.DrawPos = selectionCenterScreenPos + dir * TransformWidgetOffset * GUI.Scale; + } + } + + GUI.DrawLine(sb, selectionCenterScreenPos, transformWidget.DrawPos, Color.Black, width: 7f); + GUI.DrawLine(sb, selectionCenterScreenPos, transformWidget.DrawPos, Color.Red, width: 3f); + }; + return transformWidget; + } + } + #endregion + public enum WarningType { NoWaypoints, @@ -530,6 +676,16 @@ namespace Barotrauma }; spacing = new GUIFrame(new RectTransform(new Vector2(0.02f, 1.0f), paddedTopPanel.RectTransform), style: null); + new GUIFrame(new RectTransform(new Vector2(0.1f, 0.9f), spacing.RectTransform, Anchor.Center), style: "VerticalLine"); + + rotateToolToggle = new GUITickBox(new RectTransform(new Vector2(0.9f), paddedTopPanel.RectTransform, scaleBasis: ScaleBasis.BothHeight), "", style: "SubEditorRotateToggle") + { + ToolTip = TextManager.Get("SubEditor.RotateToggleToolTip") + }; + scaleToolToggle = new GUITickBox(new RectTransform(new Vector2(0.9f), paddedTopPanel.RectTransform, scaleBasis: ScaleBasis.BothHeight), "", style: "SubEditorScaleToggle") + { + ToolTip = TextManager.Get("SubEditor.ScaleToggleToolTip") + }; var selectedLayerText = new GUITextBlock(new RectTransform(new Vector2(0.15f, 1.0f), paddedTopPanel.RectTransform), string.Empty, textAlignment: Alignment.Center); @@ -1099,6 +1255,7 @@ namespace Barotrauma { Submarine.Unload(); GameMain.SubEditorScreen.Select(); + GameMain.GameSession = null; }; } @@ -1449,6 +1606,9 @@ namespace Barotrauma GUI.ForceMouseOn(null); SetMode(Mode.Default); + rotateToolToggle.Selected = false; + scaleToolToggle.Selected = false; + if (backedUpSubInfo != null) { MainSub = new Submarine(backedUpSubInfo); @@ -1658,6 +1818,9 @@ namespace Barotrauma }); ClearFilter(); + + Widget.SelectedWidgets.Remove(TransformWidget); + TransformWidget.Color = Color.Yellow; } private void CreateDummyCharacter() @@ -4634,7 +4797,10 @@ namespace Barotrauma { if (itemPrefab.Name.IsNullOrEmpty() || itemPrefab.HideInMenus || itemPrefab.HideInEditors) { continue; } if (!itemPrefab.Tags.Contains(Tags.WireItem)) { continue; } - if (CircuitBox.IsInGame() && itemPrefab.Tags.Contains(Tags.Thalamus)) { continue; } + if (CircuitBox.IsInGame() && (itemPrefab.Tags.Contains(Tags.Thalamus) || itemPrefab.Tags.Contains("alien"))) + { + continue; + } wirePrefabs.Add(itemPrefab); } @@ -6219,6 +6385,8 @@ namespace Barotrauma CharacterHUD.Update((float)deltaTime, dummyCharacter, cam); } + + TransformWidget.Update((float)deltaTime); } /// @@ -6348,6 +6516,11 @@ namespace Barotrauma } MapEntity.DrawEditor(spriteBatch, cam); + if (TransformWidget.Enabled) + { + TransformWidget.Draw(spriteBatch, (float)deltaTime); + } + GUI.Draw(Cam, spriteBatch); if (MeasurePositionStart != Vector2.Zero) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Social/FriendProviders/SteamFriendProvider.cs b/Barotrauma/BarotraumaClient/ClientSource/Social/FriendProviders/SteamFriendProvider.cs index fa94b7786..dc862bc90 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Social/FriendProviders/SteamFriendProvider.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Social/FriendProviders/SteamFriendProvider.cs @@ -20,7 +20,7 @@ namespace Barotrauma Steamworks.FriendState.Offline => FriendStatus.Offline, Steamworks.FriendState.Invisible => FriendStatus.Offline, _ when steamFriend.IsPlayingThisGame => FriendStatus.PlayingBarotrauma, - _ when steamFriend.GameInfo is { GameID: > 0 } => FriendStatus.PlayingAnotherGame, + _ when steamFriend.GameInfo is { GameID.Value: > 0 } => FriendStatus.PlayingAnotherGame, _ => FriendStatus.NotPlaying }, serverName: steamFriend.GetRichPresence("servername") ?? "", diff --git a/Barotrauma/BarotraumaClient/ClientSource/Sounds/OggSound.cs b/Barotrauma/BarotraumaClient/ClientSource/Sounds/OggSound.cs index 03490b2c3..c8bfd077e 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Sounds/OggSound.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Sounds/OggSound.cs @@ -17,11 +17,15 @@ namespace Barotrauma.Sounds private short[] sampleBuffer = Array.Empty(); private short[] muffleBuffer = Array.Empty(); + + private readonly double durationSeconds; + public override double? DurationSeconds => durationSeconds; + public OggSound(SoundManager owner, string filename, bool stream, ContentXElement xElement) : base(owner, filename, stream, true, xElement) { var reader = new VorbisReader(Filename); - + durationSeconds = reader.TotalTime.TotalSeconds; ALFormat = reader.Channels == 1 ? Al.FormatMono16 : Al.FormatStereo16; SampleRate = reader.SampleRate; diff --git a/Barotrauma/BarotraumaClient/ClientSource/Sounds/Sound.cs b/Barotrauma/BarotraumaClient/ClientSource/Sounds/Sound.cs index fa2f0080b..4da00abf5 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Sounds/Sound.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Sounds/Sound.cs @@ -1,8 +1,6 @@ -using System; -using OpenAL; +using Barotrauma.IO; using Microsoft.Xna.Framework; -using Barotrauma.IO; -using System.Xml.Linq; +using System; namespace Barotrauma.Sounds { @@ -24,6 +22,11 @@ namespace Barotrauma.Sounds public readonly bool StreamsReliably; + /// + /// Length of the audio in seconds. Null if the length is unknown (e.g. a streaming audio source). + /// + public abstract double? DurationSeconds { get; } + public bool Loading { get; protected set; } private readonly SoundManager.SourcePoolIndex sourcePoolIndex = SoundManager.SourcePoolIndex.Default; diff --git a/Barotrauma/BarotraumaClient/ClientSource/Sounds/SoundManager.cs b/Barotrauma/BarotraumaClient/ClientSource/Sounds/SoundManager.cs index 1f2f37dea..0826aa2d3 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Sounds/SoundManager.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Sounds/SoundManager.cs @@ -778,34 +778,36 @@ namespace Barotrauma.Sounds while (!killThread) { killThread = true; - for (int i = 0; i < playingChannels.Length; i++) + for (int sourcePoolIndex = 0; sourcePoolIndex < playingChannels.Length; sourcePoolIndex++) { - lock (playingChannels[i]) + lock (playingChannels[sourcePoolIndex]) { - for (int j = 0; j < playingChannels[i].Length; j++) + for (int channelIndex = 0; channelIndex < playingChannels[sourcePoolIndex].Length; channelIndex++) { - if (playingChannels[i][j] == null) { continue; } - if (playingChannels[i][j].IsStream) + var channel = playingChannels[sourcePoolIndex][channelIndex]; + + if (channel == null) { continue; } + if (channel.FadingOutAndDisposing) { - if (playingChannels[i][j].IsPlaying) + killThread = false; + channel.Gain -= 0.1f; + if (channel.Gain <= 0.0f) + { + channel.Dispose(); + playingChannels[sourcePoolIndex][channelIndex] = null; + } + } + else if (channel.IsStream) + { + if (channel.IsPlaying) { killThread = false; - playingChannels[i][j].UpdateStream(); + channel.UpdateStream(); } else { - playingChannels[i][j].Dispose(); - playingChannels[i][j] = null; - } - } - else if (playingChannels[i][j].FadingOutAndDisposing) - { - killThread = false; - playingChannels[i][j].Gain -= 0.1f; - if (playingChannels[i][j].Gain <= 0.0f) - { - playingChannels[i][j].Dispose(); - playingChannels[i][j] = null; + channel.Dispose(); + playingChannels[sourcePoolIndex][channelIndex] = null; } } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Sounds/SoundPlayer.cs b/Barotrauma/BarotraumaClient/ClientSource/Sounds/SoundPlayer.cs index d8c37f0ff..2dd754738 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Sounds/SoundPlayer.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Sounds/SoundPlayer.cs @@ -868,10 +868,28 @@ namespace Barotrauma if (Level.IsLoadedOutpost) { // Only return music type for location types which have music tracks defined - var locationType = Level.Loaded.StartLocation?.Type?.Identifier; - if (locationType.HasValue && locationType != Identifier.Empty && musicClips.Any(c => c.Type == locationType)) + var locationType = Level.Loaded?.StartLocation?.Type?.Identifier; + var backgroundMusicIdentifier = Level.Loaded?.StartLocation?.Type?.BackgroundMusicLocationType; + + if (MatchesTrack(backgroundMusicIdentifier, out Identifier id) || + MatchesTrack(locationType, out id)) { - return locationType.Value; + return id; + } + + bool MatchesTrack(Identifier? identifier, out Identifier idValue) + { + if (identifier.HasValue && identifier.Value != Identifier.Empty) + { + if (musicClips.Any(clip => clip.Type == identifier.Value)) + { + idValue = identifier.Value; + return true; + } + } + + idValue = Identifier.Empty; + return false; } } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Sounds/VideoSound.cs b/Barotrauma/BarotraumaClient/ClientSource/Sounds/VideoSound.cs index 0e4ca8b1b..11f09193f 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Sounds/VideoSound.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Sounds/VideoSound.cs @@ -1,23 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using OpenAL; +using Barotrauma.Media; using Microsoft.Xna.Framework; -using System.Runtime.InteropServices; -using System.Threading; -using Barotrauma.Media; +using OpenAL; +using System; +using System.Collections.Generic; namespace Barotrauma.Sounds { class VideoSound : Sound { private readonly object mutex; - private Queue sampleQueue; + private readonly Queue sampleQueue; private SoundChannel soundChannel; - private Video video; + private readonly Video video; + + public override double? DurationSeconds => null; public VideoSound(SoundManager owner, string filename, int sampleRate, int channelCount, Video vid) : base(owner, filename, true, false) { diff --git a/Barotrauma/BarotraumaClient/ClientSource/Sounds/VoipSound.cs b/Barotrauma/BarotraumaClient/ClientSource/Sounds/VoipSound.cs index f1e220189..83d1aa6b0 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Sounds/VoipSound.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Sounds/VoipSound.cs @@ -8,6 +8,8 @@ namespace Barotrauma.Sounds { class VoipSound : Sound { + public override double? DurationSeconds => null; + public override SoundManager.SourcePoolIndex SourcePoolIndex { get diff --git a/Barotrauma/BarotraumaClient/ClientSource/Sprite/SpriteSheet.cs b/Barotrauma/BarotraumaClient/ClientSource/Sprite/SpriteSheet.cs index 105bb81bf..a6c027014 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Sprite/SpriteSheet.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Sprite/SpriteSheet.cs @@ -1,4 +1,5 @@ -using Microsoft.Xna.Framework; +using System; +using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Barotrauma @@ -18,5 +19,15 @@ namespace Barotrauma spriteBatch.Draw(texture, pos + offset, sourceRects[MathHelper.Clamp(spriteIndex, 0, sourceRects.Length - 1)], color, rotation + rotate, origin, scale, spriteEffect, depth == null ? this.depth : (float)depth); } + + /// + /// When this spritesheet is used for an animation, returns the current spriteIndex based on the given animation speed. + /// + /// Animation speed in frames per second + /// Should the animation run when paused? Defaults to false. + public int GetAnimatedSpriteIndex(float animationSpeed, bool animatePaused = false) + { + return (int)(Math.Floor((animatePaused ? Timing.TotalTime : Timing.TotalTimeUnpaused) * animationSpeed) % FrameCount); + } } } diff --git a/Barotrauma/BarotraumaClient/ClientSource/StatusEffects/StatusEffect.cs b/Barotrauma/BarotraumaClient/ClientSource/StatusEffects/StatusEffect.cs index 8f022f2e4..fa75a9b59 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/StatusEffects/StatusEffect.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/StatusEffects/StatusEffect.cs @@ -15,7 +15,8 @@ namespace Barotrauma private readonly static HashSet ActiveLoopingSounds = new HashSet(); private static double LastMuffleCheckTime; private readonly List sounds = new List(); - public IEnumerable Sounds { get { return sounds; } } + public IEnumerable Sounds => sounds; + private SoundSelectionMode soundSelectionMode; private SoundChannel soundChannel; private Entity soundEmitter; @@ -64,6 +65,16 @@ namespace Barotrauma partial void ApplyProjSpecific(float deltaTime, Entity entity, IReadOnlyList targets, Hull hull, Vector2 worldPosition, bool playSound) { + if (steamTimeLineEventToTrigger != default) + { + SteamTimelineManager.AddTimelineEvent( + steamTimeLineEventToTrigger.title, + steamTimeLineEventToTrigger.description, + steamTimeLineEventToTrigger.icon, + priority: 1, + submarine: entity?.Submarine); + } + if (playSound) { PlaySound(entity, hull, worldPosition); @@ -222,6 +233,7 @@ namespace Barotrauma { PlaySound(selectedSound); } + playSoundAfterLoadedCoroutine = null; yield return CoroutineStatus.Success; } diff --git a/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamIcons.cs b/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamIcons.cs new file mode 100644 index 000000000..b5acce6b4 --- /dev/null +++ b/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamIcons.cs @@ -0,0 +1,87 @@ +#nullable enable +using System; + +namespace Barotrauma +{ + /// + /// Contains all available Steam timeline event icons as constants and helper methods for number icons. + /// + public static class SteamIcons + { + // Standard icons + public const string Marker = "steam_marker"; + public const string Achievement = "steam_achievement"; + public const string Attack = "steam_attack"; + public const string Bolt = "steam_bolt"; + public const string Bookmark = "steam_bookmark"; + public const string Bug = "steam_bug"; + public const string Cart = "steam_cart"; + public const string Caution = "steam_caution"; + public const string Chat = "steam_chat"; + public const string Checkmark = "steam_checkmark"; + public const string Chest = "steam_chest"; + public const string Circle = "steam_circle"; + public const string Combat = "steam_combat"; + public const string Completed = "steam_completed"; + public const string Crown = "steam_crown"; + public const string Death = "steam_death"; + public const string Defend = "steam_defend"; + public const string Diamond = "steam_diamond"; + public const string Edit = "steam_edit"; + public const string Effect = "steam_effect"; + public const string Explosion = "steam_explosion"; + public const string Fix = "steam_fix"; + public const string Flag = "steam_flag"; + public const string Gem = "steam_gem"; + public const string Group = "steam_group"; + public const string Heart = "steam_heart"; + public const string Info = "steam_info"; + public const string Invalid = "steam_invalid"; + public const string Minus = "steam_minus"; + public const string Pair = "steam_pair"; + public const string Person = "steam_person"; + public const string Plus = "steam_plus"; + public const string Purchase = "steam_purchase"; + public const string Question = "steam_question"; + public const string Ribbon = "steam_ribbon"; + public const string Screenshot = "steam_screenshot"; + public const string Scroll = "steam_scroll"; + public const string Square = "steam_square"; + public const string Star = "steam_star"; + public const string Starburst = "steam_starburst"; + public const string Timer = "steam_timer"; + public const string Transfer = "steam_transfer"; + public const string Triangle = "steam_triangle"; + public const string Trophy = "steam_trophy"; + public const string View = "steam_view"; + public const string X = "steam_x"; + + // Common number icons + public const string Zero = "steam_0"; + public const string One = "steam_1"; + public const string Two = "steam_2"; + public const string Three = "steam_3"; + public const string Four = "steam_4"; + public const string Five = "steam_5"; + public const string Six = "steam_6"; + public const string Seven = "steam_7"; + public const string Eight = "steam_8"; + public const string Nine = "steam_9"; + public const string Ten = "steam_10"; + + /// + /// Gets the Steam icon name for a number between 0 and 99. + /// + /// The number to get the icon for (0-99) + /// The Steam icon name in the format "steam_X" + /// Thrown when the number is less than 0 or greater than 99 + public static string GetNumberIcon(int number) + { + if (number is < 0 or > 99) + { + throw new ArgumentOutOfRangeException(nameof(number), "Number must be between 0 and 99"); + } + return $"steam_{number}"; + } + } +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamManager.cs b/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamManager.cs index 875369abc..07ea8956f 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamManager.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamManager.cs @@ -92,6 +92,8 @@ namespace Barotrauma.Steam //Maybe I'm completely wrong! All I know is that we need to handle both! } + + SteamTimelineManager.Initialize(); } public static bool NetworkingDebugLog { get; private set; } = false; diff --git a/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamTimelineManager.cs b/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamTimelineManager.cs new file mode 100644 index 000000000..0558488f1 --- /dev/null +++ b/Barotrauma/BarotraumaClient/ClientSource/Steam/SteamTimelineManager.cs @@ -0,0 +1,345 @@ +#nullable enable +using Barotrauma.Steam; +using System; +using System.Collections.Generic; +using System.Linq; +using Steamworks.Data; +using Steamworks; + +namespace Barotrauma +{ + internal static class SteamTimelineManager + { + private static Screen? prevScreen; + private static TimelineGameMode gameMode = TimelineGameMode.LoadingScreen; + /// + /// The current submarine that the controlled character is in (and has been for at least the delay amount). + /// + private static Submarine? currentSubmarine = null; + /// + /// For tracking the instantaneous switch of submarines, to reset the delay timer + /// + private static Submarine? previousTrackedSubmarine; + private static Character? trackedCharacter = null; + + /// + /// Delay in seconds before the submarine state change is considered valid, triggering events. + /// + private const float SubmarineStateChangeDelay = 2.0f; + private static float submarineStateChangeTimer = 0.0f; + + public enum TimelineGameMode + { + Playing, + Staging, + Menus, + LoadingScreen + } + + public static void Initialize() + { + SetTimelineGameMode(TimelineGameMode.LoadingScreen); + } + + public static void Update(float deltaTime) + { + PollScreenChange(); + PollCharacterChange(deltaTime); + PollSubmarineChange(deltaTime); + } + + private static void PollScreenChange() + { + if (!SteamManager.IsInitialized) { return; } + if (Screen.Selected == prevScreen) { return; } + + TimelineGameMode newMode = Screen.Selected switch + { + GameScreen _ => TimelineGameMode.Playing, + NetLobbyScreen _ => TimelineGameMode.Staging, + EditorScreen _ => TimelineGameMode.Playing, + MainMenuScreen _ => TimelineGameMode.Menus, + _ => TimelineGameMode.LoadingScreen // Default to Menus for other screens for now + }; + + if (GameMain.Instance != null && GameMain.Instance.LoadingScreenOpen) + { + newMode = TimelineGameMode.LoadingScreen; + } + + if (newMode == gameMode) { return; } + + SetTimelineGameMode(newMode); + gameMode = newMode; + + DebugConsole.NewMessage($"Timeline game mode set to {newMode}"); + + prevScreen = Screen.Selected; + } + + private static void PollCharacterChange(float deltaTime) + { + Character? controlledCharacter = Character.Controlled; + + // reset current sub state if character changes + if (controlledCharacter != trackedCharacter) + { + InstantlySetCurrentSubmarine(controlledCharacter?.Submarine ?? null); + trackedCharacter = controlledCharacter; + } + } + + private static void PollSubmarineChange(float deltaTime) + { + if (!SteamManager.IsInitialized) { return; } + if (trackedCharacter == null) { return; } + if (Screen.Selected is not GameScreen) { return; } + + Submarine? trackedCharacterSubmarine = trackedCharacter.Submarine; + + // timer makes sure only time-stable state changes are registered + if (submarineStateChangeTimer > 0f) + { + submarineStateChangeTimer -= deltaTime; + + if (submarineStateChangeTimer <= 0f) + { + // actually register our pending state change + CharacterSubChanged(trackedCharacter, trackedCharacterSubmarine); + } + } + + // detect instantaneous submarine change and start the delay timer + if (previousTrackedSubmarine != trackedCharacterSubmarine) + { + submarineStateChangeTimer = SubmarineStateChangeDelay; + } + previousTrackedSubmarine = trackedCharacterSubmarine; + } + + private static void InstantlySetCurrentSubmarine(Submarine? submarine) + { + currentSubmarine = submarine; + previousTrackedSubmarine = submarine; + submarineStateChangeTimer = 0f; + } + + private static void CharacterSubChanged(Character character, Submarine newSubmarine) + { + if (newSubmarine == currentSubmarine) { return; } + + // currentSub to none + if (currentSubmarine != null && newSubmarine == null) + { + OnCharacterLeftSubmarine(character, currentSubmarine); + } + // currentSub to newSub + else if (currentSubmarine != null && newSubmarine != null) + { + OnCharacterMovedBetweenSubmarines(character, currentSubmarine, newSubmarine); + } + //none to newSub + else if (currentSubmarine == null && newSubmarine != null) + { + OnCharacterEnteredSubmarine(character, newSubmarine); + } + + currentSubmarine = newSubmarine; + } + + public static void SetTimelineGameMode(TimelineGameMode mode) + { + if (!SteamManager.IsInitialized) { return; } + + Steamworks.TimelineGameMode steamMode = mode switch + { + TimelineGameMode.Playing => Steamworks.TimelineGameMode.Playing, + TimelineGameMode.Staging => Steamworks.TimelineGameMode.Staging, + TimelineGameMode.Menus => Steamworks.TimelineGameMode.Menus, + TimelineGameMode.LoadingScreen => Steamworks.TimelineGameMode.LoadingScreen, + _ => throw new ArgumentOutOfRangeException(nameof(mode), mode, message: null) + }; + + try + { + SteamTimeline.SetTimelineGameMode(steamMode); + } + catch (Exception e) + { + DebugConsole.ThrowError($"Failed to set timeline game mode to {mode}", e); + } + } + + public static void OnPlayerDied(Character victim, CauseOfDeath causeOfDeath) + { + if (victim == null || causeOfDeath == null) { return; } + + string eventTitle = $"{victim.DisplayName} died"; + string causeOfDeathText = causeOfDeath.Affliction != null ? + causeOfDeath.Affliction.CauseOfDeathDescription.Value : + causeOfDeath.Type.ToString(); + string eventDescription = $"{victim.DisplayName} died: {causeOfDeathText}"; + + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Death, 1); + } + + public static void OnSignificantEnemyDied(Character victim, CauseOfDeath causeOfDeath) + { + string eventTitle = $"{victim.DisplayName} has died!"; + string causeOfDeathText = causeOfDeath.Affliction != null ? + causeOfDeath.Affliction.CauseOfDeathDescription.Value : + causeOfDeath.Type.ToString(); + string eventDescription = $"{victim.DisplayName} died: {causeOfDeathText}"; + if (causeOfDeath.Killer != null) + { + eventDescription = $"{victim.DisplayName} was killed by {causeOfDeath.Killer.DisplayName}"; + } + + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Attack, 2); + } + + public static void OnRoundStarted() + { + string eventTitle = "Round Started"; + string eventDescription = "The round has started"; + + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Marker, 0); + } + + public static void OnRoundEnded() + { + string eventTitle = "Round Ended"; + string eventDescription = "The round has ended"; + + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Completed, 0); + } + + public static void OnCharacterLeftSubmarine(Character character, Submarine submarine) + { + string eventTitle = $"{character.Name} Went Diving Outside"; + string eventDescription = $"{character.Name} left {submarine.Info.Name}"; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Transfer, 1); + } + + public static void OnCharacterMovedBetweenSubmarines(Character character, Submarine oldSubmarine, Submarine newSubmarine) + { + string eventTitle = $"{character.Name} Moved Between Locations"; + string eventDescription = $"{character.Name} moved from {oldSubmarine.Info.Name} to {newSubmarine.Info.Name}"; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Transfer, 1); + } + + public static void OnCharacterEnteredSubmarine(Character character, Submarine submarine) + { + string eventTitle = $"{character.Name} Entered Hull"; + string eventDescription = $"{character.Name} has entered {submarine.Info.Name}"; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Transfer, 1); + } + + public static void OnError(string errorMessage, Exception? e = null) + { + // these don't have localization support yet, use hardcoded strings + string eventTitle = "Error Occurred"; + string eventDescription = $"An error was logged: {errorMessage}"; + if (e != null) { eventDescription += $"\n{e.GetType().Name}"; } + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Bug, 3); // Higher priority for errors + } + + public static void OnClientDisconnect(string disconnectInfo) + { + // these don't have localization support yet, use hardcoded strings + string eventTitle = $"Client Disconnected"; + string eventDescription = $"{disconnectInfo}"; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Bug, 2); // Maybe slightly lower priority than code errors + } + + public static void OnMonsterMissionTargetsKilled(MonsterMission mission) + { + // these don't have localization support yet, use hardcoded strings + string eventTitle = $"Monsters Dispatched"; + string eventDescription = $"{mission.Name}: All targets were eliminated."; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Attack, 2); + } + + public static void OnScanSuccessful(ScanMission mission) + { + // these don't have localization support yet, use hardcoded strings + string eventTitle = "Scan Successful"; + string eventDescription = $"{mission.Name}: A scanner has successfully scanned a target."; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Marker, 1); + } + + public static void OnOutpostTargetEliminated(AbandonedOutpostMission mission) + { + // these don't have localization support yet, use hardcoded strings + string eventTitle = $"Target Character Eliminated"; + string eventDescription = $"{mission.Name}: A target was eliminated."; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Attack, 2); + } + + /// + /// How often can hull breach events be created? There's often multiple breaches very close to each other, not necessary to track all of them. + /// + const float HullBreachEventInterval = 10.0f; + private static double LastHullBreachTime; + + public static void OnHullBreached(Structure structure) + { + if (LastHullBreachTime > Timing.TotalTime - HullBreachEventInterval) { return; } + // only trigger this event for player subs, since beacon stations can fill the requirements at level start + if (structure.Submarine?.Info is not { IsPlayer: true }) { return; } + + string eventTitle = "Major Hull Breach"; + string eventDescription = $"The hull of {structure.Submarine?.Info.Name ?? "Unknown Submarine"} suffered a major breach."; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Caution, 2); + LastHullBreachTime = Timing.TotalTime; + } + + public static void OnMissionTargetRetrieved(Item item, Mission mission) + { + string eventTitle = $"Target Retrieved: {item.Name}"; + string eventDescription = $"{mission.Name}: A target item {item.Name} was retrieved."; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Checkmark, 1); + } + + public static void OnMissionTargetPickedUp(Item item, Mission mission) + { + string eventTitle = $"Target Picked Up: {item.Name}"; + string eventDescription = $"{mission.Name}: A target item {item.Name} was picked up."; + AddTimelineEvent(eventTitle, eventDescription, SteamIcons.Checkmark, 1); + } + + public static void AddTimelineEvent(string title, string description, string icon, uint priority = 1, Submarine? submarine = null) + { + if (!SteamManager.IsInitialized) { return; } + + // exit early if title, description or icon is empty + if (string.IsNullOrWhiteSpace(title) || string.IsNullOrWhiteSpace(description) || string.IsNullOrWhiteSpace(icon)) + { + DebugConsole.ThrowError("Failed to add timeline event: title, description or icon is empty"); + return; + } + + if (submarine != null) + { + string submarineName = submarine.Info?.DisplayName.Value ?? "Unknown Submarine"; + title = title.Replace("[sub]", submarineName); + description = description.Replace("[sub]", submarineName); + } + + try + { + var eventHandle = Steamworks.SteamTimeline.AddInstantaneousTimelineEvent( + title, + description, + icon, + priority, + 0.0f, + Steamworks.TimelineEventClipPriority.Standard); + } + catch (Exception e) + { + DebugConsole.ThrowError($"Failed to add timeline event", e); + } + } + } +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaClient/ClientSource/Steam/WorkshopMenu/Mutable/InstalledTab.cs b/Barotrauma/BarotraumaClient/ClientSource/Steam/WorkshopMenu/Mutable/InstalledTab.cs index 1b617aa07..20383db55 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Steam/WorkshopMenu/Mutable/InstalledTab.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Steam/WorkshopMenu/Mutable/InstalledTab.cs @@ -727,7 +727,9 @@ namespace Barotrauma.Steam } if (selectedMods.All(ContentPackageManager.WorkshopPackages.Contains)) { - if (parentList.AllSelected.All(c => c.GetChild()?.GetAllChildren().Last()?.Style?.Identifier == "WorkshopMenu.DownloadedIcon") && selectedMods.Length > 0 && SteamManager.IsInitialized) + static Identifier? GetButtonIconStyle(GUIComponent c) => c.GetChild()?.GetAllChildren().Last()?.Style?.Identifier; + if (parentList.AllSelected.All(c => GetButtonIconStyle(c) is { } style && (style == "WorkshopMenu.DownloadedIcon" || style == "WorkshopMenu.InfoButtonUpdate")) && + selectedMods.Length > 0 && SteamManager.IsInitialized) { contextMenuOptions.Add(new((selectedMods.Length > 1 ? "UnsubscribeFromAllSelected" : "WorkshopItemUnsubscribe").ToIdentifier(), true, () => { @@ -774,8 +776,7 @@ namespace Barotrauma.Steam return true; } }; - msgBox.Buttons[0].OnClicked += msgBox.Close; - msgBox.Buttons[1].OnClicked += (_, _) => + msgBox.Buttons[0].OnClicked += (_, _) => { if (textBox.Text == mod.Name) { @@ -794,6 +795,7 @@ namespace Barotrauma.Steam return false; } }; + msgBox.Buttons[1].OnClicked += msgBox.Close; } void CopyToLocal() { diff --git a/Barotrauma/BarotraumaClient/ClientSource/Steam/WorkshopMenu/Mutable/PublishTab.cs b/Barotrauma/BarotraumaClient/ClientSource/Steam/WorkshopMenu/Mutable/PublishTab.cs index b2f6731d2..e4b91f5bc 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Steam/WorkshopMenu/Mutable/PublishTab.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Steam/WorkshopMenu/Mutable/PublishTab.cs @@ -10,6 +10,7 @@ using Barotrauma.IO; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Steamworks; +using Steamworks.Ugc; using Directory = Barotrauma.IO.Directory; using ItemOrPackage = Barotrauma.Either; using Path = Barotrauma.IO.Path; @@ -335,9 +336,10 @@ namespace Barotrauma.Steam .WithTags(tagButtons.Where(kvp => kvp.Value.Selected).Select(kvp => kvp.Key.Value)) .WithChangeLog(changeNoteTextBox.Text) .WithMetaData($"gameversion={localPackage.GameVersion};modversion={versionTextBox.Text}") - .WithVisibility(visibility) .WithPreviewFile(thumbnailPath); + ugcEditor.Visibility = visibility; + CoroutineManager.StartCoroutine( MessageBoxCoroutine((currentStepText, messageBox) => PublishItem(currentStepText, messageBox, versionTextBox.Text, ugcEditor, localPackage))); diff --git a/Barotrauma/BarotraumaClient/ClientSource/SubEditorCommands.cs b/Barotrauma/BarotraumaClient/ClientSource/SubEditorCommands.cs index b47221c6d..b313d6008 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/SubEditorCommands.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/SubEditorCommands.cs @@ -4,6 +4,7 @@ using System.Collections.Immutable; using System.Diagnostics; using System.Linq; using System.Xml.Linq; +using Barotrauma.Extensions; using Barotrauma.Items.Components; using Microsoft.Xna.Framework; @@ -298,7 +299,7 @@ namespace Barotrauma case null: continue; case ItemContainer { Inventory: not null } newContainer when ic is ItemContainer { Inventory: not null } itemContainer: - itemContainer.Inventory.GetReplacementOrThiS().ReplacedBy = newContainer.Inventory; + itemContainer.Inventory.GetReplacementOrThis().ReplacedBy = newContainer.Inventory; goto default; default: ic.GetReplacementOrThis().ReplacedBy = component; @@ -321,7 +322,7 @@ namespace Barotrauma { if (slotRef.Item == receiver) { - inventory.GetReplacementOrThiS().TryPutItem(it, slotRef.Slot, false, false, null, createNetworkEvent: false); + inventory.GetReplacementOrThis().TryPutItem(it, slotRef.Slot, false, false, null, createNetworkEvent: false); } } } @@ -416,7 +417,7 @@ namespace Barotrauma } else { - Inventory.GetReplacementOrThiS().TryPutItem(item, slot, false, false, null, createNetworkEvent: false); + Inventory.GetReplacementOrThis().TryPutItem(item, slot, false, false, null, createNetworkEvent: false); } } } @@ -609,7 +610,7 @@ namespace Barotrauma { if (targetItem.GetReplacementOrThis() is Item item) { - newInventory?.GetReplacementOrThiS().TryPutItem(item, newSlot, true, false, null, createNetworkEvent: false); + newInventory?.GetReplacementOrThis().TryPutItem(item, newSlot, true, false, null, createNetworkEvent: false); } } @@ -617,7 +618,7 @@ namespace Barotrauma { if (targetItem.GetReplacementOrThis() is Item item) { - oldInventory?.GetReplacementOrThiS().TryPutItem(item, oldSlot, true, false, null, createNetworkEvent: false); + oldInventory?.GetReplacementOrThis().TryPutItem(item, oldSlot, true, false, null, createNetworkEvent: false); } } @@ -628,4 +629,86 @@ namespace Barotrauma return TextManager.GetWithVariable("Undo.MovedItem", "[item]", targetItem.Name); } } + + /// + /// A command for applying changes from the . + /// + internal class TransformToolCommand : Command + { + private readonly Dictionary originalData; + public float? ScaleMult, RotationRad; + public readonly Vector2 Pivot; + private readonly Vector2 wirePivot; + public float MinScale, MaxScale; + + public TransformToolCommand(Dictionary data, Vector2 pivot) + { + originalData = data; + Pivot = pivot; + wirePivot = Pivot - Submarine.MainSub.HiddenSubPosition; + + MinScale = 0.01f / Math.Max(data.Values.Min(data => data.Scale), 0.01f); + MaxScale = 10f / Math.Min(data.Values.Max(data => data.Scale), 10f); + } + + public override void Execute() => UpdateTransforms(RotationRad ?? 0f, ScaleMult ?? 1f); + public override void UnExecute() => UpdateTransforms(0f, 1f); + + public override void Cleanup() => originalData.Clear(); + + private void UpdateTransforms(float rotationRad, float scaleMult) + { + foreach ((MapEntity receiver, SubEditorScreen.TransformData data) in originalData) + { + if (RotationRad.HasValue && receiver is Item { Prefab.AllowRotatingInEditor: true } or Structure { Prefab.AllowRotatingInEditor: true }) + { + int rotationDir = receiver is Structure && receiver.FlippedX ^ receiver.FlippedY ? -1 : 1; + float newRotation = MathHelper.ToDegrees(data.RotationRad + rotationRad * rotationDir); + switch (receiver) + { + case Item item: + item.Rotation = newRotation; + break; + case Structure structure: + structure.Rotation = newRotation; + break; + } + data.TurretLimits?.ForEach(pair => pair.Key.RotationLimits = pair.Value + new Vector2(MathHelper.ToDegrees(rotationRad))); + } + + if (ScaleMult.HasValue) + { + receiver.Scale = data.Scale * scaleMult; + if (receiver.ResizeVertical || receiver.ResizeHorizontal) + { + if (receiver.ResizeVertical) + { + receiver.RectHeight = (int)(data.Rect.Height * scaleMult); + } + if (receiver.ResizeHorizontal) + { + receiver.RectWidth = (int)(data.Rect.Width * scaleMult); + } + if (receiver is Structure structure && data.TexOffset.HasValue) + { + structure.TextureOffset = data.TexOffset.Value * scaleMult; + } + } + data.TextScales?.ForEach(pair => pair.Key.TextScale = pair.Value * scaleMult); + data.LightRanges?.ForEach(pair => pair.Key.Range = pair.Value * scaleMult); + data.Wires?.ForEach(pair => pair.Key.Width = pair.Value.Width * scaleMult); + } + + Vector2 newEntityPos = MathUtils.RotatePoint((data.Pos - Pivot) * scaleMult, -rotationRad) + Pivot; + receiver.Move(newEntityPos - receiver.DrawPosition); + + data.Wires?.ForEach(pair => pair.Key.SetNodes(pair.Value.Nodes.Select(TransformWireNode))); + Vector2 TransformWireNode(Vector2 node) => MathUtils.RotatePoint((node - wirePivot) * scaleMult, -rotationRad) + wirePivot; + } + } + + public override LocalizedString GetDescription() => originalData.Count > 1 + ? TextManager.GetWithVariable("Undo.ChangedTransformMultiple", "[amount]", originalData.Count.ToString()) + : TextManager.GetWithVariable("Undo.ChangedTransform", "[item]", originalData.First().Key.Name); + } } \ No newline at end of file diff --git a/Barotrauma/BarotraumaClient/LinuxClient.csproj b/Barotrauma/BarotraumaClient/LinuxClient.csproj index 57c513e64..f3a101296 100644 --- a/Barotrauma/BarotraumaClient/LinuxClient.csproj +++ b/Barotrauma/BarotraumaClient/LinuxClient.csproj @@ -2,11 +2,11 @@ WinExe - net6.0 + net8.0 Barotrauma FakeFish, Undertow Games Barotrauma - 1.8.8.1 + 1.9.7.0 Copyright © FakeFish 2018-2024 AnyCPU;x64 Barotrauma diff --git a/Barotrauma/BarotraumaClient/MacClient.csproj b/Barotrauma/BarotraumaClient/MacClient.csproj index 8d6d1ec3e..8843b53ed 100644 --- a/Barotrauma/BarotraumaClient/MacClient.csproj +++ b/Barotrauma/BarotraumaClient/MacClient.csproj @@ -2,11 +2,11 @@ WinExe - net6.0 + net8.0 Barotrauma FakeFish, Undertow Games Barotrauma - 1.8.8.1 + 1.9.7.0 Copyright © FakeFish 2018-2024 AnyCPU;x64 Barotrauma diff --git a/Barotrauma/BarotraumaClient/WindowsClient.csproj b/Barotrauma/BarotraumaClient/WindowsClient.csproj index e5cc41a0c..ad2687830 100644 --- a/Barotrauma/BarotraumaClient/WindowsClient.csproj +++ b/Barotrauma/BarotraumaClient/WindowsClient.csproj @@ -2,11 +2,11 @@ WinExe - net6.0 + net8.0 Barotrauma FakeFish, Undertow Games Barotrauma - 1.8.8.1 + 1.9.7.0 Copyright © FakeFish 2018-2024 AnyCPU;x64 Barotrauma diff --git a/Barotrauma/BarotraumaServer/LinuxServer.csproj b/Barotrauma/BarotraumaServer/LinuxServer.csproj index 94fe600dc..0f2afa293 100644 --- a/Barotrauma/BarotraumaServer/LinuxServer.csproj +++ b/Barotrauma/BarotraumaServer/LinuxServer.csproj @@ -2,11 +2,11 @@ Exe - net6.0 + net8.0 Barotrauma FakeFish, Undertow Games Barotrauma Dedicated Server - 1.8.8.1 + 1.9.7.0 Copyright © FakeFish 2018-2023 AnyCPU;x64 DedicatedServer diff --git a/Barotrauma/BarotraumaServer/MacServer.csproj b/Barotrauma/BarotraumaServer/MacServer.csproj index 6d8948212..fcff91b4c 100644 --- a/Barotrauma/BarotraumaServer/MacServer.csproj +++ b/Barotrauma/BarotraumaServer/MacServer.csproj @@ -2,11 +2,11 @@ Exe - net6.0 + net8.0 Barotrauma FakeFish, Undertow Games Barotrauma Dedicated Server - 1.8.8.1 + 1.9.7.0 Copyright © FakeFish 2018-2023 AnyCPU;x64 DedicatedServer diff --git a/Barotrauma/BarotraumaServer/ServerSource/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaServer/ServerSource/Characters/CharacterNetworking.cs index b8c7ffbaa..38e6933d0 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Characters/CharacterNetworking.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Characters/CharacterNetworking.cs @@ -673,6 +673,7 @@ namespace Barotrauma { msg.WriteUInt32(CauseOfDeath.Affliction.UintIdentifier); } + msg.WriteUInt16(CauseOfDeath.Killer?.ID ?? NullEntityID); msg.WriteBoolean(forceAfflictionData); if (forceAfflictionData) { diff --git a/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs b/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs index 2c966e762..13f248b8e 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs @@ -2107,9 +2107,33 @@ namespace Barotrauma "freecam", (Client client, Vector2 cursorWorldPos, string[] args) => { - client.UsingFreeCam = true; - GameMain.Server.SetClientCharacter(client, null); - client.SpectateOnly = true; + if (client.UsingFreeCam) + { + // Exiting freecam - try to return to previous character + Character prevCharacter = null; + if (client.PreviousCharacter != null && client.PreviousCharacter.TryGetTarget(out prevCharacter) && + prevCharacter != null && !prevCharacter.IsDead && !prevCharacter.Removed) + { + GameMain.Server.SendConsoleMessage($"{client.Name}: Exiting freecam mode", client, Color.Yellow); + client.UsingFreeCam = false; + GameMain.Server.SetClientCharacter(client, prevCharacter); + client.SpectateOnly = false; + } + else + { + GameMain.Server.SendConsoleMessage($"{client.Name}: Could not regain control of the previous character (dead or removed).", client, Color.Red); + } + } + else + { + // Entering freecam - store current character ID + GameMain.Server.SendConsoleMessage($"{client.Name}: Entering freecam mode", client, Color.Yellow); + Character currentCharacter = client.Character; + client.PreviousCharacter = new WeakReference(currentCharacter); + client.UsingFreeCam = true; + client.SpectateOnly = true; + GameMain.Server.SetClientCharacter(client, null); + } } ); diff --git a/Barotrauma/BarotraumaServer/ServerSource/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaServer/ServerSource/GameSession/GameModes/MultiPlayerCampaign.cs index da7fa0676..0d8d1793f 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/GameSession/GameModes/MultiPlayerCampaign.cs @@ -92,6 +92,7 @@ namespace Barotrauma purchasedHullRepairs = value; PurchasedHullRepairsInLatestSave |= value; IncrementLastUpdateIdForFlag(NetFlags.Misc); + DebugConsole.NewMessage("Set PurchasedHullRepairs to " + PurchasedHullRepairs, Color.Cyan); } } public override bool PurchasedLostShuttles @@ -861,6 +862,13 @@ namespace Barotrauma purchasedItemSwaps.Add(new PurchasedItemSwap(itemToRemove, itemToInstall)); } + if (purchasedUpgradeCount > 0 || purchasedItemSwapCount > 0) + { + //if the client attempted to purchase something, increment flag regardless of whether the upgrades were actually purchased or not + //so we can sync the correct state in case the client incorrectly assumed they can buy something (e.g. lost permissions just as they were purchasing) + IncrementLastUpdateIdForFlag(NetFlags.UpgradeManager); + } + int hullRepairCost = GetHullRepairCost(); int itemRepairCost = GetItemRepairCost(); int shuttleRetrieveCost = CampaignMode.ShuttleReplaceCost; @@ -1100,7 +1108,7 @@ namespace Barotrauma var characterList = GameSession.GetSessionCrewCharacters(CharacterType.Both); foreach (var (prefab, category, _) in purchasedUpgrades) { - UpgradeManager.PurchaseUpgrade(prefab, category, client: sender); + UpgradeManager.TryPurchaseUpgrade(prefab, category, client: sender); // unstable logging int price = prefab.Price.GetBuyPrice(prefab, UpgradeManager.GetUpgradeLevel(prefab, category), Map?.CurrentLocation, characterList); @@ -1111,7 +1119,7 @@ namespace Barotrauma { if (purchasedItemSwap.ItemToInstall == null) { - UpgradeManager.CancelItemSwap(purchasedItemSwap.ItemToRemove); + UpgradeManager.CancelItemSwap(purchasedItemSwap.ItemToRemove, client: sender); } else { @@ -1502,11 +1510,13 @@ namespace Barotrauma { element.Add(new XAttribute("campaignid", CampaignID)); XElement modeElement = new XElement("MultiPlayerCampaign", - new XAttribute("purchasedlostshuttles", PurchasedLostShuttles), - new XAttribute("purchasedhullrepairs", PurchasedHullRepairs), - new XAttribute("purchaseditemrepairs", PurchasedItemRepairs), + new XAttribute("purchasedlostshuttles", PurchasedLostShuttlesInLatestSave), + new XAttribute("purchasedhullrepairs", PurchasedHullRepairsInLatestSave), + new XAttribute("purchaseditemrepairs", PurchasedItemRepairsInLatestSave), new XAttribute("cheatsenabled", CheatsEnabled)); + DebugConsole.NewMessage("Saved PurchasedHullRepairs: "+ PurchasedHullRepairs+" (in last save "+PurchasedHullRepairsInLatestSave+")", Color.Magenta); + modeElement.Add(Settings.Save()); modeElement.Add(SaveStats()); if (GameMain.Server?.TraitorManager is TraitorManager traitorManager) @@ -1520,6 +1530,11 @@ namespace Barotrauma modeElement.Add(GameMain.GameSession?.EventManager.Save()); } + foreach (Identifier unlockedRecipe in GameMain.GameSession.UnlockedRecipes) + { + modeElement.Add(new XElement("unlockedrecipe", new XAttribute("identifier", unlockedRecipe))); + } + CampaignMetadata?.Save(modeElement); Map.Save(modeElement); CargoManager?.SavePurchasedItems(modeElement); diff --git a/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Growable.cs b/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Growable.cs index 8749382f1..c8bfedcca 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Growable.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Growable.cs @@ -37,7 +37,7 @@ namespace Barotrauma.Items.Components public void ServerEventWrite(IWriteMessage msg, Client c, NetEntityEvent.IData extraData = null) { - msg.WriteRangedSingle(Health, 0f, (float)MaxHealth, 8); + msg.WriteRangedSingle(Health, 0f, (float)MaxWater, 8); if (TryExtractEventData(extraData, out EventData eventData)) { int offset = eventData.Offset; diff --git a/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Holdable/Holdable.cs b/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Holdable/Holdable.cs index 3f5692b46..7d96520a9 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Holdable/Holdable.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Holdable/Holdable.cs @@ -10,7 +10,7 @@ namespace Barotrauma.Items.Components { base.ServerEventWrite(msg, c, extraData); - bool writeAttachData = attachable && body != null; + bool writeAttachData = attachable && originalBody != null; msg.WriteBoolean(writeAttachData); if (!writeAttachData) { return; } @@ -22,8 +22,8 @@ namespace Barotrauma.Items.Components } msg.WriteBoolean(Attached); - msg.WriteSingle(body.SimPosition.X); - msg.WriteSingle(body.SimPosition.Y); + msg.WriteSingle(originalBody.SimPosition.X); + msg.WriteSingle(originalBody.SimPosition.Y); msg.WriteUInt16(item.Submarine?.ID ?? Entity.NullEntityID); msg.WriteUInt16(attacherId); } @@ -40,6 +40,9 @@ namespace Barotrauma.Items.Components Drop(false, null); item.SetTransform(simPosition, 0.0f, findNewHull: false); + //don't find the new hull in SetTransform, because that'd also potentially change the submarine (teleport the item outside if it's attached outside) + //instead just find the hull, so the item is considered to be in the right hull + item.CurrentHull = Hull.FindHull(item.WorldPosition, item.CurrentHull); AttachToWall(); OnUsed.Invoke(new ItemUseInfo(item, c.Character)); diff --git a/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Power/PowerDistributor.cs b/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Power/PowerDistributor.cs new file mode 100644 index 000000000..7e5868876 --- /dev/null +++ b/Barotrauma/BarotraumaServer/ServerSource/Items/Components/Power/PowerDistributor.cs @@ -0,0 +1,33 @@ +#nullable enable +using Barotrauma.Networking; + +namespace Barotrauma.Items.Components +{ + internal partial class PowerDistributor : PowerTransfer, IServerSerializable, IClientSerializable + { + #region Networking + public void ServerEventRead(IReadMessage msg, Client c) + { + SharedEventRead(msg, out EventType eventType, out PowerGroup powerGroup, out string newName, out float newRatio); + + if (item.CanClientAccess(c)) + { + switch (eventType) + { + case EventType.NameChange: + powerGroup.Name = newName; + break; + case EventType.RatioChange: + powerGroup.SupplyRatio = newRatio; + GameServer.Log($"{GameServer.CharacterLogName(c.Character)} changed supply ratio of power group \"{powerGroup.Name}\" to \"{powerGroup.SupplyRatio}\"", ServerLog.MessageType.ItemInteraction); + break; + } + } + + item.CreateServerEvent(this, new EventData(powerGroup, eventType)); + } + + public void ServerEventWrite(IWriteMessage msg, Client c, NetEntityEvent.IData? extraData = null) => SharedEventWrite(msg, extraData); + #endregion + } +} diff --git a/Barotrauma/BarotraumaServer/ServerSource/Items/Item.cs b/Barotrauma/BarotraumaServer/ServerSource/Items/Item.cs index 4713be50f..0a66bbd08 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Items/Item.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Items/Item.cs @@ -274,6 +274,7 @@ namespace Barotrauma msg.WriteByte(originalSlotIndex < 0 ? (byte)255 : (byte)originalSlotIndex); } + msg.WriteBoolean(OnInsertedEffectsAppliedOnPreviousRound); msg.WriteByte(body == null ? (byte)0 : (byte)body.BodyType); msg.WriteBoolean(SpawnedInCurrentOutpost); msg.WriteBoolean(AllowStealing); diff --git a/Barotrauma/BarotraumaServer/ServerSource/Map/Hull.cs b/Barotrauma/BarotraumaServer/ServerSource/Map/Hull.cs index 463ff3427..86a40a127 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Map/Hull.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Map/Hull.cs @@ -30,8 +30,8 @@ namespace Barotrauma //don't create updates if all clients are very far from the hull float hullUpdateDistanceSqr = NetConfig.HullUpdateDistance * NetConfig.HullUpdateDistance; if (!GameMain.Server.ConnectedClients.Any(c => - c.Character != null && - Vector2.DistanceSquared(c.Character.WorldPosition, WorldPosition) < hullUpdateDistanceSqr)) + (c.Character != null && Vector2.DistanceSquared(c.Character.WorldPosition, WorldPosition) < hullUpdateDistanceSqr) || + (c.SpectatePos != null && Vector2.DistanceSquared(c.SpectatePos.Value, WorldPosition) < hullUpdateDistanceSqr)) ) { return; } @@ -76,6 +76,11 @@ namespace Barotrauma } } + public void ForceStatusUpdate() + { + statusUpdateTimer = NetConfig.SparseHullUpdateInterval; + } + public void CreateStatusEvent() { @@ -137,6 +142,12 @@ namespace Barotrauma WaterVolume = newWaterVolume; + if (newFireSources.Length != FireSources.Count) + { + //number of fire sources has changed, force a network update + ForceStatusUpdate(); + } + for (int i = 0; i < newFireSources.Length; i++) { Vector2 pos = newFireSources[i].Position; diff --git a/Barotrauma/BarotraumaServer/ServerSource/Networking/ChatMessage.cs b/Barotrauma/BarotraumaServer/ServerSource/Networking/ChatMessage.cs index 5a804f9bc..8ffc5a751 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Networking/ChatMessage.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Networking/ChatMessage.cs @@ -166,9 +166,7 @@ namespace Barotrauma.Networking } else { - ChatMessage denyMsg = Create("", TextManager.Get("SpamFilterBlocked").Value, ChatMessageType.Server, null); - c.ChatSpamTimer = 10.0f; - GameMain.Server.SendDirectChatMessage(denyMsg, c); + BlockBySpamFilter(); } flaggedAsSpam = true; return; @@ -178,14 +176,20 @@ namespace Barotrauma.Networking if (c.ChatSpamTimer > 0.0f && !isSpamExempt) { - ChatMessage denyMsg = Create("", TextManager.Get("SpamFilterBlocked").Value, ChatMessageType.Server, null); - c.ChatSpamTimer = 10.0f; - GameMain.Server.SendDirectChatMessage(denyMsg, c); + BlockBySpamFilter(); flaggedAsSpam = true; return; } flaggedAsSpam = false; + + void BlockBySpamFilter() + { + ChatMessage denyMsg = Create("", TextManager.Get("SpamFilterBlocked").Value, ChatMessageType.BlockedBySpamFilter, null); + c.ChatSpamTimer = BlockedBySpamFilterTime; + GameMain.Server.SendDirectChatMessage(denyMsg, c); + GameServer.Log(c.Name + " blocked by spam filter", ServerLog.MessageType.ServerMessage); + } } public int EstimateLengthBytesServer(Client c) diff --git a/Barotrauma/BarotraumaServer/ServerSource/Networking/Client.cs b/Barotrauma/BarotraumaServer/ServerSource/Networking/Client.cs index 145571884..a89bd2c3b 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Networking/Client.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Networking/Client.cs @@ -138,6 +138,8 @@ namespace Barotrauma.Networking get { return kickVoters.Count; } } + public WeakReference PreviousCharacter; + partial void InitProjSpecific() { kickVoters = new List(); diff --git a/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs b/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs index e13ec2825..b87e85a62 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Networking/GameServer.cs @@ -4222,6 +4222,9 @@ namespace Barotrauma.Networking public void GiveAchievement(Client client, Identifier achievementIdentifier) { if (client.GivenAchievements.Contains(achievementIdentifier)) { return; } + + DebugConsole.NewMessage($"Attempting to give the achievement {achievementIdentifier} to {client.Name}..."); + client.GivenAchievements.Add(achievementIdentifier); IWriteMessage msg = new WriteOnlyMessage(); @@ -4231,6 +4234,17 @@ namespace Barotrauma.Networking serverPeer.Send(msg, client.Connection, DeliveryMethod.Reliable); } + public void UnlockRecipe(Identifier identifier) + { + foreach (var client in connectedClients) + { + IWriteMessage msg = new WriteOnlyMessage(); + msg.WriteByte((byte)ServerPacketHeader.UNLOCKRECIPE); + msg.WriteIdentifier(identifier); + serverPeer.Send(msg, client.Connection, DeliveryMethod.Reliable); + } + } + public void IncrementStat(Client client, AchievementStat stat, int amount) { IWriteMessage msg = new WriteOnlyMessage(); diff --git a/Barotrauma/BarotraumaServer/WindowsServer.csproj b/Barotrauma/BarotraumaServer/WindowsServer.csproj index dcaa4c558..6c594e9ba 100644 --- a/Barotrauma/BarotraumaServer/WindowsServer.csproj +++ b/Barotrauma/BarotraumaServer/WindowsServer.csproj @@ -2,11 +2,11 @@ Exe - net6.0 + net8.0 Barotrauma FakeFish, Undertow Games Barotrauma Dedicated Server - 1.8.8.1 + 1.9.7.0 Copyright © FakeFish 2018-2023 AnyCPU;x64 DedicatedServer diff --git a/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]PowerTestSub/PowerTestSub.sub b/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]PowerTestSub/PowerTestSub.sub new file mode 100644 index 0000000000000000000000000000000000000000..4002bbb9fc8376c180da97e4340e9d7d68725988 GIT binary patch literal 161576 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 UPl=m~ZZ~|+7t{F^c^*Fae|4 + + + \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]RotationAndFlippingTests/RotationAndFlippingTests.sub b/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]RotationAndFlippingTests/RotationAndFlippingTests.sub index be65f40e548316d9eeabe582d1de4c935f31357c..0a09be029d8074bc3d4f3ad8b1c1af6f12864f26 100644 GIT binary patch literal 10094 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 QDgMv@2L_340fiz107_$lRR910 literal 9607 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 diff --git a/Barotrauma/BarotraumaShared/SharedSource/AchievementManager.cs b/Barotrauma/BarotraumaShared/SharedSource/AchievementManager.cs index 0e03c7356..a4feacedd 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/AchievementManager.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/AchievementManager.cs @@ -16,7 +16,7 @@ namespace Barotrauma static class AchievementManager { - private static readonly ImmutableHashSet SupportedAchievements = ImmutableHashSet.Create( + public static readonly ImmutableHashSet SupportedAchievements = ImmutableHashSet.Create( "killmoloch".ToIdentifier(), "killhammerhead".ToIdentifier(), "killendworm".ToIdentifier(), @@ -146,6 +146,9 @@ namespace Barotrauma public static void OnStartRound(Biome biome = null) { +#if CLIENT + SteamTimelineManager.OnRoundStarted(); +#endif roundData = new RoundData(); foreach (Item item in Item.ItemList) { @@ -161,6 +164,7 @@ namespace Barotrauma if (GameMain.Client != null) { return; } #endif + if (biome != null && GameMain.GameSession?.GameMode is CampaignMode) { string shortBiomeIdentifier = biome.Identifier.Value.Replace(" ", ""); @@ -233,8 +237,8 @@ namespace Barotrauma //convert submarine velocity to km/h Vector2 submarineVel = Physics.DisplayToRealWorldRatio * ConvertUnits.ToDisplayUnits(sub.Velocity) * 3.6f; - //achievement for going > 100 km/h - if (Math.Abs(submarineVel.X) > 100.0f) + //achievement for going > 50 km/h + if (Math.Abs(submarineVel.X) > 50.0f) { //all conscious characters inside the sub get an achievement UnlockAchievement("subhighvelocity".ToIdentifier(), true, c => c != null && c.Submarine == sub && !c.IsDead && !c.IsUnconscious); @@ -279,7 +283,7 @@ namespace Barotrauma if (c == null || c.Removed) { return; } if (c.HasEquippedItem("clownmask".ToIdentifier()) && - c.HasEquippedItem("clowncostume".ToIdentifier())) + c.HasEquippedItem("clowngear".ToIdentifier())) { UnlockAchievement(c, "clowncostume".ToIdentifier()); } @@ -407,9 +411,33 @@ namespace Barotrauma UnlockAchievement(reviver, "healcrit".ToIdentifier()); } +#if CLIENT + private static void CheckSteamTimelineEvents(Character killedCharacter, CauseOfDeath causeOfDeath) + { + if (killedCharacter == Character.Controlled) + { + SteamTimelineManager.OnPlayerDied(killedCharacter, causeOfDeath); + return; + } + + bool pvpkill = killedCharacter.IsHuman && GameMain.GameSession?.GameMode is PvPMode; + + float combatStrength = killedCharacter.Params.AI?.CombatStrength ?? 0; + bool significantCombatStrength = combatStrength >= 300; + + if (pvpkill || significantCombatStrength) + { + // note: sometimes the causeOfDeath.Killer is null in multiplayer + SteamTimelineManager.OnSignificantEnemyDied(killedCharacter, causeOfDeath); + } + } +#endif + public static void OnCharacterKilled(Character character, CauseOfDeath causeOfDeath) { #if CLIENT + CheckSteamTimelineEvents(character, causeOfDeath); + // If this is a multiplayer game, the client should let the server handle achievements if (GameMain.Client != null || GameMain.GameSession == null) { return; } @@ -417,40 +445,41 @@ namespace Barotrauma causeOfDeath.Killer != null && causeOfDeath.Killer == Character.Controlled) { - IncrementStat(causeOfDeath.Killer, character.IsHuman ? AchievementStat.HumansKilled : AchievementStat.MonstersKilled , 1); + IncrementStat(causeOfDeath.Killer, character.IsHuman ? AchievementStat.HumansKilled : AchievementStat.MonstersKilled, 1); } + #elif SERVER if (character != causeOfDeath.Killer && causeOfDeath.Killer != null) { - IncrementStat(causeOfDeath.Killer, character.IsHuman ? AchievementStat.HumansKilled : AchievementStat.MonstersKilled , 1); + IncrementStat(causeOfDeath.Killer, character.IsHuman ? AchievementStat.HumansKilled : AchievementStat.MonstersKilled, 1); } #endif - UnlockAchievement(causeOfDeath.Killer, $"kill{character.SpeciesName}".ToIdentifier()); + UnlockKillAchievement(causeOfDeath.Killer, character, $"kill{character.SpeciesName}".ToIdentifier()); if (character.CurrentHull != null) { - UnlockAchievement(causeOfDeath.Killer, $"kill{character.SpeciesName}indoors".ToIdentifier()); + UnlockKillAchievement(causeOfDeath.Killer, character, $"kill{character.SpeciesName}indoors".ToIdentifier()); } if (character.SpeciesName.EndsWith("boss")) { - UnlockAchievement(causeOfDeath.Killer, $"kill{character.SpeciesName.Replace("boss", "")}".ToIdentifier()); + UnlockKillAchievement(causeOfDeath.Killer, character, $"kill{character.SpeciesName.Replace("boss", "")}".ToIdentifier()); if (character.CurrentHull != null) { - UnlockAchievement(causeOfDeath.Killer, $"kill{character.SpeciesName.Replace("boss", "")}indoors".ToIdentifier()); + UnlockKillAchievement(causeOfDeath.Killer, character, $"kill{character.SpeciesName.Replace("boss", "")}indoors".ToIdentifier()); } } if (character.SpeciesName.EndsWith("_m")) { - UnlockAchievement(causeOfDeath.Killer, $"kill{character.SpeciesName.Replace("_m", "")}".ToIdentifier()); + UnlockKillAchievement(causeOfDeath.Killer, character, $"kill{character.SpeciesName.Replace("_m", "")}".ToIdentifier()); if (character.CurrentHull != null) { - UnlockAchievement(causeOfDeath.Killer, $"kill{character.SpeciesName.Replace("_m", "")}indoors".ToIdentifier()); + UnlockKillAchievement(causeOfDeath.Killer, character, $"kill{character.SpeciesName.Replace("_m", "")}indoors".ToIdentifier()); } } #if SERVER if (character.SpeciesName == "Jove" && GameMain.GameSession.Campaign is MultiPlayerCampaign && - GameMain.Server?.ServerSettings is { IronmanModeActive: true }) + (GameMain.Server?.ServerSettings is { IronmanModeActive: true } or { RespawnMode: RespawnMode.Permadeath })) { UnlockAchievement( identifier: "europasfinest".ToIdentifier(), @@ -464,8 +493,12 @@ namespace Barotrauma causeOfDeath.Killer != character) { UnlockAchievement(causeOfDeath.Killer, "killclown".ToIdentifier()); + if (character.CharacterHealth?.GetAffliction("psychosis") != null) + { + UnlockAchievement(causeOfDeath.Killer, "whatsmirksbelow".ToIdentifier()); + } } - + if (character.CharacterHealth?.GetAffliction("psychoclown") != null && character.CurrentHull?.Submarine.Info is { Type: SubmarineType.BeaconStation }) { @@ -516,6 +549,20 @@ namespace Barotrauma #endif } + private static void UnlockKillAchievement(Character killer, Character target, Identifier identifier) + { + if (killer != null && + target.Params.UnlockKillAchievementForWholeCrew && + GameSession.GetSessionCrewCharacters(CharacterType.Player).Contains(killer)) + { + UnlockAchievement(identifier, unlockClients: true, characterConditions: c => c != null); + } + else + { + UnlockAchievement(killer, identifier); + } + } + public static void OnTraitorWin(Character character) { #if CLIENT @@ -525,9 +572,15 @@ namespace Barotrauma UnlockAchievement(character, "traitorwin".ToIdentifier()); } - public static void OnRoundEnded(GameSession gameSession) + public static void OnRoundEnded(GameSession gameSession, bool roundInterrupted = false) { +#if CLIENT + SteamTimelineManager.OnRoundEnded(); +#endif if (CheatsEnabled) { return; } + + // no processing for achievements if player quit to menu or such. + if (roundInterrupted) { return; } //made it to the destination if (gameSession?.Submarine != null && Level.Loaded != null && gameSession.Submarine.AtEndExit) @@ -713,7 +766,9 @@ namespace Barotrauma private static void UnlockAchievementsOnPlatforms(Identifier identifier) { if (unlockedAchievements.Contains(identifier)) { return; } - + + DebugConsole.NewMessage($"Attempting to unlock achievement {identifier}..."); + if (SteamManager.IsInitialized) { if (SteamManager.UnlockAchievement(identifier)) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/EnemyAIController.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/EnemyAIController.cs index 5e7fd8e8c..49389c008 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/EnemyAIController.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/EnemyAIController.cs @@ -4396,11 +4396,11 @@ namespace Barotrauma else if (canAttackDoors && HasValidPath()) { var door = PathSteering.CurrentPath.CurrentNode?.ConnectedDoor ?? PathSteering.CurrentPath.NextNode?.ConnectedDoor; - if (door is { CanBeTraversed: false } && !door.HasAccess(Character)) + if (door is { CanBeTraversed: false } && !door.HasAccess(Character) && door.Item.AiTarget is { } doorAiTarget) { - if (SelectedAiTarget != door.Item.AiTarget || State != AIState.Attack) + if (SelectedAiTarget != doorAiTarget || State != AIState.Attack) { - SelectTarget(door.Item.AiTarget, CurrentTargetMemory.Priority); + SelectTarget(doorAiTarget, CurrentTargetMemory.Priority); State = AIState.Attack; return false; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/HumanAIController.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/HumanAIController.cs index a06695a10..8f0293ba7 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/HumanAIController.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/HumanAIController.cs @@ -787,6 +787,13 @@ namespace Barotrauma foreach (Item item in Character.HeldItems) { if (item == null || !item.IsInteractable(Character)) { continue; } + if (!item.UnequipAutomatically) { continue; } + //NPC set to operate the item they're holding, don't put it away + if (ObjectiveManager.CurrentObjective is AIObjectiveOperateItem operateItem && + (operateItem.OperateTarget == item || operateItem.Component?.Item == item)) + { + continue; + } if (Character.TryPutItemInAnySlot(item)) { continue; } if (Character.TryPutItemInBag(item)) { continue; } if (item.HasTag(Tags.Weapon)) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveFindDivingGear.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveFindDivingGear.cs index 743f4506c..a47026b94 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveFindDivingGear.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveFindDivingGear.cs @@ -69,6 +69,7 @@ namespace Barotrauma } var getItemObjective = new AIObjectiveGetItem(character, gearTag, objectiveManager, equip: true) { + IsFindDivingGearSubObjective = true, AllowStealing = HumanAIController.NeedsDivingGear(character.CurrentHull, out _), AllowToFindDivingGear = false, AllowDangerousPressure = true, diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveGetItem.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveGetItem.cs index 57e4f73e4..94a876ca7 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveGetItem.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveGetItem.cs @@ -49,6 +49,13 @@ namespace Barotrauma public const float DefaultReach = 100; public const float MaxReach = 150; + /// + /// Is the goal of this objective to get diving gear (i.e. has it been created by )? + /// If so, the objective won't attempt to create another objective if the path requires diving gear + /// (wouldn't make sense to start looking for diving gear so the bot can get to a room they're trying to get diving gear from!) + /// + public bool IsFindDivingGearSubObjective; + public bool AllowToFindDivingGear { get; set; } = true; public bool MustBeSpecificItem { get; set; } @@ -378,6 +385,7 @@ namespace Barotrauma { return new AIObjectiveGoTo(moveToTarget, character, objectiveManager, repeat: false, getDivingGearIfNeeded: AllowToFindDivingGear, closeEnough: DefaultReach) { + IsFindDivingGearSubObjective = IsFindDivingGearSubObjective, // If the root container changes, the item is no longer where it was (taken by someone -> need to find another item) AbortCondition = obj => targetItem == null || (targetItem.GetRootInventoryOwner() is Entity owner && owner != moveToTarget && owner != character), SpeakIfFails = false, diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveGoTo.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveGoTo.cs index fc7126801..fd5ade494 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveGoTo.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/AI/Objectives/AIObjectiveGoTo.cs @@ -14,6 +14,13 @@ namespace Barotrauma public override bool KeepDivingGearOn => GetTargetHull() == null; + /// + /// Is the goal of this objective to get diving gear (i.e. has it been created by )? + /// If so, the objective won't attempt to create another objective if the path requires diving gear + /// (wouldn't make sense to start looking for diving gear so the bot can get to a room they're trying to get diving gear from!) + /// + public bool IsFindDivingGearSubObjective; + private AIObjectiveFindDivingGear findDivingGear; private readonly bool repeat; //how long until the path to the target is declared unreachable @@ -379,85 +386,89 @@ namespace Barotrauma } } if (Abandon) { return; } - bool needsDivingSuit = (!isInside || hasOutdoorNodes) && !character.IsImmuneToPressure; - bool tryToGetDivingGear = needsDivingSuit || HumanAIController.NeedsDivingGear(targetHull, out needsDivingSuit); - bool tryToGetDivingSuit = needsDivingSuit; - Character followTarget = Target as Character; - if (Mimic && !character.IsImmuneToPressure) + + if (!IsFindDivingGearSubObjective) { - if (HumanAIController.HasDivingSuit(followTarget)) + bool needsDivingSuit = (!isInside || hasOutdoorNodes) && !character.IsImmuneToPressure; + bool tryToGetDivingGear = needsDivingSuit || HumanAIController.NeedsDivingGear(targetHull, out needsDivingSuit); + bool tryToGetDivingSuit = needsDivingSuit; + Character followTarget = Target as Character; + if (Mimic && !character.IsImmuneToPressure) { - tryToGetDivingGear = true; - tryToGetDivingSuit = true; + if (HumanAIController.HasDivingSuit(followTarget)) + { + tryToGetDivingGear = true; + tryToGetDivingSuit = true; + } + else if (HumanAIController.HasDivingMask(followTarget) && character.CharacterHealth.OxygenLowResistance < 1) + { + tryToGetDivingGear = true; + } } - else if (HumanAIController.HasDivingMask(followTarget) && character.CharacterHealth.OxygenLowResistance < 1) + bool needsEquipment = false; + float minOxygen = AIObjectiveFindDivingGear.GetMinOxygen(character); + if (tryToGetDivingSuit) { - tryToGetDivingGear = true; + needsEquipment = !HumanAIController.HasDivingSuit(character, minOxygen, requireSuitablePressureProtection: !objectiveManager.FailedToFindDivingGearForDepth); } - } - bool needsEquipment = false; - float minOxygen = AIObjectiveFindDivingGear.GetMinOxygen(character); - if (tryToGetDivingSuit) - { - needsEquipment = !HumanAIController.HasDivingSuit(character, minOxygen, requireSuitablePressureProtection: !objectiveManager.FailedToFindDivingGearForDepth); - } - else if (tryToGetDivingGear) - { - needsEquipment = !HumanAIController.HasDivingGear(character, minOxygen); - } - if (!getDivingGearIfNeeded) - { - if (needsEquipment) + else if (tryToGetDivingGear) { - // Don't try to reach the target without proper equipment. - Abandon = true; - return; + needsEquipment = !HumanAIController.HasDivingGear(character, minOxygen); } - } - else - { - if (character.LockHands) + if (!getDivingGearIfNeeded) { - cantFindDivingGear = true; + if (needsEquipment) + { + // Don't try to reach the target without proper equipment. + Abandon = true; + return; + } } - if (cantFindDivingGear && needsDivingSuit) + else { - // Don't try to reach the target without a suit because it's lethal. - Abandon = true; - return; - } - if (needsEquipment && !cantFindDivingGear) - { - SteeringManager.Reset(); - TryAddSubObjective(ref findDivingGear, () => new AIObjectiveFindDivingGear(character, needsDivingSuit: tryToGetDivingSuit, objectiveManager), - onAbandon: () => - { - cantFindDivingGear = true; - if (needsDivingSuit) + if (character.LockHands) + { + cantFindDivingGear = true; + } + if (cantFindDivingGear && needsDivingSuit) + { + // Don't try to reach the target without a suit because it's lethal. + Abandon = true; + return; + } + if (needsEquipment && !cantFindDivingGear) + { + SteeringManager.Reset(); + TryAddSubObjective(ref findDivingGear, () => new AIObjectiveFindDivingGear(character, needsDivingSuit: tryToGetDivingSuit, objectiveManager), + onAbandon: () => { - // Shouldn't try to reach the target without a suit, because it's lethal. - Abandon = true; - } - else - { - // Try again without requiring the diving suit (or mask) - RemoveSubObjective(ref findDivingGear); - TryAddSubObjective(ref findDivingGear, () => new AIObjectiveFindDivingGear(character, needsDivingSuit: !tryToGetDivingSuit, objectiveManager), - onAbandon: () => - { - Abandon = character.CurrentHull != null && (objectiveManager.CurrentOrder != this || Target.Submarine == null); - RemoveSubObjective(ref findDivingGear); - }, - onCompleted: () => - { - RemoveSubObjective(ref findDivingGear); - }); - } - }, - onCompleted: () => RemoveSubObjective(ref findDivingGear)); - return; + cantFindDivingGear = true; + if (needsDivingSuit) + { + // Shouldn't try to reach the target without a suit, because it's lethal. + Abandon = true; + } + else + { + // Try again without requiring the diving suit (or mask) + RemoveSubObjective(ref findDivingGear); + TryAddSubObjective(ref findDivingGear, () => new AIObjectiveFindDivingGear(character, needsDivingSuit: !tryToGetDivingSuit, objectiveManager), + onAbandon: () => + { + Abandon = character.CurrentHull != null && (objectiveManager.CurrentOrder != this || Target.Submarine == null); + RemoveSubObjective(ref findDivingGear); + }, + onCompleted: () => + { + RemoveSubObjective(ref findDivingGear); + }); + } + }, + onCompleted: () => RemoveSubObjective(ref findDivingGear)); + return; + } } - } + } if (IsDoneFollowing()) { OnCompleted(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Animation/AnimController.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Animation/AnimController.cs index 9cfaaf315..4405a791e 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Animation/AnimController.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Animation/AnimController.cs @@ -347,7 +347,10 @@ namespace Barotrauma useItemTimer = 0.05f; StartUsingItem(); - if (!allowMovement) + //make the character move towards the item they're using... + if (!allowMovement && + //...except if they've selected an item that controls the character's direction (e.g. a periscope) + character.SelectedSecondaryItem?.GetComponent() is not { Direction: Direction.Left or Direction.Right }) { TargetMovement = Vector2.Zero; TargetDir = handWorldPos.X > character.WorldPosition.X ? Direction.Right : Direction.Left; diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/CauseOfDeath.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/CauseOfDeath.cs index e1cd01576..adc94a484 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/CauseOfDeath.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/CauseOfDeath.cs @@ -4,7 +4,11 @@ namespace Barotrauma { enum CauseOfDeathType { - Unknown, Pressure, Suffocation, Drowning, Affliction, Disconnected + Unknown, Pressure, Suffocation, Drowning, Affliction, Disconnected, + /// + /// Special cause of death type returned by when the character is not dead. + /// + None } class CauseOfDeath diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Character.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Character.cs index 9c9033902..d950dbf76 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Character.cs @@ -589,6 +589,9 @@ namespace Barotrauma public Identifier VariantOf => Prefab.VariantOf; + /// + /// Non-localized name of the character (for characters with info, their name, for monsters, their species). E.g. "Mudraptor_veteran", "John Smith". + /// public string Name { get @@ -597,6 +600,9 @@ namespace Barotrauma } } + /// + /// Localized display name of the character (e.g. "Mudraptor Veteran", "John Smith") - this should generally be used in any the player sees. + /// public string DisplayName { get @@ -1207,6 +1213,11 @@ namespace Barotrauma private set; } + /// + /// Can be used by mods to check the cause of death of the character using conditionals (e.g. if some effects should or should not be triggered by certain causes of death). + /// + public CauseOfDeathType CauseOfDeathType => CauseOfDeath?.Type ?? CauseOfDeathType.None; + //can other characters select (= grab) this character public bool CanBeSelected { @@ -2406,7 +2417,7 @@ namespace Barotrauma { if (!CanInteractWith(item)) { continue; } - if (SelectedItem?.OwnInventory != null && SelectedItem.OwnInventory.CanBePut(item)) + if (SelectedItem?.OwnInventory != null && !SelectedItem.OwnInventory.Locked && SelectedItem.OwnInventory.CanBePut(item)) { SelectedItem.OwnInventory.TryPutItem(item, this); } @@ -5703,6 +5714,7 @@ namespace Barotrauma public bool HasRecipeForItem(Identifier recipeIdentifier) { + if (GameMain.GameSession != null && GameMain.GameSession.UnlockedRecipes.Contains(recipeIdentifier)) { return true; } return characterTalents.Any(t => t.UnlockedRecipes.Contains(recipeIdentifier)); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/CharacterInfo.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/CharacterInfo.cs index 377e5894e..6039a7896 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/CharacterInfo.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/CharacterInfo.cs @@ -408,6 +408,11 @@ namespace Barotrauma public HashSet UnlockedTalents { get; private set; } = new HashSet(); + /// + /// Which of the character's extra talents (talents unlocked from outside their own talent tree) are reset when the talents are resetted using e.g. Mindwipe? + /// + public HashSet ResettableExtraTalents { get; private set; } = new HashSet(); + private int talentResetCount; /// @@ -792,14 +797,6 @@ namespace Barotrauma Salary = CalculateSalary(); } OriginalName = !string.IsNullOrEmpty(originalName) ? originalName : Name; - - TalentRefundPoints = CharacterConfigElement.GetAttributeInt("refundpoints", 0); - - int loadedLastRewardDistribution = CharacterConfigElement.GetAttributeInt("lastrewarddistribution", -1); - if (loadedLastRewardDistribution >= 0) - { - LastRewardDistribution = Option.Some(loadedLastRewardDistribution); - } } private void SetPersonalityTrait() @@ -1016,10 +1013,22 @@ namespace Barotrauma } UnlockedTalents.Add(talentIdentifier); + if (talentElement.GetAttributeBool("resettable", defaultValue: false)) + { + ResettableExtraTalents.Add(talentIdentifier); + } } } } + TalentRefundPoints = infoElement.GetAttributeInt("refundpoints", 0); + + int loadedLastRewardDistribution = infoElement.GetAttributeInt("lastrewarddistribution", -1); + if (loadedLastRewardDistribution >= 0) + { + LastRewardDistribution = Option.Some(loadedLastRewardDistribution); + } + LoadHeadAttachments(); } @@ -1535,7 +1544,13 @@ namespace Barotrauma if (TalentRefundPoints <= 0) { return; } //e.g. talents from endocrine booster or extra talents some special NPC has + //stored in a list so we can re-unlock them on the character var talentsFromOutsideTree = GetUnlockedTalentsOutsideTree().ToList(); + //remove resettable talents, so they DON'T get re-unlocked + foreach (var resettableExtraTalent in ResettableExtraTalents) + { + talentsFromOutsideTree.Remove(resettableExtraTalent); + } UnlockedTalents.Clear(); SavedStatValues.Clear(); @@ -1570,6 +1585,9 @@ namespace Barotrauma public void Rename(string newName) { if (string.IsNullOrEmpty(newName)) { return; } + + newName = Networking.Client.SanitizeName(newName); + // Replace the name tag of any existing id cards or duffel bags foreach (var item in Item.ItemList) { @@ -1673,7 +1691,10 @@ namespace Barotrauma foreach (Identifier talentIdentifier in UnlockedTalents) { - talentElement.Add(new XElement("Talent", new XAttribute("identifier", talentIdentifier))); + talentElement.Add( + new XElement("Talent", + new XAttribute("identifier", talentIdentifier), + new XAttribute("resettable", ResettableExtraTalents.Contains(talentIdentifier)))); } charElement.Add(savedStatElement); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Health/Afflictions/AfflictionPrefab.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Health/Afflictions/AfflictionPrefab.cs index 725e12478..132b79833 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Health/Afflictions/AfflictionPrefab.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Health/Afflictions/AfflictionPrefab.cs @@ -882,6 +882,16 @@ namespace Barotrauma /// Its opacity is controlled by the active effect's MinAfflictionOverlayAlphaMultiplier and MaxAfflictionOverlayAlphaMultiplier /// public readonly Sprite AfflictionOverlay; + + /// + /// The speed of the affliction overlay animation. + /// Only applicable with AfflictionOverlayAnimated, and the overlay has to be a spritesheet so there's something to animate. + /// + public float AfflictionOverlayAnimSpeed + { + get; + set; + } public ImmutableDictionary TreatmentSuitabilities { @@ -1005,6 +1015,10 @@ namespace Barotrauma case "afflictionoverlay": AfflictionOverlay = new Sprite(subElement); break; + case "afflictionoverlayanimated": + AfflictionOverlay = new SpriteSheet(subElement); + AfflictionOverlayAnimSpeed = subElement.GetAttributeFloat("animspeed", 1.0f); + break; case "statvalue": DebugConsole.ThrowError($"Error in affliction \"{Identifier}\" - stat values should be configured inside the affliction's effects.", contentPackage: element.ContentPackage); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/HumanPrefab.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/HumanPrefab.cs index eaf739333..67b0141e4 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/HumanPrefab.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/HumanPrefab.cs @@ -302,7 +302,7 @@ namespace Barotrauma new List(item.GetComponent()?.AllowedSlots ?? item.GetComponent().AllowedSlots) : new List(item.AllowedSlots); allowedSlots.Remove(InvSlotType.Any); - + item.UnequipAutomatically = false; character.Inventory.TryPutItem(item, null, allowedSlots); } else diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Jobs/Job.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Jobs/Job.cs index d3d4bfc0c..8ea5d7839 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Jobs/Job.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Jobs/Job.cs @@ -191,6 +191,7 @@ namespace Barotrauma new List(item.GetComponent()?.AllowedSlots ?? item.GetComponent().AllowedSlots) : new List(item.AllowedSlots); allowedSlots.Remove(InvSlotType.Any); + item.UnequipAutomatically = false; character.Inventory.TryPutItem(item, null, allowedSlots); } else diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Limb.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Limb.cs index 1e9755e5a..963ea9a7c 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Limb.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Limb.cs @@ -308,6 +308,9 @@ namespace Barotrauma public Vector2 DebugTargetPos; public Vector2 DebugRefPos; + /// + /// Is the limb the waist, a part of a leg or a tail? + /// public bool IsLowerBody { get @@ -330,22 +333,33 @@ namespace Barotrauma } } + /// + /// Is the limb a leg or a part of a leg (upper or lower leg or foot) + /// public bool IsLeg { get { - switch (type) + return type switch { - case LimbType.LeftFoot: - case LimbType.LeftLeg: - case LimbType.LeftThigh: - case LimbType.RightFoot: - case LimbType.RightLeg: - case LimbType.RightThigh: - return true; - default: - return false; - } + LimbType.LeftFoot or LimbType.LeftLeg or LimbType.LeftThigh or LimbType.RightFoot or LimbType.RightLeg or LimbType.RightThigh => true, + _ => false, + }; + } + } + + /// + /// Is the limb an arm or a part of an arm (upper or lower arm or hand) + /// + public bool IsArm + { + get + { + return type switch + { + LimbType.LeftArm or LimbType.LeftForearm or LimbType.LeftHand or LimbType.RightArm or LimbType.RightForearm or LimbType.RightHand => true, + _ => false, + }; } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Params/CharacterParams.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Params/CharacterParams.cs index fbef6a4f5..14c8e83c8 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Params/CharacterParams.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Params/CharacterParams.cs @@ -156,6 +156,9 @@ namespace Barotrauma [Serialize(1.0f, IsPropertySaveable.Yes, description: "The multiplier of the minimum distance required between this character and the player/submarine before the music starts playing. The default distance is twice the length of the submarine, or a minimum of 50 meters."), Editable] public float MusicRangeMultiplier { get; private set; } + [Serialize(false, IsPropertySaveable.Yes, description: "Should the entire crew get an achievement (assuming there is one) if someone from the crew kills the character?")] + public bool UnlockKillAchievementForWholeCrew { get; set; } + public readonly CharacterFile File; public bool IsPet => AI?.IsPet ?? false; diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/AbilityConditionals/AbilityCondition.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/AbilityConditionals/AbilityCondition.cs index 5c352384b..b91c04880 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/AbilityConditionals/AbilityCondition.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/AbilityConditionals/AbilityCondition.cs @@ -69,9 +69,9 @@ namespace Barotrauma.Abilities switch (targetType) { case TargetType.Enemy: - return !HumanAIController.IsFriendly(character, targetCharacter, onlySameTeam: false); + return !HumanAIController.IsFriendly(character, targetCharacter); case TargetType.Ally: - return HumanAIController.IsFriendly(character, targetCharacter, onlySameTeam: true); + return HumanAIController.IsFriendly(character, targetCharacter); case TargetType.NotSelf: return targetCharacter != character; case TargetType.Alive: @@ -84,5 +84,6 @@ namespace Barotrauma.Abilities return true; } } + } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CharacterAbilityApplyStatusEffects.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CharacterAbilityApplyStatusEffects.cs index 4ef07d6e2..210a852f9 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CharacterAbilityApplyStatusEffects.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CharacterAbilityApplyStatusEffects.cs @@ -65,7 +65,7 @@ namespace Barotrauma.Abilities } if (!nearbyCharactersAppliesToAllies) { - targets.RemoveAll(c => c is Character otherCharacter && HumanAIController.IsFriendly(otherCharacter, Character, onlySameTeam: true)); + targets.RemoveAll(c => c is Character otherCharacter && HumanAIController.IsFriendly(otherCharacter, Character)); } if (!nearbyCharactersAppliesToEnemies) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CustomAbilities/CharacterAbilityPsychoClown.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CustomAbilities/CharacterAbilityPsychoClown.cs index 5f8b94591..570c3ddfb 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CustomAbilities/CharacterAbilityPsychoClown.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CustomAbilities/CharacterAbilityPsychoClown.cs @@ -3,7 +3,7 @@ class CharacterAbilityPsychoClown : CharacterAbility { private readonly StatTypes statType; - private readonly float maxValue; + private readonly float minValue, maxValue; private readonly string afflictionIdentifier; private float lastValue = 0f; public override bool AllowClientSimulation => true; @@ -11,8 +11,9 @@ public CharacterAbilityPsychoClown(CharacterAbilityGroup characterAbilityGroup, ContentXElement abilityElement) : base(characterAbilityGroup, abilityElement) { statType = CharacterAbilityGroup.ParseStatType(abilityElement.GetAttributeString("stattype", ""), CharacterTalent.DebugIdentifier); - maxValue = abilityElement.GetAttributeFloat("maxvalue", 0f); - afflictionIdentifier = abilityElement.GetAttributeString("afflictionidentifier", ""); + maxValue = abilityElement.GetAttributeFloat(nameof(maxValue), 0f); + minValue = abilityElement.GetAttributeFloat(nameof(minValue), 0f); + afflictionIdentifier = abilityElement.GetAttributeString(nameof(afflictionIdentifier), ""); } protected override void VerifyState(bool conditionsMatched, float timeSinceLastUpdate) @@ -31,7 +32,7 @@ afflictionStrength = affliction.Strength / affliction.Prefab.MaxStrength; } - lastValue = afflictionStrength * maxValue; + lastValue = minValue + afflictionStrength * (maxValue - minValue); Character.ChangeStat(statType, lastValue); } else diff --git a/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CustomAbilities/CharacterAbilityUnlockApprenticeshipTalentTree.cs b/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CustomAbilities/CharacterAbilityUnlockApprenticeshipTalentTree.cs index df658dfa7..c6d9d476a 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CustomAbilities/CharacterAbilityUnlockApprenticeshipTalentTree.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CustomAbilities/CharacterAbilityUnlockApprenticeshipTalentTree.cs @@ -67,6 +67,7 @@ namespace Barotrauma.Abilities { if (Character.HasTalent(identifier)) { continue; } Character.GiveTalent(identifier); + Character.Info.ResettableExtraTalents.Add(identifier); } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/CircuitBox/CircuitBoxInputOutputNode.cs b/Barotrauma/BarotraumaShared/SharedSource/CircuitBox/CircuitBoxInputOutputNode.cs index a212507dc..e589401bc 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/CircuitBox/CircuitBoxInputOutputNode.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/CircuitBox/CircuitBoxInputOutputNode.cs @@ -73,10 +73,12 @@ namespace Barotrauma : TextManager.Get(value).Fallback(value); conn.SetLabel(newLabel, this); + conn.Connection.DisplayNameOverride = string.IsNullOrWhiteSpace(value) ? null : newLabel; } else { conn.SetLabel(conn.Connection.DisplayName, this); + conn.Connection.DisplayNameOverride = null; } } #endif diff --git a/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentFile/TextFile.cs b/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentFile/TextFile.cs index 978429cbb..0a4cb4176 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentFile/TextFile.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentFile/TextFile.cs @@ -21,7 +21,7 @@ namespace Barotrauma { TextManager.TextPacks.TryAdd(language, ImmutableList.Empty); } - var newPack = new TextPack(this, mainElement, language); + var newPack = new TextPack(this, mainElement, language, load: language == GameSettings.CurrentConfig.Language); var newList = TextManager.TextPacks[language].Add(newPack); TextManager.TextPacks.TryRemove(language, out _); TextManager.TextPacks.TryAdd(language, newList); diff --git a/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentXElement.cs b/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentXElement.cs index b0a296e7c..4d09534e5 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentXElement.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/ContentManagement/ContentXElement.cs @@ -76,10 +76,12 @@ namespace Barotrauma public string GetAttributeStringUnrestricted(string key, string def) => Element.GetAttributeStringUnrestricted(key, def); public string[]? GetAttributeStringArray(string key, string[]? def, bool convertToLowerInvariant = false) => Element.GetAttributeStringArray(key, def, convertToLowerInvariant); public ContentPath? GetAttributeContentPath(string key) => Element.GetAttributeContentPath(key, ContentPackage); + public int? GetAttributeNullableInt(string key) => Element.GetAttributeNullableInt(key); public int GetAttributeInt(string key, int def) => Element.GetAttributeInt(key, def); public ushort GetAttributeUInt16(string key, ushort def) => Element.GetAttributeUInt16(key, def); public int[]? GetAttributeIntArray(string key, int[]? def) => Element.GetAttributeIntArray(key, def); public ushort[]? GetAttributeUshortArray(string key, ushort[]? def) => Element.GetAttributeUshortArray(key, def); + public float? GetAttributeNullableFloat(string key) => Element.GetAttributeNullableFloat(key); public float GetAttributeFloat(string key, float def) => Element.GetAttributeFloat(key, def); public float[]? GetAttributeFloatArray(string key, float[]? def) => Element.GetAttributeFloatArray(key, def); public float GetAttributeFloat(float def, params string[] keys) => Element.GetAttributeFloat(def, keys); diff --git a/Barotrauma/BarotraumaShared/SharedSource/DebugConsole.cs b/Barotrauma/BarotraumaShared/SharedSource/DebugConsole.cs index e3c2abb90..6d41c1c58 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/DebugConsole.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/DebugConsole.cs @@ -162,6 +162,8 @@ namespace Barotrauma private static readonly int messagesPerFile = 800; public const string SavePath = "ConsoleLogs"; + private static WeakReference previousControlledCharacter; // For SP freecam + private static void AssignOnExecute(string names, Action onExecute) { var matchingCommand = commands.Find(c => c.Names.Intersect(names.Split('|').ToIdentifiers()).Any()); @@ -935,8 +937,29 @@ namespace Barotrauma if (GameMain.Client == null) { - Character.Controlled = null; - GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; + if (Character.Controlled == null) + { + // Exiting freecam - try to return to previous character + Character prevCharacter = null; + if (previousControlledCharacter != null && previousControlledCharacter.TryGetTarget(out prevCharacter) && + prevCharacter != null && !prevCharacter.IsDead && !prevCharacter.Removed) + { + Character.Controlled = prevCharacter; + NewMessage("Exiting freecam mode", Color.Yellow); + } + else + { + NewMessage("Could not regain control of the previous character (dead or removed).", Color.Red); + } + } + else + { + // Entering freecam - store current character ID + previousControlledCharacter = new WeakReference(Character.Controlled); + Character.Controlled = null; + GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; + NewMessage("Entering freecam mode", Color.Yellow); + } } else { @@ -1348,14 +1371,13 @@ namespace Barotrauma } else if (args[0].Equals("endoutpost", StringComparison.OrdinalIgnoreCase)) { - Submarine.MainSub.SetPosition(Level.Loaded.EndExitPosition - Vector2.UnitY * Submarine.MainSub.Borders.Height); - - var submarineDockingPort = DockingPort.List.FirstOrDefault(d => d.Item.Submarine == Submarine.MainSub); if (Level.Loaded?.EndOutpost == null) { NewMessage("Can't teleport the sub to the end outpost (no outpost at the end of the level).", Color.Red); return; } + Submarine.MainSub.SetPosition(Level.Loaded.EndExitPosition - Vector2.UnitY * Submarine.MainSub.Borders.Height); + var submarineDockingPort = DockingPort.List.FirstOrDefault(d => d.Item.Submarine == Submarine.MainSub); var outpostDockingPort = DockingPort.List.FirstOrDefault(d => d.Item.Submarine == Level.Loaded.EndOutpost); if (submarineDockingPort != null && outpostDockingPort != null) { @@ -1616,7 +1638,18 @@ namespace Barotrauma yield return CoroutineStatus.Success; } } - + + if (Level.Loaded.StartOutpost != null && + Level.Loaded.StartOutpost.Info.OutpostTags.Contains("PvPOutpost".ToIdentifier())) + { + ThrowError("Chose a PvP outpost for the start of the level. This is probably not intentional, unless there's a PvP outpost that's also intended to be used in normal levels?"); + } + if (Level.Loaded.EndOutpost != null && + Level.Loaded.EndOutpost.Info.OutpostTags.Contains("PvPOutpost".ToIdentifier())) + { + ThrowError("Chose a PvP outpost for the end of the level. This is probably not intentional, unless there's a PvP outpost that's also intended to be used in normal levels?"); + } + var levelCells = Level.Loaded.GetCells( Submarine.MainSub.WorldPosition, Math.Max(Submarine.MainSub.Borders.Width / Level.GridCellSize, 2)); @@ -1796,7 +1829,7 @@ namespace Barotrauma int targetLevel = prefab.GetMaxLevelForCurrentSub() - upgradeManager.GetRealUpgradeLevel(prefab, category); for (int i = 0; i < targetLevel; i++) { - upgradeManager.PurchaseUpgrade(prefab, category, force: true); + upgradeManager.TryPurchaseUpgrade(prefab, category, force: true); } NewMessage($"Upgraded {category.Identifier}.{prefab.Identifier} by {targetLevel} levels.", Color.DarkGreen); } @@ -2297,6 +2330,7 @@ namespace Barotrauma commands.Add(new Command("devmode", "Toggle the dev mode on/off (client-only).", null, isCheat: true)); commands.Add(new Command("showmonsters", "Permanently unlocks all the monsters in the character editor. Use \"hidemonsters\" to undo.", null, isCheat: true)); commands.Add(new Command("hidemonsters", "Permanently hides in the character editor all the monsters that haven't been encountered in the game. Use \"showmonsters\" to undo.", null, isCheat: true)); + commands.Add(new Command("loslightingfreecam", "Toggles line of sight effect, lighting, and enables freecam mode. (client-only)", null, isCheat: true)); InitProjectSpecific(); @@ -2911,7 +2945,7 @@ namespace Barotrauma isHuman = job != null || characterLowerCase == CharacterPrefab.HumanSpeciesName; } - ParseOptionalArgs(out Vector2 spawnPosition, out WayPoint spawnPoint, out CharacterTeamType teamType, out bool addToCrew); + ParseOptionalArgs(out Vector2 spawnPosition, out WayPoint spawnPoint, out CharacterTeamType? teamType, out bool addToCrew); if (usePreConfiguredNPC) { @@ -2950,25 +2984,30 @@ namespace Barotrauma } else if (CharacterPrefab.FindBySpeciesName(args[0].ToIdentifier()) is { } prefab) { - Entity.Spawner.AddCharacterToSpawnQueue(args[0].ToIdentifier(), spawnPosition, prefab.HasCharacterInfo ? new CharacterInfo(prefab.Identifier) : null, onSpawn: newCharacter => - { - SetTeamAndCrew(newCharacter); - }); + Entity.Spawner.AddCharacterToSpawnQueue(args[0].ToIdentifier(), spawnPosition, prefab.HasCharacterInfo ? new CharacterInfo(prefab.Identifier) : null, onSpawn: SetTeamAndCrew); } void SetTeamAndCrew(Character newCharacter) { - newCharacter.TeamID = teamType; + if (teamType.HasValue) + { + newCharacter.TeamID = teamType.Value; + } + else if (isHuman) + { + newCharacter.TeamID = Character.Controlled?.TeamID ?? CharacterTeamType.Team1; + } if (addToCrew) { GameMain.GameSession?.CrewManager.AddCharacter(newCharacter); } } - void ParseOptionalArgs(out Vector2 spawnPosition, out WayPoint spawnPoint, out CharacterTeamType teamType, out bool addToCrew) + void ParseOptionalArgs(out Vector2 spawnPosition, out WayPoint spawnPoint, out CharacterTeamType? teamType, out bool addToCrew) { spawnPosition = Vector2.Zero; spawnPoint = null; + teamType = null; int argIndex = characterArgumentCount; if (args.Length > argIndex) @@ -3024,15 +3063,14 @@ namespace Barotrauma { teamType = (CharacterTeamType)teamID; } - else if (!Enum.TryParse(args[argIndex], ignoreCase: true, out teamType)) + else if (Enum.TryParse(args[argIndex], ignoreCase: true, out CharacterTeamType parsedTeamType)) { - teamType = Character.Controlled != null ? Character.Controlled.TeamID : CharacterTeamType.Team1; - ThrowError($"\"{args[argIndex]}\" is not a valid team id. Defaulting to {teamType}."); + teamType = parsedTeamType; + } + else + { + ThrowError($"\"{args[argIndex]}\" is not a valid team id."); } - } - else - { - teamType = Character.Controlled != null ? Character.Controlled.TeamID : CharacterTeamType.Team1; } argIndex++; @@ -3393,6 +3431,9 @@ namespace Barotrauma public static void ThrowError(string error, Exception e = null, ContentPackage contentPackage = null, bool createMessageBox = false, bool appendStackTrace = false) { error = AddContentPackageInfoToMessage(error, contentPackage); +#if CLIENT + SteamTimelineManager.OnError(error, e); +#endif if (e != null) { error += " {" + e.Message + "}\n"; diff --git a/Barotrauma/BarotraumaShared/SharedSource/Enums.cs b/Barotrauma/BarotraumaShared/SharedSource/Enums.cs index bc7e4df7f..79a25913a 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Enums.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Enums.cs @@ -123,7 +123,7 @@ namespace Barotrauma ///
OnAbility = 23, /// - /// Executes once when a specific Containable is placed inside an ItemContainer. Only valid for Containables defined in an ItemContainer component. + /// Executes once when a specific Containable is placed inside an ItemContainer. Only valid for Containables defined in an ItemContainer component. Does not execute if the item is placed into the container when loading an existing submarine or a character (i.e. when the item was "already in" the container). /// OnInserted = 24, /// diff --git a/Barotrauma/BarotraumaShared/SharedSource/Eos/Session.cs b/Barotrauma/BarotraumaShared/SharedSource/Eos/Session.cs index d87a7c2e1..95c00e229 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Eos/Session.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Eos/Session.cs @@ -1,4 +1,4 @@ -#nullable enable +#nullable enable using System.Collections.Generic; using System.Linq; using Barotrauma.Networking; @@ -53,7 +53,7 @@ static class EosSessionManager // If the session already exists then this failure is not a problem return; } - DebugConsole.ThrowError($"Failed to create session: {result}"); + DebugConsole.ThrowError($"Failed to create Epic Online Services session: {result}"); return; } CurrentOwnedSession = Option.Some(newOwnedSession); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/CombatAction.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/CombatAction.cs index a9cc76a69..f1074eb50 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/CombatAction.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/CombatAction.cs @@ -1,4 +1,4 @@ -using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework; using System.Collections.Generic; using System.Linq; @@ -30,6 +30,9 @@ namespace Barotrauma [Serialize(120.0f, IsPropertySaveable.Yes, description: "How long it takes for the NPC to \"cool down\" (stop attacking).")] public float CoolDown { get; set; } + [Serialize(true, IsPropertySaveable.Yes, description: "The event actions reset when a GoTo action makes the event jump to a different point. Should the NPC revert back to a normal state when the event resets?")] + public bool AbandonOnReset { get; set; } + private bool isFinished = false; @@ -81,7 +84,7 @@ namespace Barotrauma public override void Reset() { - if (affectedNpcs != null) + if (affectedNpcs != null && AbandonOnReset) { foreach (var npc in affectedNpcs) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/GodModeAction.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/GodModeAction.cs index f029d9b1f..f7d2dd681 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/GodModeAction.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/GodModeAction.cs @@ -1,4 +1,4 @@ -namespace Barotrauma +namespace Barotrauma { /// /// Makes a specific character invulnerable to damage and unable to die. @@ -36,13 +36,21 @@ namespace Barotrauma { if (target != null && target is Character character) { - if (UpdateAfflictions) + if (Enabled) { - character.CharacterHealth.Unkillable = Enabled; + if (UpdateAfflictions) + { + character.CharacterHealth.Unkillable = true; + } + else + { + character.GodMode = true; + } } else { - character.GodMode = Enabled; + character.CharacterHealth.Unkillable = false; + character.GodMode = false; } } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/NPCWaitAction.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/NPCWaitAction.cs index 487e06ca9..93e37a32e 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/NPCWaitAction.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/NPCWaitAction.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; @@ -14,7 +14,10 @@ namespace Barotrauma [Serialize(true, IsPropertySaveable.Yes, description: "Should the NPC start or stop waiting?")] public bool Wait { get; set; } - + + [Serialize(true, IsPropertySaveable.Yes, description: "The event actions reset when a GoTo action makes the event jump to a different point. Should the NPC stop waiting when the event resets?")] + public bool AbandonOnReset { get; set; } + [Serialize(AIObjectiveManager.MaxObjectivePriority, IsPropertySaveable.Yes, description: "AI priority for the action. Uses 100 by default, which is the absolute maximum for any objectives, " + "meaning nothing can be prioritized over it, including the emergency objectives, such as find safety and combat." + "Setting the priority to 70 would function like a regular order, but with the highest priority." + @@ -76,7 +79,7 @@ namespace Barotrauma public override void Reset() { - if (affectedNpcs != null) + if (affectedNpcs != null && AbandonOnReset) { foreach (var npc in affectedNpcs) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/SpawnAction.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/SpawnAction.cs index aead92a1d..4974504fc 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/SpawnAction.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/EventActions/SpawnAction.cs @@ -367,7 +367,7 @@ namespace Barotrauma SpawnType? spawnPointType = null; if (!ignoreSpawnPointType) { spawnPointType = SpawnPointType; } - return GetSpawnPos(SpawnLocation, spawnPointType, targetModuleTags, SpawnPointTag.ToEnumerable(), requireTaggedSpawnPoint: RequireSpawnPointTag, allowInPlayerView: AllowInPlayerView); + return GetSpawnPos(SpawnLocation, spawnPointType, targetModuleTags, SpawnPointTag.IsEmpty ? null : SpawnPointTag.ToEnumerable(), requireTaggedSpawnPoint: RequireSpawnPointTag, allowInPlayerView: AllowInPlayerView); } private static bool IsValidSubmarineType(SpawnLocationType spawnLocation, Submarine submarine) @@ -422,12 +422,32 @@ namespace Barotrauma } if (spawnpointTags != null && spawnpointTags.Any()) { - var spawnPoints = potentialSpawnPoints.Where(wp => spawnpointTags.Any(tag => wp.Tags.Contains(tag) && wp.ConnectedDoor == null && wp.IsTraversable)); - if (requireTaggedSpawnPoint || spawnPoints.Any()) + var spawnPointsWithTag = potentialSpawnPoints.Where(wp => spawnpointTags.Any(tag => wp.Tags.Contains(tag) && wp.ConnectedDoor == null && wp.IsTraversable)); + if (requireTaggedSpawnPoint || spawnPointsWithTag.Any()) { - potentialSpawnPoints = spawnPoints.ToList(); + potentialSpawnPoints = spawnPointsWithTag.ToList(); + } + else + { + //no spawnpoints with the tag we want -> choose something with no tags + TryGetSpawnPointsWithNoTag(); } } + else + { + //if no tags are specified, prefer a spawnpoint with no tags, i.e. prefer a "generic" spawnpoint instead of some special one like a jail spawnpoint + TryGetSpawnPointsWithNoTag(); + } + + void TryGetSpawnPointsWithNoTag() + { + var spawnPointsWithNoTag = potentialSpawnPoints.Where(wp => wp.Tags.None()); + if (spawnPointsWithNoTag.Any()) + { + potentialSpawnPoints = spawnPointsWithNoTag.ToList(); + } + } + if (potentialSpawnPoints.None()) { if (requireTaggedSpawnPoint && spawnpointTags != null && spawnpointTags.Any()) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/EventManager.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/EventManager.cs index 842110b0f..01009f1db 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/EventManager.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/EventManager.cs @@ -777,7 +777,15 @@ namespace Barotrauma var locationType = location.GetLocationTypeToDisplay(); bool includeGenericEvents = level.Type == LevelData.LevelType.LocationConnection || !locationType.IgnoreGenericEvents; if (includeGenericEvents && eventSet.LocationTypeIdentifiers == null) { return true; } - return eventSet.LocationTypeIdentifiers != null && eventSet.LocationTypeIdentifiers.Any(identifier => identifier == locationType.Identifier); + if (eventSet.LocationTypeIdentifiers == null) { return false; } + + // EventLocationType is used to have the event set consider the location id as something else, for example "city" to get events that go to city locations + bool hasMatchingEventLocationId = !locationType.EventLocationType.IsEmpty && + eventSet.LocationTypeIdentifiers.Contains(locationType.EventLocationType); + + bool hasMatchingLocationId = eventSet.LocationTypeIdentifiers.Contains(locationType.Identifier); + + return hasMatchingEventLocationId || hasMatchingLocationId; } private Location GetEventLocation() diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/AbandonedOutpostMission.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/AbandonedOutpostMission.cs index 67c18ce0d..09703cf05 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/AbandonedOutpostMission.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/AbandonedOutpostMission.cs @@ -156,9 +156,34 @@ namespace Barotrauma } } } + + private int previousKillTargetsRemaining = -1; + + private void TrackKillTargetCount() + { + if (requireKill.Count == 0) { return; } + + if (previousKillTargetsRemaining == -1) + { + previousKillTargetsRemaining = requireKill.Count(); + } + + int killTargetsRemaining = requireKill.Count(c => !c.Removed && !c.IsDead && !(c.LockHands && c.Submarine == Submarine.MainSub)); + // at least one of the targets have been eliminated + if (killTargetsRemaining < previousKillTargetsRemaining) + { +#if CLIENT + SteamTimelineManager.OnOutpostTargetEliminated(this); +#endif + } + + previousKillTargetsRemaining = killTargetsRemaining; + } protected override void UpdateMissionSpecific(float deltaTime) { + TrackKillTargetCount(); + if (State != HostagesKilledState) { if (requireRescue.Any(r => r.Removed || r.IsDead)) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/EscortMission.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/EscortMission.cs index 15d69334c..473006b60 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/EscortMission.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/EscortMission.cs @@ -9,14 +9,30 @@ namespace Barotrauma { partial class EscortMission : Mission { - private readonly ContentXElement itemConfig; + private readonly ContentXElement terroristItemConfig; private readonly Dictionary> characterStatusEffects = new Dictionary>(); + /// + /// Number of escorted characters by default. + /// private readonly int baseEscortedCharacters; + /// + /// A scaling factor for the number of escorted characters, relative to the recommended crew size of the sub. The total amount of escorted characters is calculated as + /// baseEscortedCharacters + scalingEscortedCharacters * (RecommendedCrewSizeMin + RecommendedCrewSizeMax) / 2 + /// private readonly float scalingEscortedCharacters; + /// + /// The probability for the escorted characters to be "terrorists" (turning them hostile when the sub has progressed enough in the level). + /// A value of 0.5 would mean about half of the characters are terrorist, 1 would mean they all are. There's 20% of randomness applied to the value to make it less predictable. + /// private readonly float terroristChance; + /// + /// Dialog tag the terrorists use in their dialog when they become hostile. + /// + private readonly string terroristAnnounceDialogTag; + private int calculatedReward; private Submarine missionSub; @@ -26,7 +42,6 @@ namespace Barotrauma private bool terroristsShouldAct = false; private float terroristDistanceSquared; private const string TerroristTeamChangeIdentifier = "terrorist"; - private readonly string terroristAnnounceDialogTag = string.Empty; public EscortMission(MissionPrefab prefab, Location[] locations, Submarine sub) : base(prefab, locations, sub) @@ -35,8 +50,10 @@ namespace Barotrauma baseEscortedCharacters = prefab.ConfigElement.GetAttributeInt("baseescortedcharacters", 1); scalingEscortedCharacters = prefab.ConfigElement.GetAttributeFloat("scalingescortedcharacters", 0); terroristChance = prefab.ConfigElement.GetAttributeFloat("terroristchance", 0); - itemConfig = prefab.ConfigElement.GetChildElement("TerroristItems"); - terroristAnnounceDialogTag = prefab.ConfigElement.GetAttributeString("terroristannouncedialogtag", string.Empty); + terroristItemConfig = prefab.ConfigElement.GetChildElement("TerroristItems"); + terroristAnnounceDialogTag = + prefab.ConfigElement.GetAttributeString("dialogterroristannounce", + prefab.ConfigElement.GetAttributeString("terroristAnnounceDialogTag", string.Empty)); CalculateReward(); } @@ -94,35 +111,29 @@ namespace Barotrauma randSync = Rand.RandSync.Unsynced; } - List humanPrefabsToSpawn = new List(); + List<(HumanPrefab humanPrefab, List statusEffects)> humanPrefabsToSpawn = new List<(HumanPrefab humanPrefab, List statusEffects)>(); foreach (ContentXElement characterElement in characterConfig.Elements()) { int count = CalculateScalingEscortedCharacterCount(inMission: true); var humanPrefab = GetHumanPrefabFromElement(characterElement); for (int i = 0; i < count; i++) { - humanPrefabsToSpawn.Add(humanPrefab); - } - foreach (var element in characterElement.Elements()) - { - if (element.NameAsIdentifier() == "statuseffect") + List characterStatusEffects = new List(); + foreach (var element in characterElement.Elements()) { - var newEffect = StatusEffect.Load(element, parentDebugName: Prefab.Name.Value); - if (newEffect == null) { continue; } - if (!characterStatusEffects.ContainsKey(humanPrefab)) + if (element.NameAsIdentifier() == "statuseffect") { - characterStatusEffects[humanPrefab] = new List { newEffect }; + var newEffect = StatusEffect.Load(element, parentDebugName: Prefab.Name.Value); + if (newEffect == null) { continue; } + characterStatusEffects.Add(newEffect); } - else - { - characterStatusEffects[humanPrefab].Add(newEffect); - } } + humanPrefabsToSpawn.Add((humanPrefab, characterStatusEffects)); } } //if any of the escortees have a job defined, try to use a spawnpoint designated for that job - foreach (var humanPrefab in humanPrefabsToSpawn) + foreach ((var humanPrefab, var statusEffectList) in humanPrefabsToSpawn) { if (humanPrefab == null || humanPrefab.Job.IsEmpty || humanPrefab.Job == "any") { continue; } var jobPrefab = humanPrefab.GetJobPrefab(randSync); @@ -136,23 +147,19 @@ namespace Barotrauma } } } - foreach (var humanPrefab in humanPrefabsToSpawn) + foreach ((var humanPrefab, var statusEffectList) in humanPrefabsToSpawn) { Character spawnedCharacter = CreateHuman(humanPrefab, characters, characterItems, Submarine.MainSub, CharacterTeamType.FriendlyNPC, explicitStayInHullPos, humanPrefabRandSync: randSync); if (spawnedCharacter.AIController is HumanAIController humanAI) { humanAI.InitMentalStateManager(); } - if (characterStatusEffects.TryGetValue(humanPrefab, out var statusEffectList)) + foreach (var statusEffect in statusEffectList) { - foreach (var statusEffect in statusEffectList) - { - statusEffect.Apply(statusEffect.type, 1.0f, spawnedCharacter, spawnedCharacter); - } - } + statusEffect.Apply(statusEffect.type, 1.0f, spawnedCharacter, spawnedCharacter); + } } - if (terroristChance > 0f) { int terroristCount = (int)Math.Ceiling(terroristChance * Rand.Range(0.8f, 1.2f) * characters.Count); @@ -256,13 +263,23 @@ namespace Barotrauma character.TryAddNewTeamChange(TerroristTeamChangeIdentifier, new ActiveTeamChange(CharacterTeamType.None, ActiveTeamChange.TeamChangePriorities.Willful, aggressiveBehavior: true)); if (!string.IsNullOrEmpty(terroristAnnounceDialogTag)) { - character.Speak(TextManager.Get("dialogterroristannounce").Value, null, Rand.Range(0.5f, 3f)); + character.Speak(TextManager.Get(terroristAnnounceDialogTag).Value, null, Rand.Range(0.5f, 3f)); } - ContentXElement randomElement = itemConfig.Elements().GetRandomUnsynced(e => e.GetAttributeFloat(0f, "mindifficulty") <= Level.Loaded.Difficulty); - if (randomElement != null) + foreach (var itemElement in terroristItemConfig.Elements()) { - HumanPrefab.InitializeItem(character, randomElement, character.Submarine, humanPrefab: null, createNetworkEvents: true); + float levelDifficulty = Level.Loaded?.Difficulty ?? 0.0f; + var selectedItemElement = itemElement; + if (itemElement.NameAsIdentifier() == "chooserandom".ToIdentifier()) + { + selectedItemElement = itemElement.Elements().GetRandomUnsynced(e => e.GetAttributeFloat(0f, "mindifficulty") <= levelDifficulty); + } + if (selectedItemElement != null) + { + if (levelDifficulty < selectedItemElement.GetAttributeFloat(0f, "mindifficulty")) { continue; } + HumanPrefab.InitializeItem(character, selectedItemElement, character.Submarine, humanPrefab: null, createNetworkEvents: true); + } } + } } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/Mission.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/Mission.cs index e4edf96d7..757561538 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/Mission.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/Mission.cs @@ -26,6 +26,7 @@ namespace Barotrauma { if (state != value) { + int previousState = state; state = value; TryTriggerEvents(state); #if SERVER @@ -38,6 +39,7 @@ namespace Barotrauma #endif ShowMessage(State); OnMissionStateChanged?.Invoke(this); + MissionStateChanged(previousState); } } } @@ -198,6 +200,11 @@ namespace Barotrauma Messages = messages.ToImmutableArray(); characterConfig = prefab.ConfigElement.GetChildElement("Characters"); + if (prefab.ConfigElement.GetChildElements("Characters").Count() > 1) + { + DebugConsole.AddWarning($"Error in mission {Prefab.Identifier}: multiple elements found. Only the first one will be used.", + contentPackage: prefab.ContentPackage); + } } public LocalizedString ReplaceVariablesInMissionMessage(LocalizedString message, Submarine sub, bool replaceReward = true) @@ -214,6 +221,8 @@ namespace Barotrauma } return message; } + + protected virtual void MissionStateChanged(int previousState) {} public virtual void SetLevel(LevelData level) { } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/MissionPrefab.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/MissionPrefab.cs index b692d0725..25829bd93 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/MissionPrefab.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/MissionPrefab.cs @@ -109,6 +109,8 @@ namespace Barotrauma public readonly bool AllowRetry; + public readonly bool ShowSonarLabels; + public readonly bool ShowInMenus, ShowStartMessage; public readonly bool IsSideObjective; @@ -219,11 +221,12 @@ namespace Barotrauma } } - Reward = element.GetAttributeInt("reward", 1); - ExperienceMultiplier = element.GetAttributeFloat("experiencemultiplier", 1.0f); - AllowRetry = element.GetAttributeBool("allowretry", false); - ShowInMenus = element.GetAttributeBool("showinmenus", true); - ShowStartMessage = element.GetAttributeBool("showstartmessage", true); + Reward = element.GetAttributeInt(nameof(Reward), 1); + ExperienceMultiplier = element.GetAttributeFloat(nameof(ExperienceMultiplier), 1.0f); + AllowRetry = element.GetAttributeBool(nameof(AllowRetry), false); + ShowSonarLabels = element.GetAttributeBool(nameof(ShowSonarLabels), true); + ShowInMenus = element.GetAttributeBool(nameof(ShowInMenus), true); + ShowStartMessage = element.GetAttributeBool(nameof(ShowStartMessage), true); IsSideObjective = element.GetAttributeBool("sideobjective", false); RequireWreck = element.GetAttributeBool(nameof(RequireWreck), false); @@ -237,11 +240,12 @@ namespace Barotrauma BlockLocationTypeChanges = element.GetAttributeBool(nameof(BlockLocationTypeChanges), false); RequiredLocationFaction = element.GetAttributeIdentifier(nameof(RequiredLocationFaction), Identifier.Empty); - Commonness = element.GetAttributeInt("commonness", 1); - AllowOtherMissionsInLevel = element.GetAttributeBool("allowothermissionsinlevel", true); + Commonness = element.GetAttributeInt(nameof(Commonness), 1); + AllowOtherMissionsInLevel = element.GetAttributeBool(nameof(AllowOtherMissionsInLevel), true); + if (element.GetAttribute("difficulty") != null) { - int difficulty = element.GetAttributeInt("difficulty", MinDifficulty); + int difficulty = element.GetAttributeInt(nameof(Difficulty), MinDifficulty); Difficulty = Math.Clamp(difficulty, MinDifficulty, MaxDifficulty); } MinLevelDifficulty = element.GetAttributeInt(nameof(MinLevelDifficulty), MinLevelDifficulty); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/MonsterMission.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/MonsterMission.cs index 4b3e1a2b8..5037081ce 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/MonsterMission.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/MonsterMission.cs @@ -173,6 +173,17 @@ namespace Barotrauma } } + protected override void MissionStateChanged(int previousState) + { + // state of 1+ here means the mission is completed + if (previousState == 0 && State >= 1) + { +#if CLIENT + SteamTimelineManager.OnMonsterMissionTargetsKilled(this); +#endif + } + } + protected override void UpdateMissionSpecific(float deltaTime) { switch (State) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/SalvageMission.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/SalvageMission.cs index 3f958c88d..7f2dbba0a 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/SalvageMission.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/SalvageMission.cs @@ -92,13 +92,38 @@ namespace Barotrauma set { if (value == state) { return; } + bool wasRetrieved = Retrieved; state = value; #if SERVER GameMain.Server?.UpdateMissionState(mission); #endif + if (!wasRetrieved && Retrieved) + { + OnTargetRetrieved(); + } + else if (state == RetrievalState.PickedUp) + { + OnTargetPickedUp(); + } } } + private void OnTargetRetrieved() + { + if (Item == null) { return; } +#if CLIENT + SteamTimelineManager.OnMissionTargetRetrieved(Item, mission); +#endif + } + + private void OnTargetPickedUp() + { + if (Item == null) { return; } +#if CLIENT + SteamTimelineManager.OnMissionTargetPickedUp(Item, mission); +#endif + } + public bool Interacted; private readonly SalvageMission mission; @@ -469,13 +494,13 @@ namespace Barotrauma target.Item.ExternalHighlight = true; #endif target.Item.UpdateTransform(); - if (target.Item.CurrentHull == null) + if (target.Item.CurrentHull == null && target.Item.body != null) { //prevent the body from moving if it spawned outside the hulls (we don't want it e.g. falling to the bottom of a cave or into the abyss) target.Item.body.FarseerBody.BodyType = BodyType.Kinematic; } } - else if (target.RequiredRetrievalState == Target.RetrievalState.Interact) + if (target.RequiredRetrievalState == Target.RetrievalState.Interact) { target.Item.OnInteract += () => { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/ScanMission.cs b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/ScanMission.cs index 288e37b92..e388b2908 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/ScanMission.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Events/Missions/ScanMission.cs @@ -168,6 +168,17 @@ namespace Barotrauma } } + protected override void MissionStateChanged(int previousState) + { + // detect successful scanned targets increasing after scan is completed + if (previousState < State) + { +#if CLIENT + SteamTimelineManager.OnScanSuccessful(this); +#endif + } + } + private void GetScanners() { foreach (var startingItem in startingItems) diff --git a/Barotrauma/BarotraumaShared/SharedSource/GameSession/Data/Reputation.cs b/Barotrauma/BarotraumaShared/SharedSource/GameSession/Data/Reputation.cs index a24303b83..5037e693d 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/GameSession/Data/Reputation.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/GameSession/Data/Reputation.cs @@ -206,7 +206,9 @@ namespace Barotrauma LocalizedString reputationName = GetReputationName(normalizedValue); LocalizedString formattedReputation = TextManager.GetWithVariables("reputationformat", ("[reputationname]", reputationName), - ("[reputationvalue]", ((int)Math.Round(value)).ToString())); + //simply cast to float (dropping the decimals) + //we don't want any rounding here, otherwise it might look like you have enough rep to reach some threshold when you're actually some fraction off + ("[reputationvalue]", ((int)value).ToString())); if (addColorTags) { formattedReputation = $"‖color:{XMLExtensions.ToStringHex(GetReputationColor(normalizedValue))}‖{formattedReputation}‖end‖"; diff --git a/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameModes/CampaignMode.cs b/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameModes/CampaignMode.cs index ff5a4ade7..a64925b36 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameModes/CampaignMode.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameModes/CampaignMode.cs @@ -160,10 +160,34 @@ namespace Barotrauma protected set; } - public bool PurchasedLostShuttlesInLatestSave, PurchasedHullRepairsInLatestSave, PurchasedItemRepairsInLatestSave; + /// + /// Has recovery of lost shuttles been purchased in the latest save? Determines whether the shuttles should be recovered when loading into the round. + /// + public bool PurchasedLostShuttlesInLatestSave; + /// + /// Have hull repairs been purchased in the latest save? Determines whether the walls will be repaired when loading into the round. + /// + public bool PurchasedHullRepairsInLatestSave; + + /// + /// Has repairing damaged items been purchased in the latest save? Determines whether the items will be repaired when loading into the round. + /// + public bool PurchasedItemRepairsInLatestSave; + + /// + /// Have hull repairs been purchased on the current round? + /// public virtual bool PurchasedHullRepairs { get; set; } + + /// + /// Has recovery of lost shuttles been purchased on the current round? + /// public virtual bool PurchasedLostShuttles { get; set; } + + /// + /// Has repairing damaged items been purchased on the current round? + /// public virtual bool PurchasedItemRepairs { get; set; } public bool DivingSuitWarningShown; @@ -441,6 +465,16 @@ namespace Barotrauma currentLocation.DeselectMission(mission); } } + + foreach (var mission in currentLocation.AvailableMissions) + { + //if the mission isn't shown in menus, it cannot be selected by the player -> must be something that is supposed to be automatically selected + if (!mission.Prefab.ShowInMenus) + { + currentLocation.SelectMission(mission); + } + } + if (levelData.HasBeaconStation && !levelData.IsBeaconActive && Missions.None(m => m.Prefab.Type == Tags.MissionTypeBeacon)) { var beaconMissionPrefabs = MissionPrefab.Prefabs.Where(m => m.IsSideObjective && m.Type == Tags.MissionTypeBeacon); @@ -1632,6 +1666,70 @@ namespace Barotrauma parentElement?.Add(petsElement); } + /// + /// Loads the parts of a campaign save that are the same between single player and multiplayer saves. + /// + public void LoadSaveSharedSingleAndMultiplayer(XElement element) + { + PurchasedLostShuttlesInLatestSave = element.GetAttributeBool("purchasedlostshuttles", false); + PurchasedHullRepairsInLatestSave = element.GetAttributeBool("purchasedhullrepairs", false); + PurchasedItemRepairsInLatestSave = element.GetAttributeBool("purchaseditemrepairs", false); + CheatsEnabled = element.GetAttributeBool("cheatsenabled", false); + if (CheatsEnabled) + { + DebugConsole.CheatsEnabled = true; + if (!AchievementManager.CheatsEnabled) + { + AchievementManager.CheatsEnabled = true; +#if CLIENT + new GUIMessageBox("Cheats enabled", "Cheat commands have been enabled on the server. You will not receive achievements until you restart the game."); +#else + DebugConsole.NewMessage("Cheat commands have been enabled.", Color.Red); +#endif + } + } + + //backwards compatibility for saves made prior to the addition of personal wallets + int oldMoney = element.GetAttributeInt("money", 0); + if (oldMoney > 0) + { + Bank = new Wallet(Option.None()) + { + Balance = oldMoney + }; + } + + + foreach (var subElement in element.Elements()) + { + switch (subElement.Name.ToString().ToLowerInvariant()) + { + case "cargo": + CargoManager.LoadPurchasedItems(subElement); + break; + case "pendingupgrades": //backwards compatibility + case "upgrademanager": + UpgradeManager = new UpgradeManager(this, subElement, isSingleplayer: IsSinglePlayer); + break; + case "pets": + petsElement = subElement; + break; + case Wallet.LowerCaseSaveElementName: + Bank = new Wallet(Option.None(), subElement); + break; + case "stats": + LoadStats(subElement); + break; + case "eventmanager": + GameMain.GameSession.EventManager.Load(subElement); + break; + case "unlockedrecipe": + GameMain.GameSession.UnlockRecipe(subElement.GetAttributeIdentifier("identifier", Identifier.Empty), showNotifications: false); + break; + } + } + } + public void LoadPets() { if (petsElement != null) diff --git a/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameModes/MultiPlayerCampaign.cs index 80e30c2cf..bff64b674 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameModes/MultiPlayerCampaign.cs @@ -161,23 +161,7 @@ namespace Barotrauma /// private void Load(XElement element) { - PurchasedLostShuttlesInLatestSave = element.GetAttributeBool("purchasedlostshuttles", false); - PurchasedHullRepairsInLatestSave = element.GetAttributeBool("purchasedhullrepairs", false); - PurchasedItemRepairsInLatestSave = element.GetAttributeBool("purchaseditemrepairs", false); - CheatsEnabled = element.GetAttributeBool("cheatsenabled", false); - if (CheatsEnabled) - { - DebugConsole.CheatsEnabled = true; - if (!AchievementManager.CheatsEnabled) - { - AchievementManager.CheatsEnabled = true; -#if CLIENT - new GUIMessageBox("Cheats enabled", "Cheat commands have been enabled on the server. You will not receive achievements until you restart the game."); -#else - DebugConsole.NewMessage("Cheat commands have been enabled.", Color.Red); -#endif - } - } + LoadSaveSharedSingleAndMultiplayer(element); foreach (var subElement in element.Elements()) { @@ -215,30 +199,11 @@ namespace Barotrauma } } break; - case "upgrademanager": - case "pendingupgrades": - UpgradeManager = new UpgradeManager(this, subElement, isSingleplayer: false); - break; case "bots" when GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer: CrewManager.HasBots = subElement.GetAttributeBool("hasbots", false); CrewManager.AddCharacterElements(subElement); ActiveOrdersElement = subElement.GetChildElement("activeorders"); break; - case "cargo": - CargoManager?.LoadPurchasedItems(subElement); - break; - case "pets": - petsElement = subElement; - break; - case "stats": - LoadStats(subElement); - break; - case "eventmanager": - GameMain.GameSession.EventManager.Load(subElement); - break; - case Wallet.LowerCaseSaveElementName: - Bank = new Wallet(Option.None(), subElement); - break; #if SERVER case "traitormanager": GameMain.Server?.TraitorManager?.Load(subElement); @@ -253,15 +218,6 @@ namespace Barotrauma } } - int oldMoney = element.GetAttributeInt("money", 0); - if (oldMoney > 0) - { - Bank = new Wallet(Option.None()) - { - Balance = oldMoney - }; - } - UpgradeManager ??= new UpgradeManager(this); #if SERVER diff --git a/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameSession.cs b/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameSession.cs index 1512ee795..355687eb6 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameSession.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameSession.cs @@ -170,6 +170,9 @@ namespace Barotrauma public Submarine? Submarine { get; set; } + private readonly HashSet unlockedRecipes = new HashSet(); + public IEnumerable UnlockedRecipes => unlockedRecipes; + public CampaignDataPath DataPath { get; set; } public bool TraitorsEnabled => @@ -275,6 +278,10 @@ namespace Barotrauma } } break; + //NOTE: if you're adding something that's supposed to load something that's persistent in a campaign, + //this is probably not the correct place! This is where the GameSession itself is initialized, + //and if you let's say quit to the server lobby and reload, this method won't be called again. + //You should probably add it to CampaignMode.LoadSaveSharedSingleAndMultiplayer } } } @@ -385,7 +392,7 @@ namespace Barotrauma var dummyLocations = new Location[2]; for (int i = 0; i < 2; i++) { - dummyLocations[i] = Location.CreateRandom(new Vector2((float)rand.NextDouble() * 10000.0f, (float)rand.NextDouble() * 10000.0f), null, rand, requireOutpost: true, forceLocationType); + dummyLocations[i] = Location.CreateRandom(new Vector2((float)rand.NextDouble() * 10000.0f, (float)rand.NextDouble() * 10000.0f), zone: null, biomeId: null, rand, requireOutpost: true, forceLocationType); } return dummyLocations; } @@ -401,6 +408,7 @@ namespace Barotrauma public void LoadPreviousSave() { + AchievementManager.OnRoundEnded(this, roundInterrupted: true); Submarine.Unload(); SaveUtil.LoadGame(DataPath); } @@ -1491,6 +1499,25 @@ namespace Barotrauma #endif } + public void UnlockRecipe(Identifier identifier, bool showNotifications) + { + if (unlockedRecipes.Add(identifier)) + { +#if CLIENT + if (showNotifications) + { + foreach (var character in GetSessionCrewCharacters(CharacterType.Both)) + { + LocalizedString recipeName = TextManager.Get($"entityname.{identifier}").Fallback(identifier.Value); + character.AddMessage(TextManager.GetWithVariable("recipeunlockednotification", "[name]", recipeName).Value, GUIStyle.Yellow, playSound: true); + } + } +#else + GameMain.Server.UnlockRecipe(identifier); +#endif + } + } + public static bool IsCompatibleWithEnabledContentPackages(IList contentPackageNames, out LocalizedString errorMsg) { errorMsg = ""; @@ -1602,9 +1629,11 @@ namespace Barotrauma ownedSubsElement.Add(new XElement("sub", new XAttribute("name", ownedSub.Name))); } } + if (Map != null) { rootElement.Add(new XAttribute("mapseed", Map.Seed)); } rootElement.Add(new XAttribute("selectedcontentpackagenames", string.Join("|", ContentPackageManager.EnabledPackages.All.Where(cp => cp.HasMultiplayerSyncedContent).Select(cp => cp.Name.Replace("|", @"\|"))))); + XElement permadeathsElement = new XElement("permadeaths"); foreach (var kvp in permadeathsPerAccount) diff --git a/Barotrauma/BarotraumaShared/SharedSource/GameSession/UpgradeManager.cs b/Barotrauma/BarotraumaShared/SharedSource/GameSession/UpgradeManager.cs index 223ff5c0e..8d3067f55 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/GameSession/UpgradeManager.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/GameSession/UpgradeManager.cs @@ -169,12 +169,14 @@ namespace Barotrauma /// Purchased upgrades are temporarily stored in and they are applied /// after the next round starts similarly how items are spawned in the stowage room after the round starts. /// - public void PurchaseUpgrade(UpgradePrefab prefab, UpgradeCategory category, bool force = false, Client? client = null) + public bool TryPurchaseUpgrade(UpgradePrefab prefab, UpgradeCategory category, bool force = false, Client? client = null) { + if (!HasPermissionToManageUpgrades(client)) { return false; } + if (!CanUpgradeSub()) { DebugConsole.ThrowError("Cannot upgrade when switching to another submarine."); - return; + return false; } int price = prefab.Price.GetBuyPrice(prefab, GetUpgradeLevel(prefab, category), Campaign.Map?.CurrentLocation); @@ -185,7 +187,7 @@ namespace Barotrauma if (currentLevel + 1 > maxLevel) { DebugConsole.ThrowError($"Tried to purchase \"{prefab.Name}\" over the max level! ({newLevel} > {maxLevel}). The transaction has been cancelled."); - return; + return false; } bool TryTakeResources(Character character) @@ -203,17 +205,17 @@ namespace Barotrauma switch (GameMain.NetworkMember) { case null when Character.Controlled is { } controlled: // singleplayer - if (!TryTakeResources(controlled)) { return; } + if (!TryTakeResources(controlled)) { return false; } break; case { IsClient: true }: - if (!prefab.HasResourcesToUpgrade(Character.Controlled, newLevel)) { return; } + if (!prefab.HasResourcesToUpgrade(Character.Controlled, newLevel)) { return false; } break; case { IsServer: true } when client?.Character is { } character: - if (!TryTakeResources(character)) { return; } + if (!TryTakeResources(character)) { return false; } break; default: DebugConsole.ThrowError($"Tried to purchase \"{prefab.Name}\" without a player."); - return; + return false; } } @@ -270,11 +272,15 @@ namespace Barotrauma PurchasedUpgrades.Add(new PurchasedUpgrade(prefab, category)); #endif OnUpgradesChanged?.Invoke(this); + + return true; } else { DebugConsole.ThrowError("Tried to purchase an upgrade with insufficient funds, the transaction has not been completed.\n" + $"Upgrade: {prefab.Name}, Cost: {price}, Have: {Campaign.GetWallet(client).Balance}"); + + return false; } } @@ -297,6 +303,8 @@ namespace Barotrauma /// public void PurchaseItemSwap(Item itemToRemove, ItemPrefab itemToInstall, bool isNetworkMessage = false, Client? client = null) { + if (!HasPermissionToManageUpgrades(client)) { return; } + if (!CanUpgradeSub()) { DebugConsole.ThrowError("Cannot swap items when switching to another submarine."); @@ -398,8 +406,10 @@ namespace Barotrauma /// /// Cancels the currently pending item swap, or uninstalls the item if there's no swap pending /// - public void CancelItemSwap(Item itemToRemove, bool force = false) + public void CancelItemSwap(Item itemToRemove, bool force = false, Client? client = null) { + if (!HasPermissionToManageUpgrades(client)) { return; } + if (!CanUpgradeSub()) { DebugConsole.ThrowError("Cannot swap items when switching to another submarine."); @@ -757,6 +767,18 @@ namespace Barotrauma Campaign.PendingSubmarineSwitch.Name == Submarine.MainSub.Info.Name; } + public bool HasPermissionToManageUpgrades(Client? client = null) + { + if (!GameMain.IsMultiplayer) { return true; } + +#if SERVER + if (client is null) { return false; } + return CampaignMode.AllowedToManageCampaign(client, ClientPermissions.ManageCampaign); +#elif CLIENT + return CampaignMode.AllowedToManageCampaign(ClientPermissions.ManageCampaign); +#endif + } + public void Save(XElement? parent) { if (parent == null) { return; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/CharacterInventory.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/CharacterInventory.cs index 6675da68d..15eb5f958 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/CharacterInventory.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/CharacterInventory.cs @@ -220,6 +220,22 @@ namespace Barotrauma return false; } + + /// + /// Can the item be put in the inventory in a slot of the specified type (i.e. is there a suitable free slot or a stack the item can be put in). + /// + public bool CanBePut(Item item, InvSlotType slotType) + { + for (int i = 0; i < capacity; i++) + { + if (slotType.HasFlag(SlotTypes[i])) + { + if (CanBePutInSlot(item, i)) { return true; } + } + } + return false; + } + public override bool CanBePutInSlot(Item item, int i, bool ignoreCondition = false) { return diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/DockingPort.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/DockingPort.cs index 402634f42..00e85a1c2 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/DockingPort.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/DockingPort.cs @@ -179,7 +179,8 @@ namespace Barotrauma.Items.Components var prevDockingTarget = DockingTarget; Undock(applyEffects: false); Dock(prevDockingTarget); - Lock(isNetworkMessage: true, applyEffects: false); + //don't move subs at this point, it will mess up the placement logic when flipping multi-part subs + Lock(isNetworkMessage: true, applyEffects: false, moveSubs: false); } } @@ -281,7 +282,7 @@ namespace Barotrauma.Items.Components OnDocked = null; } - public void Lock(bool isNetworkMessage, bool applyEffects = true) + public void Lock(bool isNetworkMessage, bool applyEffects = true, bool moveSubs = true) { #if CLIENT if (GameMain.Client != null && !isNetworkMessage) { return; } @@ -312,16 +313,19 @@ namespace Barotrauma.Items.Components ApplyStatusEffects(ActionType.OnUse, 1.0f); } - Vector2 jointDiff = joint.WorldAnchorB - joint.WorldAnchorA; - if (item.Submarine.PhysicsBody.Mass < DockingTarget.item.Submarine.PhysicsBody.Mass || - DockingTarget.item.Submarine.Info.IsOutpost) + if (moveSubs) { - item.Submarine.SubBody.SetPosition(item.Submarine.SubBody.Position + ConvertUnits.ToDisplayUnits(jointDiff)); - } - else if (DockingTarget.item.Submarine.PhysicsBody.Mass < item.Submarine.PhysicsBody.Mass || - item.Submarine.Info.IsOutpost) - { - DockingTarget.item.Submarine.SubBody.SetPosition(DockingTarget.item.Submarine.SubBody.Position - ConvertUnits.ToDisplayUnits(jointDiff)); + Vector2 jointDiff = joint.WorldAnchorB - joint.WorldAnchorA; + if (item.Submarine.PhysicsBody.Mass < DockingTarget.item.Submarine.PhysicsBody.Mass || + DockingTarget.item.Submarine.Info.IsOutpost) + { + item.Submarine.SubBody.SetPosition(item.Submarine.SubBody.Position + ConvertUnits.ToDisplayUnits(jointDiff)); + } + else if (DockingTarget.item.Submarine.PhysicsBody.Mass < item.Submarine.PhysicsBody.Mass || + item.Submarine.Info.IsOutpost) + { + DockingTarget.item.Submarine.SubBody.SetPosition(DockingTarget.item.Submarine.SubBody.Position - ConvertUnits.ToDisplayUnits(jointDiff)); + } } ConnectWireBetweenPorts(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Growable.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Growable.cs index 2d593d6a4..aafbdecd3 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Growable.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Growable.cs @@ -349,31 +349,31 @@ namespace Barotrauma.Items.Components // used for debugging where a vine failed to grow public readonly HashSet FailedRectangles = new HashSet(); - [Serialize(1f, IsPropertySaveable.Yes, "How fast the plant grows.")] + [Serialize(1f, IsPropertySaveable.Yes, "How fast the plant grows. Value of 1 means a vine attempts to grow every 10 seconds while 2 and 0.5 mean every 5 and 20 seconds respectively.")] public float GrowthSpeed { get; set; } - [Serialize(100f, IsPropertySaveable.Yes, "How long the plant can go without watering.")] - public float MaxHealth { get; set; } + [Serialize(100f, IsPropertySaveable.Yes, "How much water the plant can hold. Affects how long the plant can survive without water.")] + public float MaxWater { get; set; } - [Serialize(1f, IsPropertySaveable.Yes, "How much damage the plant takes while in water.")] - public float FloodTolerance { get; set; } + [Serialize(1f, IsPropertySaveable.Yes, "How much extra water the plant uses per second while it is submerged in a flooded hull.")] + public float ExtraWaterUsedPerSecondWhileFlooded { get; set; } - [Serialize(1f, IsPropertySaveable.Yes, "How much damage the plant takes while growing.")] - public float Hardiness { get; set; } + [Serialize(1f, IsPropertySaveable.Yes, "How much water the plant consumes passively per second.")] + public float WaterUsedPerSecond { get; set; } - [Serialize(0.01f, IsPropertySaveable.Yes, "How often a seed is produced.")] - public float SeedRate { get; set; } + [Serialize(0.01f, IsPropertySaveable.Yes, "Percentage chance of a seed item being produced on growth ticks (every 10 seconds without a multiplier). 0.01 means 1% chance. Not used in vanilla plants.")] + public float SeedSpawnChance { get; set; } - [Serialize(0.01f, IsPropertySaveable.Yes, "How often a product item is produced.")] - public float ProductRate { get; set; } + [Serialize(0.01f, IsPropertySaveable.Yes, "How often a product item is produced on growth ticks (every 10 seconds without a multiplier). 0.01 means 1% chance.")] + public float ProductSpawnChance { get; set; } - [Serialize(0.5f, IsPropertySaveable.Yes, "Probability of an attribute being randomly modified in a newly produced seed.")] + [Serialize(0.5f, IsPropertySaveable.Yes, "Completely unused property that was added on the first design pass but due to the first pass being too complex was never used and now it is used by mods so it cannot be removed.")] public float MutationProbability { get; set; } [Serialize("1.0,1.0,1.0,1.0", IsPropertySaveable.Yes, "Color of the flowers.")] public Color FlowerTint { get; set; } - [Serialize(3, IsPropertySaveable.Yes, "Number of flowers drawn when fully grown")] + [Serialize(3, IsPropertySaveable.Yes, "Number of flowers drawn.")] public int FlowerQuantity { get; set; } [Serialize(0.25f, IsPropertySaveable.Yes, "Size of the flower sprites.")] @@ -403,9 +403,12 @@ namespace Barotrauma.Items.Components [Serialize("1,1,1,1", IsPropertySaveable.Yes, "Probability for the plant to grow in a direction.")] public Vector4 GrowthWeights { get; set; } - [Serialize(0.0f, IsPropertySaveable.Yes, "How much damage is taken from fires.")] + [Serialize(0.0f, IsPropertySaveable.Yes, "How much water is lost due to fires every 10 seconds.")] public float FireVulnerability { get; set; } + [Serialize("0.0, 0.0", IsPropertySaveable.Yes, "Modifier to the percentage of product and seed items produced before the plant is fully grown based on how many vines have been grown. 0 would mean no products or seeds are produced while 0.5 would mean half of the normal amount.")] + public Vector2 LinearProductAndSeedMultiplierBeforeFullyGrown { get; set; } + private const float increasedDeathSpeed = 10f; private bool accelerateDeath; private float health; @@ -417,7 +420,7 @@ namespace Barotrauma.Items.Components public float Health { get => health; - set => health = Math.Clamp(value, 0, MaxHealth); + set => health = Math.Clamp(value, 0, MaxWater); } public bool Decayed { get; set; } @@ -441,7 +444,14 @@ namespace Barotrauma.Items.Components { SerializableProperty.DeserializeProperties(this, element); - Health = MaxHealth; + // backwards compatibility + MaxWater = element.GetAttributeFloat("maxhealth", MaxWater); + WaterUsedPerSecond = element.GetAttributeFloat("hardiness", WaterUsedPerSecond); + ExtraWaterUsedPerSecondWhileFlooded = element.GetAttributeFloat("floodtolerance", ExtraWaterUsedPerSecondWhileFlooded); + ProductSpawnChance = element.GetAttributeFloat("productrate", ProductSpawnChance); + SeedSpawnChance = element.GetAttributeFloat("seedrate", SeedSpawnChance); + + Health = MaxWater; if (element.HasElements) { @@ -492,10 +502,7 @@ namespace Barotrauma.Items.Components { if (Decayed) { return; } - if (FullyGrown) - { - TryGenerateProduct(planter, slot); - } + TryGenerateProduct(planter, slot); if (Health > 0) { @@ -504,11 +511,11 @@ namespace Barotrauma.Items.Components // fertilizer makes the plant tick faster, compensate by halving water requirement float multipler = planter.Fertilizer > 0 ? 0.5f : 1f; - Health -= (accelerateDeath ? Hardiness * increasedDeathSpeed : Hardiness) * multipler; + Health -= (accelerateDeath ? WaterUsedPerSecond * increasedDeathSpeed : WaterUsedPerSecond) * multipler; if (planter.Item.InWater) { - Health -= FloodTolerance * multipler; + Health -= ExtraWaterUsedPerSecondWhileFlooded * multipler; } #if SERVER if (FullyGrown) @@ -535,7 +542,7 @@ namespace Barotrauma.Items.Components private void UpdateBranchHealth() { - Color healthColor = Color.White * (1.0f - Health / MaxHealth); + Color healthColor = Color.White * (1.0f - Health / MaxWater); foreach (VineTile vine in Vines) { vine.HealthColor = healthColor; @@ -546,11 +553,24 @@ namespace Barotrauma.Items.Components { productDelay++; if (productDelay <= maxProductDelay) { return; } - productDelay = 0; - bool spawnProduct = Rand.Range(0f, 1f, Rand.RandSync.Unsynced) < ProductRate, - spawnSeed = Rand.Range(0f, 1f, Rand.RandSync.Unsynced) < SeedRate; + float spawnChanceMultiplier = 1f; + + if (!FullyGrown) + { + if (LinearProductAndSeedMultiplierBeforeFullyGrown.NearlyEquals(Vector2.Zero)) { return; } + + float growthProgress = Vines.Count / (float)MaximumVines; + + spawnChanceMultiplier = MathHelper.Lerp(LinearProductAndSeedMultiplierBeforeFullyGrown.X, LinearProductAndSeedMultiplierBeforeFullyGrown.Y, growthProgress); + + if (MathUtils.NearlyEqual(spawnChanceMultiplier, 0f)) { return; } + } + + + bool spawnProduct = Rand.Range(0f, 1f) < (ProductSpawnChance * spawnChanceMultiplier), + spawnSeed = Rand.Range(0f, 1f) < (SeedSpawnChance * spawnChanceMultiplier); Vector2 spawnPos; @@ -678,7 +698,7 @@ namespace Barotrauma.Items.Components } } - fireCheckCooldown = 5f; + fireCheckCooldown = 10f; } else { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/Holdable.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/Holdable.cs index 10f02f6fc..0b01d7546 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/Holdable.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/Holdable.cs @@ -1,4 +1,5 @@ using Barotrauma.Abilities; +using Barotrauma.Extensions; using Barotrauma.Networking; using FarseerPhysics; using FarseerPhysics.Dynamics; @@ -44,7 +45,12 @@ namespace Barotrauma.Items.Components private bool attachable, attached, attachedByDefault; private Voronoi2.VoronoiCell attachTargetCell; - private PhysicsBody body; + + /// + /// The item's original physics body (if one exists). When the item is attached to a wall, it's gets set to null, + /// and we use this field to keep track of the original body. + /// + private PhysicsBody originalBody; public readonly ImmutableDictionary HoldableStatValues; @@ -62,7 +68,7 @@ namespace Barotrauma.Items.Components public PhysicsBody Body { - get { return item.body ?? body; } + get { return item.body ?? originalBody; } } [Serialize(false, IsPropertySaveable.Yes, description: "Is the item currently attached to a wall (only valid if Attachable is set to true).")] @@ -84,6 +90,9 @@ namespace Barotrauma.Items.Components set; } + [Serialize(0f, IsPropertySaveable.Yes, description: "Camera offset to apply when aiming this item. Only valid if Aimable is set to true.")] + public float CameraAimOffset { get; set; } + [Serialize(false, IsPropertySaveable.No, description: "Should the character adjust its pose when aiming with the item. Most noticeable underwater, where the character will rotate its entire body to face the direction the item is aimed at.")] public bool ControlPose { @@ -119,6 +128,32 @@ namespace Barotrauma.Items.Components set; } + [Serialize(false, IsPropertySaveable.No, description: "When enabled, the item can only be attached to a position where it touches the floor.")] + public bool AttachesToFloor + { + get; + set; + } + + [Serialize(true, IsPropertySaveable.No, description: "Can the item be attached inside doors?")] + public bool AllowAttachInsideDoors + { + get; + set; + } + + private HashSet disallowAttachingOverTags = new HashSet(); + + [Editable, Serialize("", IsPropertySaveable.Yes)] + public string DisallowAttachingOverTags + { + get => disallowAttachingOverTags.ConvertToString(); + set + { + disallowAttachingOverTags = value.ToIdentifiers().ToHashSet(); + } + } + [Serialize(false, IsPropertySaveable.No, description: "Should the item be attached to a wall by default when it's placed in the submarine editor.")] public bool AttachedByDefault { @@ -275,7 +310,7 @@ namespace Barotrauma.Items.Components public Holdable(Item item, ContentXElement element) : base(item, element) { - body = item.body; + originalBody = item.body; Pusher = null; if (element.GetAttributeBool("blocksplayers", false)) @@ -411,9 +446,9 @@ namespace Barotrauma.Items.Components if (attachable) { - if (body != null) + if (originalBody != null) { - item.body = body; + item.body = originalBody; } DeattachFromWall(); } @@ -514,9 +549,9 @@ namespace Barotrauma.Items.Components if (character != null) { item.Submarine = character.Submarine; } if (item.body == null) { - if (body != null) + if (originalBody != null) { - item.body = body; + item.body = originalBody; } else { @@ -565,13 +600,45 @@ namespace Barotrauma.Items.Components public bool CanBeAttached(Character user) { + return CanBeAttached(user, out _); + } + + private static List tempOverlappingItems = new List(); + + private bool CanBeAttached(Character user, out IEnumerable overlappingItems) + { + tempOverlappingItems.Clear(); + overlappingItems = tempOverlappingItems; if (!attachable || !Reattachable) { return false; } //can be attached anywhere in sub editor if (Screen.Selected == GameMain.SubEditorScreen) { return true; } + if (AttachesToFloor && item.CurrentHull == null) { return false; } + Vector2 attachPos = user == null ? item.WorldPosition : GetAttachPosition(user, useWorldCoordinates: true); + if (disallowAttachingOverTags.Any() || !AllowAttachInsideDoors) + { + var connectedHulls = item.CurrentHull?.GetConnectedHulls(includingThis: true, searchDepth: 5, ignoreClosedGaps: true); + Vector2 size = item.Rect.Size.ToVector2() / 2; + foreach (Item otherItem in Item.ItemList) + { + if (otherItem == item || otherItem.body is { BodyType: BodyType.Dynamic, Enabled: true }) { continue; } + if (connectedHulls != null && !connectedHulls.Contains(otherItem.CurrentHull)) { continue; } + if (disallowAttachingOverTags.None(tag => otherItem.HasTag(tag)) && + (otherItem.GetComponent() == null || AllowAttachInsideDoors)) + { + continue; + } + Rectangle worldRect = otherItem.WorldRect; + if (attachPos.X + size.X < worldRect.X || attachPos.X - size.X > worldRect.Right) { continue; } + if (attachPos.Y - size.Y > worldRect.Y || attachPos.Y + size.Y < worldRect.Y - worldRect.Height) { continue; } + tempOverlappingItems.Add(otherItem); + } + if (tempOverlappingItems.Any()) { return false; } + } + //can be attached anywhere inside hulls if (item.CurrentHull != null && Submarine.RectContains(item.CurrentHull.WorldRect, attachPos)) { return true; } @@ -670,14 +737,19 @@ namespace Barotrauma.Items.Components { if (!attachable) { return; } - if (body == null) + if (originalBody == null) { throw new InvalidOperationException($"Tried to attach an item with no physics body to a wall ({item.Prefab.Identifier})."); } - body.Enabled = false; - body.SetTransformIgnoreContacts(body.SimPosition, rotation: 0.0f); - item.body = null; + originalBody.Enabled = false; + originalBody.SetTransformIgnoreContacts(originalBody.SimPosition, rotation: 0.0f); + if (item.body != null) + { + item.body.Dir = 1; + item.body = null; + } + item.GetComponents().ForEach(static light => light.SetLightSourceTransform()); //outside hulls/subs -> we need to check if the item is being attached on a structure outside the sub if (item.CurrentHull == null && item.Submarine == null) @@ -689,7 +761,7 @@ namespace Barotrauma.Items.Components { //set to submarine-relative position item.SetTransform(ConvertUnits.ToSimUnits(item.WorldPosition - attachTarget.Submarine.Position), 0.0f, false); - body.SetTransformIgnoreContacts(item.SimPosition, 0.0f); + originalBody.SetTransformIgnoreContacts(item.SimPosition, 0.0f); } item.Submarine = attachTarget.Submarine; } @@ -833,6 +905,9 @@ namespace Barotrauma.Items.Components { item.Drop(character); item.SetTransform(ConvertUnits.ToSimUnits(GetAttachPosition(character)), 0.0f, findNewHull: false); + //don't find the new hull in SetTransform, because that'd also potentially change the submarine (teleport the item outside if it's attached outside) + //instead just find the hull, so the item is considered to be in the right hull + item.CurrentHull = Hull.FindHull(item.WorldPosition, item.CurrentHull); //the light source won't get properly updated if lighting is disabled (even though the light sprite is still drawn when lighting is disabled) //so let's ensure the light source is up-to-date RefreshLightSources(item); @@ -869,34 +944,60 @@ namespace Barotrauma.Items.Components Vector2 mouseDiff = user.CursorWorldPosition - user.WorldPosition; mouseDiff = mouseDiff.ClampLength(MaxAttachDistance); + Vector2 submarinePos = useWorldCoordinates && user.Submarine != null ? user.Submarine.Position : Vector2.Zero; Vector2 userPos = useWorldCoordinates ? user.WorldPosition : user.Position; Vector2 attachPos = userPos + mouseDiff; + Vector2 halfSize = new Vector2(item.Rect.Width, item.Rect.Height) / 2; + //offset the position by half the size of the grid to get the item to adhere to the grid in the same way as in the sub editor //in the sub editor, we align the top-left corner of the item with the grid //but here the origin of the item is placed at the attach position, so we need to offset it Vector2 offset = new Vector2( - -(item.Rect.Width / 2) % Submarine.GridSize.X, - (item.Rect.Height / 2) % Submarine.GridSize.Y); + -halfSize.X % Submarine.GridSize.X, + halfSize.Y % Submarine.GridSize.Y); if (user.Submarine != null) { //we must add some "padding" to the raycast to ensure it reaches all the way to a wall //otherwise the cursor might be outside a wall, but the grid cell it's in might be partially inside - Vector2 padding = Submarine.GridSize * new Vector2(Math.Sign(mouseDiff.X), Math.Sign(mouseDiff.Y)); + Vector2 padding = halfSize * new Vector2(Math.Sign(mouseDiff.X), Math.Sign(mouseDiff.Y)); if (Submarine.PickBody( ConvertUnits.ToSimUnits(user.Position), - ConvertUnits.ToSimUnits(user.Position + mouseDiff + padding), collisionCategory: Physics.CollisionWall) != null) + ConvertUnits.ToSimUnits(user.Position + mouseDiff + padding), collisionCategory: Physics.CollisionWall, + /*don't ignore sensors so the raycast can hit open doors or broken walls*/ + ignoreSensors: AllowAttachInsideDoors, customPredicate: (Fixture fixture) => + { + if (fixture.UserData is Door) { return false; } + return true; + }) != null) { - attachPos = userPos + mouseDiff * Submarine.LastPickedFraction + offset; - + Vector2 pickedPos = userPos + mouseDiff * Submarine.LastPickedFraction + offset - submarinePos; //round down if we're placing on the right side and vice versa: ensures we don't round the position inside a wall - return + attachPos = new Vector2( - (mouseDiff.X > 0 ? MathF.Floor(attachPos.X / Submarine.GridSize.X) : MathF.Ceiling(attachPos.X / Submarine.GridSize.X)) * Submarine.GridSize.X, - (mouseDiff.Y > 0 ? MathF.Floor(attachPos.Y / Submarine.GridSize.Y) : MathF.Ceiling(attachPos.Y / Submarine.GridSize.Y)) * Submarine.GridSize.Y) - - offset; + RoundToGrid(pickedPos.X, Submarine.GridSize.X, roundingDir: -Math.Sign(mouseDiff.X)), + RoundToGrid(pickedPos.Y, Submarine.GridSize.Y, roundingDir: -Math.Sign(mouseDiff.Y))) + - offset + submarinePos; + } + + if (AttachesToFloor) + { + //if attaching to floor, do a raycast down and move the attach pos where it hits + float size = item.Rect.Height / 2.0f; + Vector2 rayStart = attachPos - submarinePos; + Vector2 rayEnd = rayStart - Vector2.UnitY * MaxAttachDistance * 2; + if (Submarine.PickBody( + ConvertUnits.ToSimUnits(rayStart), + ConvertUnits.ToSimUnits(rayEnd), collisionCategory: Physics.CollisionWall | Physics.CollisionPlatform) != null) + { + attachPos = ConvertUnits.ToDisplayUnits(Submarine.LastPickedPosition) + Vector2.UnitY * size + submarinePos; + } + else + { + return Vector2.Zero; + } } } else if (Level.Loaded != null) @@ -919,9 +1020,30 @@ namespace Barotrauma.Items.Components } } - return new Vector2( - MathUtils.RoundTowardsClosest(attachPos.X + offset.X, Submarine.GridSize.X), - MathUtils.RoundTowardsClosest(attachPos.Y + offset.Y, Submarine.GridSize.Y)) - offset; + //subtract the submarine position so we're doing the rounding in the sub's + //internal/local coordinate space regardless if we're using world coordinates + //(otherwise the rounding would behave differently depending on the value of useWorldCoordinates) + Vector2 offsetAttachPos = attachPos + offset - submarinePos; + return + new Vector2( + RoundToGrid(offsetAttachPos.X, Submarine.GridSize.X), + //don't round the vertical position if we're attaching to floor - we want the item to align with the floor, not the grid + AttachesToFloor ? offsetAttachPos.Y : RoundToGrid(offsetAttachPos.Y, Submarine.GridSize.Y)) + - offset + submarinePos; + + ///If < 0, the method rounds down. If > 0, rounds up. If 0, rounds to the closest integer. + static float RoundToGrid(float position, float gridSize, int roundingDir = 0) + { + if (roundingDir < 0) + { + return MathF.Floor(position / gridSize) * gridSize; + } + else if (roundingDir > 0) + { + return MathF.Ceiling(position / gridSize) * gridSize; + } + return MathUtils.RoundTowardsClosest(position, gridSize); + } } private Voronoi2.VoronoiCell GetAttachTargetCell(float maxDist) @@ -977,7 +1099,7 @@ namespace Barotrauma.Items.Components return; } - if (picker == Character.Controlled && picker.IsKeyDown(InputType.Aim) && CanBeAttached(picker)) + if (picker == Character.Controlled && picker.IsKeyDown(InputType.Aim) && attachable && Reattachable) { Drawable = true; } @@ -1115,11 +1237,11 @@ namespace Barotrauma.Items.Components } else { - if (body != null) + if (originalBody != null) { - body.SetTransformIgnoreContacts(item.SimPosition, item.Rotation); - item.body = body; - body.Enabled = item.ParentInventory == null; + originalBody.SetTransformIgnoreContacts(item.SimPosition, item.Rotation); + item.body = originalBody; + originalBody.Enabled = item.ParentInventory == null; } DeattachFromWall(); } @@ -1134,7 +1256,7 @@ namespace Barotrauma.Items.Components Pusher.Remove(); Pusher = null; } - body = null; + originalBody = null; } public override XElement Save(XElement parentElement) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/MeleeWeapon.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/MeleeWeapon.cs index 7962bfa90..0fa4f918f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/MeleeWeapon.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/MeleeWeapon.cs @@ -435,55 +435,65 @@ namespace Barotrauma.Items.Components Structure targetStructure = target.UserData as Structure ?? targetFixture.UserData as Structure; Item targetItem = target.UserData is Holdable h ? h.Item : target.UserData as Item ?? targetFixture.UserData as Item; Entity targetEntity = targetCharacter ?? targetStructure ?? targetItem ?? target.UserData as Entity; + if (Attack != null) { Attack.SetUser(user); - Attack.DamageMultiplier = damageMultiplier; - if (targetLimb != null) + bool applyAttack = true; + if (Attack.Conditionals.Any(c => !c.TargetSelf && !c.Matches(targetEntity as ISerializableEntity)) || + Attack.Conditionals.Any(c => c.TargetSelf && !c.Matches(user))) { - if (targetLimb.character.Removed) { return; } - targetLimb.character.LastDamageSource = item; - Attack.DoDamageToLimb(user, targetLimb, item.WorldPosition, 1.0f); + applyAttack = false; } - else if (targetCharacter != null) + if (applyAttack) { - if (targetCharacter.Removed) { return; } - targetCharacter.LastDamageSource = item; - Attack.DoDamage(user, targetCharacter, item.WorldPosition, 1.0f); - } - else if (targetStructure != null) - { - if (targetStructure.Removed) { return; } - Attack.DoDamage(user, targetStructure, item.WorldPosition, 1.0f); - } - else if (targetItem != null && targetItem.Prefab.DamagedByMeleeWeapons && targetItem.Condition > 0) - { - if (targetItem.Removed) { return; } - var attackResult = Attack.DoDamage(user, targetItem, item.WorldPosition, 1.0f); -#if CLIENT - if (attackResult.Damage > 0.0f && targetItem.Prefab.ShowHealthBar && Character.Controlled != null && - (user == Character.Controlled || Character.Controlled.CanSeeTarget(item))) + Attack.DamageMultiplier = damageMultiplier; + if (targetLimb != null) { - Character.Controlled.UpdateHUDProgressBar(targetItem, - targetItem.WorldPosition, - targetItem.Condition / targetItem.MaxCondition, - emptyColor: GUIStyle.HealthBarColorLow, - fullColor: GUIStyle.HealthBarColorHigh, - textTag: targetItem.Prefab.ShowNameInHealthBar ? targetItem.Name : string.Empty); + if (targetLimb.character.Removed) { return; } + targetLimb.character.LastDamageSource = item; + Attack.DoDamageToLimb(user, targetLimb, item.WorldPosition, 1.0f); } + else if (targetCharacter != null) + { + if (targetCharacter.Removed) { return; } + targetCharacter.LastDamageSource = item; + Attack.DoDamage(user, targetCharacter, item.WorldPosition, 1.0f); + } + else if (targetStructure != null) + { + if (targetStructure.Removed) { return; } + Attack.DoDamage(user, targetStructure, item.WorldPosition, 1.0f); + } + else if (targetItem != null && targetItem.Prefab.DamagedByMeleeWeapons && targetItem.Condition > 0) + { + if (targetItem.Removed) { return; } + var attackResult = Attack.DoDamage(user, targetItem, item.WorldPosition, 1.0f); +#if CLIENT + if (attackResult.Damage > 0.0f && targetItem.Prefab.ShowHealthBar && Character.Controlled != null && + (user == Character.Controlled || Character.Controlled.CanSeeTarget(item))) + { + Character.Controlled.UpdateHUDProgressBar(targetItem, + targetItem.WorldPosition, + targetItem.Condition / targetItem.MaxCondition, + emptyColor: GUIStyle.HealthBarColorLow, + fullColor: GUIStyle.HealthBarColorHigh, + textTag: targetItem.Prefab.ShowNameInHealthBar ? targetItem.Name : string.Empty); + } #endif - } - else if (target.UserData is Holdable { CanPush: true } holdable) - { - if (holdable.Item.Removed) { return; } - RestoreCollision(); - hitting = false; - User = null; - } - else - { - return; - } + } + else if (target.UserData is Holdable { CanPush: true } holdable) + { + if (holdable.Item.Removed) { return; } + RestoreCollision(); + hitting = false; + User = null; + } + else + { + return; + } + } } if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient) { return; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/RepairTool.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/RepairTool.cs index 00819bee9..f5c73ab42 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/RepairTool.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/RepairTool.cs @@ -522,7 +522,7 @@ namespace Barotrauma.Items.Components #if CLIENT float barOffset = 10f * GUI.Scale; Vector2 offset = planter.PlantSlots.ContainsKey(i) ? planter.PlantSlots[i].Offset : Vector2.Zero; - user?.UpdateHUDProgressBar(planter, planter.Item.DrawPosition + new Vector2(barOffset, 0) + offset, seed.Health / seed.MaxHealth, GUIStyle.Blue, GUIStyle.Blue, "progressbar.watering"); + user?.UpdateHUDProgressBar(planter, planter.Item.DrawPosition + new Vector2(barOffset, 0) + offset, seed.Health / seed.MaxWater, GUIStyle.Blue, GUIStyle.Blue, "progressbar.watering"); #endif } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/Throwable.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/Throwable.cs index 3c22efde5..6ca8e627f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/Throwable.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Holdable/Throwable.cs @@ -47,7 +47,7 @@ namespace Barotrauma.Items.Components public override bool Use(float deltaTime, Character character = null) { //actual throwing logic is handled in Update - return characterUsable || character == null; + return (characterUsable && !UsageDisabledByRangedWeapon(character)) || character == null; } public override bool SecondaryUse(float deltaTime, Character character = null) @@ -111,24 +111,28 @@ namespace Barotrauma.Items.Components return; } - if (throwState != ThrowState.Throwing) + bool aim = false; + if (!UsageDisabledByRangedWeapon(picker)) { - if (picker.IsKeyDown(InputType.Aim)) + if (throwState != ThrowState.Throwing) { - if (picker.IsKeyDown(InputType.Shoot)) { throwState = ThrowState.Initiated; } + if (picker.IsKeyDown(InputType.Aim)) + { + if (picker.IsKeyDown(InputType.Shoot)) { throwState = ThrowState.Initiated; } + } + else if (throwState != ThrowState.Initiated) + { + throwAngle = ThrowAngleStart; + } } - else if (throwState != ThrowState.Initiated) - { - throwAngle = ThrowAngleStart; - } - } - bool aim = picker.IsKeyDown(InputType.Aim) && picker.CanAim; + aim = picker.IsKeyDown(InputType.Aim) && picker.CanAim; + } if (picker.IsDead || !picker.AllowInput) { throwState = ThrowState.None; aim = false; - } + } ApplyStatusEffects(ActionType.OnActive, deltaTime, picker); //return if the status effect got rid of the picker somehow diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemComponent.cs index d4b27fa43..0f2ec8e49 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemComponent.cs @@ -998,6 +998,13 @@ namespace Barotrauma.Items.Components /// public virtual void OnItemLoaded() { } + /// + /// Implement in a base class if the instances of the component contain some sort of data that isn't serialized using the normal serializable properties + /// (i.e. some data that changes per-item and isn't loaded from the prefab, but that isn't a property marked with [Serialize] either), + /// but that must be copied when cloning the item. + /// + public virtual void Clone(ItemComponent original) { } + public virtual void OnScaleChanged() { } /// @@ -1093,7 +1100,6 @@ namespace Barotrauma.Items.Components componentElement.Add(newElement); } - SerializableProperty.SerializeProperties(this, componentElement); parentElement.Add(componentElement); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemContainer.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemContainer.cs index a070e9a96..ae47871e3 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemContainer.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemContainer.cs @@ -438,9 +438,14 @@ namespace Barotrauma.Items.Components ActiveContainedItem activeContainedItem = new(containedItem, effect, containableItem.ExcludeBroken, containableItem.ExcludeFullCondition, containableItem.BlameEquipperForDeath); activeContainedItems.Add(activeContainedItem); - if (!ShouldApplyEffects(activeContainedItem)) { continue; } + if (!ShouldApplyEffects(activeContainedItem) || item.Submarine is { Loading: true} || initializingLoadedItems || + containedItem.OnInsertedEffectsApplied) + { + continue; + } activeContainedItem.StatusEffect.Apply(ActionType.OnInserted, deltaTime: 1, item, targets); } + containedItem.OnInsertedEffectsApplied = true; } } } @@ -511,6 +516,8 @@ namespace Barotrauma.Items.Components activeContainedItem.StatusEffect.Apply(ActionType.OnRemoved, deltaTime: 1, item, targets); } + containedItem.OnInsertedEffectsApplied = false; + activeContainedItems.RemoveAll(i => i.Item == containedItem); containedItems.RemoveAll(i => i.Item == containedItem); item.SetContainedItemPositions(); @@ -680,7 +687,7 @@ namespace Barotrauma.Items.Components foreach (ActiveContainedItem activeContainedItem in activeContainedItems) { - if (!ShouldApplyEffects(activeContainedItem)) continue; + if (!ShouldApplyEffects(activeContainedItem)) { continue; } StatusEffect effect = activeContainedItem.StatusEffect; effect.Apply(ActionType.OnActive, deltaTime, item, targets); @@ -993,6 +1000,8 @@ namespace Barotrauma.Items.Components } else { + //flip if flipped on one axis but not both (flipping on both axes is basically "double negative" and makes the rotation normal again) + if (flippedX ^ flippedY) { rotation = -rotation; } rotation += -item.RotationRad; } contained.Item.body.FarseerBody.SetTransformIgnoreContacts(ref simPos, rotation); @@ -1050,8 +1059,17 @@ namespace Barotrauma.Items.Components transformedItemIntervalHorizontal = new Vector2(transformedItemInterval.X, 0.0f); transformedItemIntervalVertical = new Vector2(0.0f, transformedItemInterval.Y); - flippedX = item.RootContainer?.FlippedX ?? (item.FlippedX && item.Prefab.CanSpriteFlipX); - flippedY = item.RootContainer?.FlippedY ?? (item.FlippedY && item.Prefab.CanSpriteFlipY); + if (item.RootContainer != null) + { + flippedX = item.RootContainer.FlippedX && item.RootContainer.Prefab.CanSpriteFlipX; + flippedY = item.RootContainer.FlippedY && item.RootContainer.Prefab.CanSpriteFlipY; + } + else + { + flippedX = item.FlippedX && item.Prefab.CanSpriteFlipX; + flippedY = item.FlippedY && item.Prefab.CanSpriteFlipY; + } + var rootBody = item.RootContainer?.body ?? item.body; bool bodyFlipped = rootBody is { Dir: -1 }; @@ -1123,10 +1141,13 @@ namespace Barotrauma.Items.Components } } + private bool initializingLoadedItems; + public override void OnMapLoaded() { if (itemIds != null) { + initializingLoadedItems = true; for (ushort i = 0; i < itemIds.Length; i++) { if (i >= Inventory.Capacity) @@ -1138,10 +1159,11 @@ namespace Barotrauma.Items.Components } foreach (ushort id in itemIds[i]) { - if (!(Entity.FindEntityByID(id) is Item item)) { continue; } + if (Entity.FindEntityByID(id) is not Item item) { continue; } Inventory.TryPutItem(item, i, false, false, null, createNetworkEvent: false, ignoreCondition: true); } } + initializingLoadedItems = false; itemIds = null; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Controller.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Controller.cs index a41b9e10c..5bd44334a 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Controller.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Controller.cs @@ -349,7 +349,7 @@ namespace Barotrauma.Items.Components // Don't move lower body limbs if there's another selected secondary item that should control them if (limb.IsLowerBody && user.HasSelectedAnotherSecondaryItem(Item)) { continue; } // Don't move hands if there's a selected primary item that should control them - if (!limb.IsLowerBody && Item == user.SelectedSecondaryItem && user.SelectedItem != null) { continue; } + if (limb.IsArm && Item == user.SelectedSecondaryItem && user.SelectedItem != null) { continue; } if (lb.AllowUsingLimb) { switch (lb.LimbType) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Reactor.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Reactor.cs index fd50424b0..b5a84491f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Reactor.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Reactor.cs @@ -564,7 +564,7 @@ namespace Barotrauma.Items.Components { fireTimer += MathHelper.Lerp(deltaTime * 2.0f, deltaTime, item.Condition / item.MaxCondition); #if SERVER - if (fireTimer > Math.Min(5.0f, FireDelay / 2) && blameOnBroken?.Character?.SelectedItem == item) + if (fireTimer > Math.Min(5.0f, FireDelay / 2) && blameOnBroken?.Character != null) { GameMain.Server.KarmaManager.OnReactorOverHeating(item, blameOnBroken.Character, deltaTime); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Steering.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Steering.cs index 01a4fa818..d7130f534 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Steering.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Steering.cs @@ -76,7 +76,7 @@ namespace Barotrauma.Items.Components private double lastReceivedSteeringSignalTime; - [Serialize(defaultValue: false, isSaveable: IsPropertySaveable.Yes, AlwaysUseInstanceValues = true)] + [Serialize(defaultValue: false, isSaveable: IsPropertySaveable.Yes, description: "Is autopilot currently on or not?", AlwaysUseInstanceValues = true)] public bool AutoPilot { get { return autoPilot; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Planter.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Planter.cs index f00e9bf4a..bff43ce3c 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Planter.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Planter.cs @@ -110,17 +110,15 @@ namespace Barotrauma.Items.Components { base.OnItemLoaded(); IsActive = true; -#if CLIENT var lights = item.GetComponents(); if (lights.Any()) { lightComponents = lights.ToList(); - foreach (var light in lightComponents) + foreach (var light in item.GetComponents()) { - light.Light.Enabled = false; + light.IsOn = false; } } -#endif container = item.GetComponent(); GrowableSeeds = new Growable[container.Capacity]; } @@ -233,7 +231,6 @@ namespace Barotrauma.Items.Components { base.Update(deltaTime, cam); -#if CLIENT if (lightComponents != null && lightComponents.Count > 0) { bool hasSeed = false; @@ -243,10 +240,9 @@ namespace Barotrauma.Items.Components } foreach (var light in lightComponents) { - light.Light.Enabled = hasSeed; + light.IsOn = hasSeed; } } -#endif if (container?.Inventory == null) { return; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/PowerDistributor.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/PowerDistributor.cs new file mode 100644 index 000000000..fd4340201 --- /dev/null +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/PowerDistributor.cs @@ -0,0 +1,230 @@ +#nullable enable +using Barotrauma.Networking; +using Microsoft.Xna.Framework; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Xml.Linq; + +namespace Barotrauma.Items.Components +{ + internal partial class PowerDistributor : PowerTransfer + { + private const int MaxNameLength = 32; + + private const int SupplyRatioSteps = 20; + private const float SupplyRatioStep = 1f / SupplyRatioSteps; + + private partial class PowerGroup + { + private readonly PowerDistributor distributor; + public readonly Connection PowerOut; + public readonly Connection? RatioInput, RatioOutput; + + private string name; + public string Name + { + get => name; + set + { + name = value; + DisplayName = TextManager.Get(name).Fallback(name); +#if CLIENT + UpdateNameBox(); +#endif + } + } + + public LocalizedString? DisplayName { get; private set; } + + private float supplyRatio = 1f; + public float SupplyRatio + { + get => supplyRatio; + set + { + if (!MathUtils.IsValid(value)) { return; } + supplyRatio = MathUtils.RoundTowardsClosest(MathHelper.Clamp(value, 0f, 1f), SupplyRatioStep); +#if CLIENT + UpdateSlider(); +#endif + } + } + + public float DisplayRatio + { + get => MathUtils.RoundToInt(supplyRatio * 100); + set => SupplyRatio = value / 100f; + } + + public float Load; + public float ModifiedLoad => Load * SupplyRatio; + + public PowerGroup(PowerDistributor distributor, Connection power, XElement? element = null, Connection? ratioInput = null, Connection? ratioOutput = null) + { + this.distributor = distributor; + PowerOut = power; + + RatioInput = ratioInput; + RatioOutput = ratioOutput; + + distributor.powerGroups.Add(this); + + name = TextManager.GetWithVariable("groupx", "[num]", distributor.powerGroups.Count.ToString()).Value; + SupplyRatio = 1f; + + if (element != null) + { + name = element.GetAttributeString("name", name); + SupplyRatio = element.GetAttributeFloat("ratio", SupplyRatio); + } + +#if CLIENT + CreateGUI(); +#endif + } + + #region Signals + public void ReceiveRatioSignal(Signal signal) + { + if (!float.TryParse(signal.value, NumberStyles.Float, CultureInfo.InvariantCulture, out float receivedSignal) || !MathUtils.IsValid(receivedSignal)) { return; } + DisplayRatio = receivedSignal; + } + + public void SendRatioSignal() => distributor.item.SendSignal(new Signal(DisplayRatio.ToString()), RatioOutput); + #endregion + } + + private readonly List powerGroups = new List(); + + protected override PowerPriority Priority => PowerPriority.Relay; + + public PowerDistributor(Item item, ContentXElement element) : base(item, element) { } + + public override void OnItemLoaded() + { + base.OnItemLoaded(); + + IEnumerable ratioInputs = Item.Connections.Where(static conn => !conn.IsOutput && conn.Name.StartsWith("set_supply_ratio")); + IEnumerable ratioOutputs = Item.Connections.Where(static conn => conn.IsOutput && conn.Name.StartsWith("supply_ratio_out")); + + for (int i = 0; i < powerOuts.Count; i++) + { + new PowerGroup(this, powerOuts[i], cachedGroupData.ElementAtOrDefault(i), ratioInputs.ElementAtOrDefault(i), ratioOutputs.ElementAtOrDefault(i)); + } + + cachedGroupData.Clear(); + } + + public override void Clone(ItemComponent original) + { + if (original is not PowerDistributor originalPowerDistributor) { return; } + for (int i = 0; i < powerOuts.Count; i++) + { + powerGroups[i].SupplyRatio = originalPowerDistributor.powerGroups[i].SupplyRatio; + powerGroups[i].Name = originalPowerDistributor.powerGroups[i].Name; + } + } + + #region Signals + protected override void SendSignals() + { + item.SendSignal(MathUtils.RoundToInt(powerIn.Grid?.Power ?? 0f).ToString(), "power_value_out"); + item.SendSignal(MathUtils.RoundToInt(GetCurrentPowerConsumption(powerIn)).ToString(), "load_value_out"); + powerGroups.ForEach(static group => group.SendRatioSignal()); + } + + public override void ReceiveSignal(Signal signal, Connection connection) + { + if (item.Condition <= 0f || connection.IsPower) { return; } + if (connection.IsOutput) { return; } + + powerGroups.FirstOrDefault(group => group.RatioInput == connection)?.ReceiveRatioSignal(signal); + } + #endregion + + #region Power Calculation + private bool IsShortCircuited(Connection conn) => powerIn.Grid == conn.Grid; + + public override float GetCurrentPowerConsumption(Connection? connection = null) + { + if (connection != powerIn) { return -1f; } + if (isBroken) { return 0f; } + return powerGroups.Sum(group => IsShortCircuited(group.PowerOut) ? 0f : group.ModifiedLoad) + ExtraLoad; + } + + private float CalculatePowerOut(PowerGroup group) + { + if (isBroken || powerIn.Grid == null || IsShortCircuited(group.PowerOut)) { return 0f; } + return Math.Max(group.ModifiedLoad * Voltage, 0f); + } + + public override float GetConnectionPowerOut(Connection connection, float power, PowerRange minMaxPower, float load) + { + if (connection == powerIn) { return 0f; } + PowerGroup group = powerGroups.First(group => group.PowerOut == connection); + group.Load = load; + return CalculatePowerOut(group); + } + #endregion + + #region Serialization + private readonly List cachedGroupData = new List(); + + public override XElement Save(XElement parentElement) + { + XElement componentElement = base.Save(parentElement); + foreach (PowerGroup powerGroup in powerGroups) + { + componentElement.Add(new XElement("PowerGroup", + new XAttribute("name", powerGroup.Name), + new XAttribute("ratio", powerGroup.SupplyRatio))); + } + return componentElement; + } + + public override void Load(ContentXElement componentElement, bool usePrefabValues, IdRemap idRemap, bool isItemSwap) + { + base.Load(componentElement, usePrefabValues, idRemap, isItemSwap); + if (usePrefabValues) { return; } + + foreach (XElement element in componentElement.Elements()) + { + cachedGroupData.Add(element); + } + } + #endregion + + #region Networking + private enum EventType { NameChange, RatioChange } + + private void SharedEventWrite(IWriteMessage msg, NetEntityEvent.IData? extraData = null) + { + EventData data = ExtractEventData(extraData); + msg.WriteRangedInteger((int)data.EventType, 0, 1); + msg.WriteRangedInteger(powerGroups.IndexOf(data.PowerGroup), 0, powerGroups.Count - 1); + switch (data.EventType) + { + case EventType.NameChange: + msg.WriteString(data.PowerGroup.Name); + break; + case EventType.RatioChange: + msg.WriteRangedInteger(MathUtils.RoundToInt(data.PowerGroup.SupplyRatio / SupplyRatioStep), 0, SupplyRatioSteps); + break; + } + } + + private void SharedEventRead(IReadMessage msg, out EventType eventType, out PowerGroup powerGroup, out string newName, out float newRatio) + { + eventType = (EventType)msg.ReadRangedInteger(0, 1); + powerGroup = powerGroups[msg.ReadRangedInteger(0, powerGroups.Count - 1)]; + + newName = eventType == EventType.NameChange ? string.Concat(msg.ReadString().Take(MaxNameLength)) : powerGroup.Name; + newRatio = eventType == EventType.RatioChange ? msg.ReadRangedInteger(0, SupplyRatioSteps) * SupplyRatioStep : powerGroup.SupplyRatio; + } + + private readonly record struct EventData(PowerGroup PowerGroup, EventType EventType) : IEventData; + #endregion + } +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/PowerTransfer.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/PowerTransfer.cs index 8473a50de..c110e8b9e 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/PowerTransfer.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/PowerTransfer.cs @@ -177,18 +177,7 @@ namespace Barotrauma.Items.Components { RefreshConnections(); - if (Timing.TotalTime > extraLoadSetTime + 1.0) - { - //Decay the extra load to 0 from either positive or negative - if (extraLoad > 0) - { - extraLoad = Math.Max(extraLoad - 1000.0f * deltaTime, 0); - } - else - { - extraLoad = Math.Min(extraLoad + 1000.0f * deltaTime, 0); - } - } + UpdateExtraLoad(deltaTime); if (!CanTransfer) { return; } @@ -200,6 +189,28 @@ namespace Barotrauma.Items.Components ApplyStatusEffects(ActionType.OnActive, deltaTime); + SendSignals(); + + UpdateOvervoltage(deltaTime); + } + + protected virtual void UpdateExtraLoad(float deltaTime) + { + if (Timing.TotalTime <= extraLoadSetTime + 1.0) { return; } + + //Decay the extra load to 0 from either positive or negative + if (extraLoad > 0) + { + extraLoad = Math.Max(extraLoad - 1000.0f * deltaTime, 0); + } + else + { + extraLoad = Math.Min(extraLoad + 1000.0f * deltaTime, 0); + } + } + + protected virtual void SendSignals() + { float powerReadingOut = 0; float loadReadingOut = ExtraLoad; if (powerLoad < 0) @@ -226,7 +237,10 @@ namespace Barotrauma.Items.Components } item.SendSignal(powerSignal, "power_value_out"); item.SendSignal(loadSignal, "load_value_out"); + } + protected virtual void UpdateOvervoltage(float deltaTime) + { //if the item can't be fixed, don't allow it to break if (!item.Repairables.Any() || !CanBeOverloaded) { return; } @@ -234,46 +248,45 @@ namespace Barotrauma.Items.Components Overload = Voltage > maxOverVoltage && GameMain.GameSession is not { RoundDuration: < 5 }; - if (Overload && (GameMain.NetworkMember == null || GameMain.NetworkMember.IsServer)) + if (!Overload || GameMain.NetworkMember is { IsClient: true }) { return; } + + if (overloadCooldownTimer > 0.0f) { - if (overloadCooldownTimer > 0.0f) - { - overloadCooldownTimer -= deltaTime; - return; - } + overloadCooldownTimer -= deltaTime; + return; + } - //damage the item if voltage is too high (except if running as a client) - float prevCondition = item.Condition; - //some randomness to prevent all junction boxes from breaking at the same time - if (Rand.Range(0.0f, 1.0f) < 0.01f) - { - //damaged boxes are more sensitive to overvoltage (also preventing all boxes from breaking at the same time) - float conditionFactor = MathHelper.Lerp(5.0f, 1.0f, item.Condition / item.MaxCondition); - item.Condition -= deltaTime * Rand.Range(10.0f, 500.0f) * conditionFactor; - } - if (item.Condition <= 0.0f && prevCondition > 0.0f) - { - overloadCooldownTimer = OverloadCooldown; + //damage the item if voltage is too high (except if running as a client) + float prevCondition = item.Condition; + //some randomness to prevent all junction boxes from breaking at the same time + if (Rand.Range(0.0f, 1.0f) < 0.01f) + { + //damaged boxes are more sensitive to overvoltage (also preventing all boxes from breaking at the same time) + float conditionFactor = MathHelper.Lerp(5.0f, 1.0f, item.Condition / item.MaxCondition); + item.Condition -= deltaTime * Rand.Range(10.0f, 500.0f) * conditionFactor; + } + + if (item.Condition > 0.0f || prevCondition <= 0.0f) { return; } + + overloadCooldownTimer = OverloadCooldown; #if CLIENT - SoundPlayer.PlaySound("zap", item.WorldPosition, hullGuess: item.CurrentHull); - Vector2 baseVel = Rand.Vector(300.0f); - for (int i = 0; i < 10; i++) - { - var particle = GameMain.ParticleManager.CreateParticle("spark", item.WorldPosition, - baseVel + Rand.Vector(100.0f), 0.0f, item.CurrentHull); - if (particle != null) particle.Size *= Rand.Range(0.5f, 1.0f); - } + SoundPlayer.PlaySound("zap", item.WorldPosition, hullGuess: item.CurrentHull); + Vector2 baseVel = Rand.Vector(300.0f); + for (int i = 0; i < 10; i++) + { + var particle = GameMain.ParticleManager.CreateParticle("spark", item.WorldPosition, + baseVel + Rand.Vector(100.0f), 0.0f, item.CurrentHull); + if (particle != null) particle.Size *= Rand.Range(0.5f, 1.0f); + } #endif - float currentIntensity = GameMain.GameSession?.EventManager != null ? - GameMain.GameSession.EventManager.CurrentIntensity : 0.5f; + float currentIntensity = GameMain.GameSession?.EventManager != null ? + GameMain.GameSession.EventManager.CurrentIntensity : 0.5f; - //higher probability for fires if the current intensity is low - if (FireProbability > 0.0f && - Rand.Range(0.0f, 1.0f) < MathHelper.Lerp(FireProbability, FireProbability * 0.1f, currentIntensity)) - { - new FireSource(item.WorldPosition); - } - } + //higher probability for fires if the current intensity is low + if (FireProbability > 0.0f && + Rand.Range(0.0f, 1.0f) < MathHelper.Lerp(FireProbability, FireProbability * 0.1f, currentIntensity)) + { + new FireSource(item.WorldPosition); } } @@ -424,7 +437,7 @@ namespace Barotrauma.Items.Components } } - if (this is not RelayComponent) + if (this is not RelayComponent and not PowerDistributor) { if (PowerConnections.Any(p => !p.IsOutput) && PowerConnections.Any(p => p.IsOutput)) { @@ -452,7 +465,7 @@ namespace Barotrauma.Items.Components { //other junction boxes don't need to receive the signal in the pass-through signal connections //because we relay it straight to the connected items without going through the whole chain of junction boxes - if (ic is PowerTransfer && ic is not RelayComponent) { continue; } + if (ic is PowerTransfer and not RelayComponent and not PowerDistributor) { continue; } ic.ReceiveSignal(signal, recipient); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/Powered.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/Powered.cs index 13db3297f..962b6a132 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/Powered.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Power/Powered.cs @@ -2,6 +2,7 @@ using Microsoft.Xna.Framework; using System.Collections.Generic; using System.Linq; +using Barotrauma.Extensions; #if CLIENT using Barotrauma.Sounds; #endif @@ -93,7 +94,22 @@ namespace Barotrauma.Items.Components /// protected float powerConsumption; - protected Connection powerIn, powerOut; + protected Connection powerIn; + protected List powerOuts = new List(); + /// + /// Throws an error if there is more than one power out connection.
+ /// Use if a component should handle multiple outputs. + ///
+ protected Connection powerOut + { + get + { + if (powerOuts.Count > 1) { DebugConsole.ThrowErrorOnce($"{item.ID}.multiplePowerOut", $"Item {item.Name} ({item.Prefab.Identifier}) has multiple power outputs, but only supports one!"); } + return powerOuts.FirstOrDefault(); + } + } + + protected bool powerInIsPowerOut => powerOuts.Contains(powerIn); /// /// Maximum voltage factor when the device is being overvolted. I.e. how many times more effectively the device can function when it's being overvolted @@ -153,9 +169,10 @@ namespace Barotrauma.Items.Components { if (powerIn?.Grid != null) { return powerIn.Grid.Voltage; } } - else if (powerOut != null) + else if (powerOuts.Any()) { - if (powerOut?.Grid != null) { return powerOut.Grid.Voltage; } + IEnumerable gridConnections = powerOuts.Where(static conn => conn.Grid != null); + if (gridConnections.Any()) { return gridConnections.Average(static conn => conn.Grid.Voltage); } } if (this is PowerTransfer && item.Condition <= 0.0f) @@ -245,18 +262,19 @@ namespace Barotrauma.Items.Components { powerIn = c; } - else if (c.Name == "power_out") - { - powerOut = c; - // Connection takes the lowest priority - if (Priority > powerOut.Priority) - { - powerOut.Priority = Priority; - } - } else if (c.Name == "power") { - powerIn = powerOut = c; + powerIn = c; + powerOuts.Add(c); + } + else if (c.IsOutput) + { + powerOuts.Add(c); + // Connection takes the lowest priority + if (Priority > c.Priority) + { + c.Priority = Priority; + } } } else @@ -271,11 +289,11 @@ namespace Barotrauma.Items.Components DebugConsole.NewMessage($"Item \"{item.Name}\" has a power output connection called power_in. If the item is supposed to receive power through the connection, change it to an input connection.", Color.Orange); #endif } - powerOut = c; + powerOuts.Add(c); // Connection takes the lowest priority - if (Priority > powerOut.Priority) + if (Priority > c.Priority) { - powerOut.Priority = Priority; + c.Priority = Priority; } } else @@ -335,9 +353,9 @@ namespace Barotrauma.Items.Components { powered.powerIn.Grid = null; } - if (powered.powerOut != null) + foreach (Connection powerOut in powered.powerOuts) { - powered.powerOut.Grid = null; + powerOut.Grid = null; } } @@ -345,8 +363,10 @@ namespace Barotrauma.Items.Components foreach (Powered powered in poweredList) { + if (powered.Item.Condition <= 0f) { continue; } + //Probe through all connections that don't have a gridID - if (powered.powerIn != null && powered.powerIn.Grid == null && powered.powerIn != powered.powerOut && powered.Item.Condition > 0.0f) + if (powered.powerIn != null && powered.powerIn.Grid == null && !powered.powerInIsPowerOut) { // Only create grids for networks with more than 1 device if (powered.powerIn.Recipients.Count > 0) @@ -356,13 +376,16 @@ namespace Barotrauma.Items.Components } } - if (powered.powerOut != null && powered.powerOut.Grid == null && powered.Item.Condition > 0.0f) + foreach (Connection powerOut in powered.powerOuts) { - //Only create grids for networks with more than 1 device - if (powered.powerOut.Recipients.Count > 0) + if (powerOut != null && powerOut.Grid == null) { - GridInfo grid = PropagateGrid(powered.powerOut); - Grids[grid.ID] = grid; + //Only create grids for networks with more than 1 device + if (powerOut.Recipients.Count > 0) + { + GridInfo grid = PropagateGrid(powerOut); + Grids[grid.ID] = grid; + } } } } @@ -479,7 +502,7 @@ namespace Barotrauma.Items.Components powered.Voltage -= deltaTime; //Handle the device if it's got a power connection - if (powered.powerIn != null && powered.powerOut != powered.powerIn) + if (powered.powerIn != null && !powered.powerInIsPowerOut) { //Get the new load for the connection float currLoad = powered.GetCurrentPowerConsumption(powered.powerIn); @@ -507,10 +530,10 @@ namespace Barotrauma.Items.Components } //Handle the device power depending on if its powerout - if (powered.powerOut != null) + foreach (Connection powerOut in powered.powerOuts) { //Get the connection's load - float currLoad = powered.GetCurrentPowerConsumption(powered.powerOut); + float currLoad = powered.GetCurrentPowerConsumption(powerOut); //Update the device's output load to the correct variable if (powered is PowerTransfer pt) @@ -529,20 +552,20 @@ namespace Barotrauma.Items.Components if (currLoad >= 0) { //Add to the grid load if possible - if (powered.powerOut.Grid != null) + if (powerOut.Grid != null) { - powered.powerOut.Grid.Load += currLoad; + powerOut.Grid.Load += currLoad; } } - else if (powered.powerOut.Grid != null) + else if (powerOut.Grid != null) { //Add connection as a source to be processed - powered.powerOut.Grid.AddSrc(powered.powerOut); + powerOut.Grid.AddSrc(powerOut); } else { //Perform power calculations for the singular connection - float loadOut = -powered.GetConnectionPowerOut(powered.powerOut, 0, powered.MinMaxPowerOut(powered.powerOut, 0), 0); + float loadOut = -powered.GetConnectionPowerOut(powerOut, 0, powered.MinMaxPowerOut(powerOut, 0), 0); if (powered is PowerTransfer pt2) { pt2.PowerLoad = loadOut; @@ -557,7 +580,7 @@ namespace Barotrauma.Items.Components } //Indicate grid is resolved as it was the only device - powered.GridResolved(powered.powerOut); + powered.GridResolved(powerOut); } } } @@ -625,7 +648,7 @@ namespace Barotrauma.Items.Components public virtual float GetCurrentPowerConsumption(Connection connection = null) { // If a handheld device there is no consumption - if (powerIn == null && powerOut == null) + if (powerIn == null && powerOuts.None()) { return 0; } @@ -664,7 +687,7 @@ namespace Barotrauma.Items.Components /// Power pushed to the grid public virtual float GetConnectionPowerOut(Connection conn, float power, PowerRange minMaxPower, float load) { - return conn == powerOut ? MathHelper.Max(-CurrPowerConsumption, 0) : 0; + return powerOuts.Contains(conn) ? MathHelper.Max(-CurrPowerConsumption, 0) : 0; } /// diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/CircuitBox.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/CircuitBox.cs index ab13440a8..031fee432 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/CircuitBox.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/CircuitBox.cs @@ -233,6 +233,7 @@ namespace Barotrauma.Items.Components var cloneNode = InputOutputNodes[ioIndex]; cloneNode.Position = origNode.Position; + cloneNode.ReplaceAllConnectionLabelOverrides(origNode.ConnectionLabelOverrides); } if (!clonedContainedItems.Any()) { return; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/Connection.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/Connection.cs index f81e6c45e..02a51053d 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/Connection.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/Connection.cs @@ -18,7 +18,14 @@ namespace Barotrauma.Items.Components public readonly int MaxWires = 5; public readonly string Name; - public readonly LocalizedString DisplayName; + private readonly LocalizedString _displayName; + public LocalizedString DisplayName + { + get => DisplayNameOverride ?? _displayName; + private init => _displayName = value; + } + + public LocalizedString DisplayNameOverride; private readonly HashSet wires; public IReadOnlyCollection Wires => wires; @@ -160,8 +167,7 @@ namespace Barotrauma.Items.Components DisplayName = Name; } - IsPower = Name == "power_in" || Name == "power" || Name == "power_out"; - + IsPower = element.GetAttributeBool("ispower", Name is "power_in" or "power" or "power_out"); LoadedWires = new List<(ushort wireId, int? connectionIndex)>(); foreach (var subElement in element.Elements()) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/MotionSensor.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/MotionSensor.cs index 46f1d1948..bbc728e28 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/MotionSensor.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/MotionSensor.cs @@ -325,23 +325,18 @@ namespace Barotrauma.Items.Components private bool TriggersOn(Character character, bool triggerFromHumans, bool triggerFromPets, bool triggerFromMonsters) { if (IgnoreDead && character.IsDead) { return false; } - if (character.IsHuman) - { - if (!triggerFromHumans) { return false; } - } - else if (character.IsPet) + if (character.IsPet) { if (!triggerFromPets) { return false; } } + else if (character.IsHuman || CharacterParams.CompareGroup(character.Group, CharacterPrefab.HumanGroup)) + { + if (!triggerFromHumans) { return false; } + } else { // Not a human or a pet -> monster? if (!triggerFromMonsters) { return false; } - if (CharacterParams.CompareGroup(character.Group, CharacterPrefab.HumanGroup)) - { - //characters in the "human" group aren't considered monsters (even if they were something like a friendly mudraptor) - return false; - } } // Check matching character, if defined. if (targetCharacters.Any()) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/Wire.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/Wire.cs index bb4c8f643..2dd1fbd7f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/Wire.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Signal/Wire.cs @@ -553,9 +553,9 @@ namespace Barotrauma.Items.Components return new List(nodes); } - public void SetNodes(List nodes) + public void SetNodes(IEnumerable nodes) { - this.nodes = new List(nodes); + this.nodes = nodes.ToList(); UpdateSections(); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/TriggerComponent.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/TriggerComponent.cs index e9597ccf6..28728b077 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/TriggerComponent.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/TriggerComponent.cs @@ -21,7 +21,7 @@ namespace Barotrauma.Items.Components public bool ForceFluctuation { get; set; } [Serialize(1.0f, IsPropertySaveable.Yes, description: "How much the fluctuation affects the force. 1 is the maximum fluctuation, 0 is no fluctuation.", alwaysUseInstanceValues: true)] - private float ForceFluctuationStrength + public float ForceFluctuationStrength { get { @@ -33,7 +33,7 @@ namespace Barotrauma.Items.Components } } [Serialize(1.0f, IsPropertySaveable.Yes, description: "How fast (cycles per second) the force fluctuates.", alwaysUseInstanceValues: true)] - private float ForceFluctuationFrequency + public float ForceFluctuationFrequency { get { @@ -45,7 +45,7 @@ namespace Barotrauma.Items.Components } } [Serialize(0.01f, IsPropertySaveable.Yes, description: "How often (in seconds) the force fluctuation is calculated.", alwaysUseInstanceValues: true)] - private float ForceFluctuationInterval + public float ForceFluctuationInterval { get { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Wearable.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Wearable.cs index ded04cd5c..f352de4cb 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Wearable.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Wearable.cs @@ -542,6 +542,10 @@ namespace Barotrauma.Items.Components } IsActive = false; +#if CLIENT + //stop any sounds that may have been looping while wearing the item + StopSounds(ActionType.OnWearing); +#endif } public override void UpdateBroken(float deltaTime, Camera cam) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Item.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Item.cs index 18cd30767..330948972 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Item.cs @@ -429,8 +429,6 @@ namespace Barotrauma } } - public float RotationRad { get; private set; } - [ConditionallyEditable(ConditionallyEditable.ConditionType.AllowRotating, DecimalCount = 3, ForceShowPlusMinusButtons = true, ValueStep = 0.1f), Serialize(0.0f, IsPropertySaveable.Yes)] public float Rotation { @@ -705,6 +703,22 @@ namespace Barotrauma get; set; } + /// + /// Have the effects of the item already triggered when it was placed inside it's current container? + /// Used to prevent the effects from executing again when e.g. an existing character (who's inventory items' effects already triggered on some earlier round) spawns mid-round. + /// + [Serialize(false, IsPropertySaveable.Yes)] + public bool OnInsertedEffectsApplied + { + get; set; + } + + /// + /// Were the effects already been applied when the item first spawned (loaded from a save)? + /// Needed for communicating to the clients whether they should trigger when the item spawns. + /// + public bool OnInsertedEffectsAppliedOnPreviousRound; + public Color Color { get { return spriteColor; } @@ -765,7 +779,7 @@ namespace Barotrauma } [Serialize(false, IsPropertySaveable.Yes)] - private bool HasBeenInstantiatedOnce { get; set; } + public bool HasBeenInstantiatedOnce { get; set; } //the default value should be Prefab.Health, but because we can't use it in the attribute, //we'll just use NaN (which does nothing) and set the default value in the constructor/load @@ -807,9 +821,37 @@ namespace Barotrauma set; } + private bool? isDangerous; + /// + /// Bots avoid rooms with dangerous items in them. Normally this value is defined in the prefab, + /// but this property can be used to override the prefab value. + /// + public bool IsDangerous + { + get { return isDangerous ?? Prefab.IsDangerous; } + set + { + isDangerous = value; + if (!value) + { + _dangerousItems.Remove(this); + } + else + { + _dangerousItems.Add(this); + } + } + } + [Editable, Serialize(false, isSaveable: IsPropertySaveable.Yes, "When enabled will prevent the item from taking damage from all sources")] public bool InvulnerableToDamage { get; set; } + /// + /// Should bots automatically unequip the item? Normally always true, but disabled on items that have been configured to be equipped by default in an item set or the character's job items. + /// Note that the value is not saved: if the NPC becomes persistent (e.g. Artie Dolittle hired to the crew) they will no longer keep holding the item. + /// + public bool UnequipAutomatically = true; + /// /// Was the item stolen during the current round. Note that it's possible for the items to be found in the player's inventory even though they weren't actually stolen. /// For example, a guard can place handcuffs there. So use for checking if the item is illegitimately held. @@ -1084,6 +1126,9 @@ namespace Barotrauma public bool IsLadder { get; } + /// + /// Secondary items can be selected at the same time with a primary item (e.g. a ladder or a chair can be selected at the same time with some device). + /// public bool IsSecondaryItem { get; } private ItemStatManager statManager; @@ -1369,13 +1414,7 @@ namespace Barotrauma conditionMultiplierCampaign *= campaign.Settings.FuelMultiplier; } } - if (!HasBeenInstantiatedOnce) - { - // This only needs to be done on the very first instantiation. - // MaxCondition will be multiplied in RecalculateConditionValues(), ensuring - // that Condition will stay in line with the multiplier from then on. - condition *= conditionMultiplierCampaign; - } + condition *= conditionMultiplierCampaign; RecalculateConditionValues(); @@ -1478,13 +1517,14 @@ namespace Barotrauma { ItemComponent component = components[i], cloneComp = clone.components[i]; - - if (component is not CircuitBox origBox || cloneComp is not CircuitBox cloneBox) + if (component.GetType() == cloneComp.GetType()) { - continue; + cloneComp.Clone(component); + } + if (component is CircuitBox origBox && cloneComp is CircuitBox cloneBox) + { + cloneBox.CloneFrom(origBox, clonedContainedItems); } - - cloneBox.CloneFrom(origBox, clonedContainedItems); } clone.FullyInitialized = true; @@ -2293,6 +2333,7 @@ namespace Barotrauma private void SendPendingNetworkUpdatesInternal() { + DebugConsole.NewMessage($"Sending status event for item {Name}", Color.Gray); CreateStatusEvent(loadingRound: false); lastSentCondition = condition; sendConditionUpdateTimer = NetConfig.ItemConditionUpdateInterval; @@ -2300,6 +2341,17 @@ namespace Barotrauma public void CreateStatusEvent(bool loadingRound) { + //A little hacky: clients aren't allowed to apply OnFire effects themselves, which means effects that rely on the "onfire" status tag + //won't work properly. But let's notify clients of the item being on fire when it breaks, so they can e.g. make tanks explode. + + //An alternative could be to allow clients to run OnFire effects, but I suspect it could lead to desyncs if/when there's minor + //discrepancies in the progress of the fires (which is most likely why running them was disabled on clients). + if (GameMain.NetworkMember is { IsServer: true } && + condition <= 0.0f && + StatusEffect.DurationList.Any(d => d.Targets.Contains(this) && d.Parent.HasTag(Barotrauma.Tags.OnFireStatusEffectTag))) + { + GameMain.NetworkMember.CreateEntityEvent(this, new ApplyStatusEffectEventData(ActionType.OnFire)); + } GameMain.NetworkMember.CreateEntityEvent(this, new ItemStatusEventData(loadingRound)); } @@ -2326,10 +2378,11 @@ namespace Barotrauma } private bool isActive = true; + public bool IsInRemoveQueue; public override void Update(float deltaTime, Camera cam) { - if (!isActive || IsLayerHidden) { return; } + if (!isActive || IsLayerHidden || IsInRemoveQueue) { return; } if (impactQueue != null) { @@ -2685,14 +2738,14 @@ namespace Barotrauma partial void OnCollisionProjSpecific(float impact); - public override void FlipX(bool relativeToSub) + public override void FlipX(bool relativeToSub, bool force = false) { //call the base method even if the item can't flip, to handle repositioning when flipping the whole sub base.FlipX(relativeToSub); - if (!Prefab.CanFlipX) + if (!Prefab.CanFlipX && !force) { - flippedX = false; + FlippedX = false; return; } @@ -2714,14 +2767,14 @@ namespace Barotrauma SetContainedItemPositions(); } - public override void FlipY(bool relativeToSub) + public override void FlipY(bool relativeToSub, bool force = false) { //call the base method even if the item can't flip, to handle repositioning when flipping the whole sub base.FlipY(relativeToSub); - if (!Prefab.CanFlipY) + if (!Prefab.CanFlipY && !force) { - flippedY = false; + FlippedY = false; return; } @@ -4059,6 +4112,10 @@ namespace Barotrauma } } + //store this at this point so we can tell the clients whether the effects had already been applied when the item was first loaded, + //(in which case a client should not execute them when they spawn the item) + item.OnInsertedEffectsAppliedOnPreviousRound = item.OnInsertedEffectsApplied; + item.ParseLinks(element, idRemap); bool thisIsOverride = element.GetAttributeBool("isoverride", false); @@ -4124,8 +4181,8 @@ namespace Barotrauma if (element.GetAttributeBool("markedfordeconstruction", false)) { _deconstructItems.Add(item); } float prevRotation = item.Rotation; - if (element.GetAttributeBool("flippedx", false)) { item.FlipX(false); } - if (element.GetAttributeBool("flippedy", false)) { item.FlipY(false); } + if (element.GetAttributeBool("flippedx", false)) { item.FlipX(relativeToSub: false, force: true); } + if (element.GetAttributeBool("flippedy", false)) { item.FlipY(relativeToSub: false, force: true); } item.Rotation = prevRotation; if (appliedSwap != null) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/ItemPrefab.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/ItemPrefab.cs index c98548641..3ae662440 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/ItemPrefab.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/ItemPrefab.cs @@ -5,6 +5,7 @@ using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Security.Cryptography; using System.Xml.Linq; @@ -132,10 +133,30 @@ namespace Barotrauma { public readonly Identifier ItemPrefabIdentifier; - public ItemPrefab ItemPrefab => - ItemPrefab.Prefabs.TryGet(ItemPrefabIdentifier, out var prefab) ? prefab - : MapEntityPrefab.FindByName(ItemPrefabIdentifier.Value) as ItemPrefab; - + [MaybeNull, AllowNull] + public ItemPrefab cachedItemPrefab; + + [MaybeNull, AllowNull] + private Md5Hash prevContentPackagesHash; + + [MaybeNull] + public ItemPrefab ItemPrefab + { + get + { + if (prevContentPackagesHash == null || + !prevContentPackagesHash.Equals(ContentPackageManager.EnabledPackages.MergedHash)) + { + cachedItemPrefab = ItemPrefab.Prefabs.TryGet(ItemPrefabIdentifier, out var prefab) + ? prefab + : MapEntityPrefab.FindByName(ItemPrefabIdentifier.Value) as ItemPrefab; + prevContentPackagesHash = ContentPackageManager.EnabledPackages.MergedHash; + } + + return cachedItemPrefab; + } + } + public override UInt32 UintIdentifier { get; } public override IEnumerable ItemPrefabs => ItemPrefab == null ? Enumerable.Empty() : ItemPrefab.ToEnumerable(); @@ -145,7 +166,7 @@ namespace Barotrauma public override bool MatchesItem(Item item) { - return item?.Prefab.Identifier == ItemPrefabIdentifier; + return item?.Prefab.Identifier == (ItemPrefab?.Identifier ?? ItemPrefabIdentifier); } public RequiredItemByIdentifier(Identifier itemPrefab, int amount, float minCondition, float maxCondition, bool useCondition, LocalizedString overrideDescription, LocalizedString overrideHeader) : @@ -711,6 +732,9 @@ namespace Barotrauma [Serialize(false, IsPropertySaveable.No, description: "Hides the condition displayed in the item's tooltip.")] public bool HideConditionInTooltip { get; set; } + [Serialize("", IsPropertySaveable.No, description: "If set, displays if the given fabrication recipe has been unlocked or not in the tooltip. The actual unlocking of the recipe should be handled in a status effect.")] + public Identifier UnlockedRecipeInToolTip { get; set; } + //if true and the item has trigger areas defined, characters need to be within the trigger to interact with the item //if false, trigger areas define areas that can be used to highlight the item [Serialize(true, IsPropertySaveable.No)] @@ -864,7 +888,7 @@ namespace Barotrauma [Serialize(10.0f, IsPropertySaveable.No)] public float MaxScale { get; private set; } - [Serialize(false, IsPropertySaveable.No)] + [Serialize(false, IsPropertySaveable.No, description: "Bots avoid rooms with dangerous items in them.")] public bool IsDangerous { get; private set; } private int maxStackSize; @@ -1285,6 +1309,11 @@ namespace Barotrauma this.LevelCommonness = levelCommonness.ToImmutableDictionary(); this.LevelQuantity = levelQuantity.ToImmutableDictionary(); + //flipping holdable items vertically is not properly supported (uses the orientation of the physics body, which depends on which direction the character holding the item is facing) + //so let's by default make the item non-flippable, but if there's some use case where the item needs to flip vertically, it can be enabled by explicitly defining it in the XML. + bool canFlipYByDefault = ConfigElement.GetChildElement(nameof(Holdable)) == null; + CanFlipY = ConfigElement.GetAttributeBool(nameof(CanFlipY), def: canFlipYByDefault); + // Backwards compatibility if (storePrices.Any()) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/CoreEntityPrefab.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/CoreEntityPrefab.cs index 193e7fdf0..e6b4bc5ab 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/CoreEntityPrefab.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/CoreEntityPrefab.cs @@ -34,6 +34,7 @@ namespace Barotrauma this.Linkable = linkable; this.AllowedLinks = (allowedLinks ?? Enumerable.Empty()).ToImmutableHashSet(); this.Aliases = (aliases ?? Enumerable.Empty()).Concat(identifier.Value.ToEnumerable()).ToImmutableHashSet(); + this.Scale = 1; } public static CoreEntityPrefab HullPrefab { get; private set; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Creatures/BallastFloraBehavior.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Creatures/BallastFloraBehavior.cs index b1bee1910..a06585116 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Creatures/BallastFloraBehavior.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Creatures/BallastFloraBehavior.cs @@ -570,11 +570,11 @@ namespace Barotrauma.MapCreatures.Behavior if (HasBrokenThrough) { - // I wasn't 100% sure what the performance impact on this so I decide to limit it to only check every 5 seconds + // I wasn't 100% sure what the performance impact on this so I decide to limit it to only check every 10 seconds if (fireCheckCooldown <= 0) { UpdateFireSources(); - fireCheckCooldown = 5f; + fireCheckCooldown = 10f; } else { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/DummyFireSource.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/DummyFireSource.cs index 80428221a..ce25137dc 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/DummyFireSource.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/DummyFireSource.cs @@ -8,6 +8,8 @@ namespace Barotrauma private Vector2 maxSize; public bool CausedByPsychosis; + + protected override float SpreadToOtherHullsProbability => 0.0f; public DummyFireSource(Vector2 maxSize, Vector2 worldPosition, Hull spawningHull = null, bool isNetworkMessage = false) : base(worldPosition, spawningHull, sourceCharacter: null, isNetworkMessage: isNetworkMessage) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/FireSource.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/FireSource.cs index c1f8f335d..9f32878dd 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/FireSource.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/FireSource.cs @@ -22,10 +22,11 @@ namespace Barotrauma /// How often the FireSource checks whether it can spread to nearby hulls. /// const float SpreadToOtherHullsInterval = 5.0f; + /// /// The probability of the fire spreading to a nearby hull when the check is made. /// - const float SpreadToOtherHullsProbability = 0.15f; + protected virtual float SpreadToOtherHullsProbability => 0.15f; protected Hull hull; @@ -252,11 +253,14 @@ namespace Barotrauma LimitSize(); - spreadToOtherHullsTimer -= deltaTime; - if (spreadToOtherHullsTimer <= 0.0f) + if (SpreadToOtherHullsProbability > 0.0f) { - TrySpreadToNearbyHulls(); - spreadToOtherHullsTimer = SpreadToOtherHullsInterval; + spreadToOtherHullsTimer -= deltaTime; + if (spreadToOtherHullsTimer <= 0.0f) + { + TrySpreadToNearbyHulls(); + spreadToOtherHullsTimer = SpreadToOtherHullsInterval; + } } if (size.X > 256.0f && this is not DummyFireSource) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs index 5f047f018..b589458a1 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs @@ -1,4 +1,5 @@ -using Barotrauma.Items.Components; +using Barotrauma.Extensions; +using Barotrauma.Items.Components; using FarseerPhysics; using FarseerPhysics.Dynamics; using Microsoft.Xna.Framework; @@ -829,13 +830,14 @@ namespace Barotrauma foreach (var connectedGap in hull.ConnectedGaps) { if (connectedGap == this) { continue; } + if (connectedGap.IsRoomToRoom != IsRoomToRoom) { continue; } //let the "more open" gap reduce this gap's flow rate //or if they're both equally open, let the one that was created first handle it //(note that we can't use Entity.ID here because gaps on walls don't have IDs) if (connectedGap.open > open || (connectedGap.open == open && connectedGap.CreationIndex < CreationIndex)) { - Rectangle intersection = Rectangle.Intersect(rect, connectedGap.rect); + Rectangle intersection = Rectangle.Intersect(rect.ToWorldRect(), connectedGap.rect.ToWorldRect()); if (intersection.Width > 0 && intersection.Height > 0) { //reduce flow rate based on how much of this gap is covered by the connected one, and how open the connected one is @@ -843,6 +845,7 @@ namespace Barotrauma intersection.Height / (float)rect.Height : intersection.Width / (float)rect.Width; overlappingGapFlowRateReduction += relativeOverlap * connectedGap.open; + overlappingGaps.Add(connectedGap); } } if (overlappingGapFlowRateReduction >= 1.0f) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Hull.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Hull.cs index 4e87e96d9..dce43c267 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Hull.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Hull.cs @@ -442,6 +442,8 @@ namespace Barotrauma /// public bool IsBlue => ColorExtensions.IsBlueDominant(AveragePaintedColor, minimumAlpha: 100); + public const int MaxFireSources = 16; + public List FireSources { get; private set; } public List FakeFireSources { get; private set; } @@ -731,6 +733,10 @@ namespace Barotrauma } else { + if (FireSources.Count >= MaxFireSources) + { + return; + } FireSources.Add(fireSource); } } @@ -781,8 +787,9 @@ namespace Barotrauma { msg.WriteRangedSingle(MathHelper.Clamp(waterVolume / Volume, 0.0f, 1.5f), 0.0f, 1.5f, 8); - msg.WriteRangedInteger(Math.Min(FireSources.Count, 16), 0, 16); - for (int i = 0; i < Math.Min(FireSources.Count, 16); i++) + System.Diagnostics.Debug.Assert(FireSources.Count <= MaxFireSources, $"Too many fire sources ({FireSources.Count}) in hull {ID} (max {MaxFireSources})."); + msg.WriteRangedInteger(Math.Min(FireSources.Count, MaxFireSources), 0, MaxFireSources); + for (int i = 0; i < Math.Min(FireSources.Count, MaxFireSources); i++) { var fireSource = FireSources[i]; Vector2 normalizedPos = new Vector2( @@ -828,7 +835,7 @@ namespace Barotrauma { newWaterVolume = msg.ReadRangedSingle(0.0f, 1.5f, 8) * Volume; - int fireSourceCount = msg.ReadRangedInteger(0, 16); + int fireSourceCount = msg.ReadRangedInteger(0, MaxFireSources); newFireSources = new NetworkFireSource[fireSourceCount]; for (int i = 0; i < fireSourceCount; i++) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Biome.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Biome.cs index 8dbc714ea..402f64bae 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Biome.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Biome.cs @@ -2,6 +2,7 @@ using Barotrauma.Extensions; using System.Collections.Generic; using System.Collections.Immutable; +using System.Linq; namespace Barotrauma { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Level.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Level.cs index 30132cf6c..45f5c4244 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Level.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Level.cs @@ -4481,6 +4481,10 @@ namespace Barotrauma } } } + + bool onlyEntrance = LevelData.Type != LevelData.LevelType.Outpost; + + LocationType locationType = location?.Type; if (missionForcedOutpostParamsId != null && OutpostGenerationParams.OutpostParams.TryGet(missionForcedOutpostParamsId, out var missionForcedOutpostParams)) { @@ -4490,6 +4494,13 @@ namespace Barotrauma { outpostGenerationParams = LevelData.ForceOutpostGenerationParams; } + else if (locationType != null && + locationType.GetForcedOutpostGenerationParams() is { } forcedOutpostGenerationParams && + //do not use the forced parameters if we want to generate only the entrance, and the parameters define a full, pre-built outpost + (!onlyEntrance || forcedOutpostGenerationParams.OutpostFilePath.IsNullOrEmpty())) + { + outpostGenerationParams = forcedOutpostGenerationParams; + } else { outpostGenerationParams = @@ -4497,7 +4508,6 @@ namespace Barotrauma LevelData.GetSuitableOutpostGenerationParams(location, LevelData).GetRandom(Rand.RandSync.ServerAndClient); } - LocationType locationType = location?.Type; if (locationType == null) { locationType = LocationType.Prefabs.GetRandom(Rand.RandSync.ServerAndClient); @@ -4512,7 +4522,7 @@ namespace Barotrauma if (location != null) { DebugConsole.NewMessage($"Generating an outpost for the {(isStart ? "start" : "end")} of the level... (Location: {location.DisplayName}, level type: {LevelData.Type})"); - outpost = OutpostGenerator.Generate(outpostGenerationParams, location, onlyEntrance: LevelData.Type != LevelData.LevelType.Outpost, LevelData.AllowInvalidOutpost); + outpost = OutpostGenerator.Generate(outpostGenerationParams, location, onlyEntrance: onlyEntrance, LevelData.AllowInvalidOutpost); } else { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelData.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelData.cs index db21e3a4e..03e37859c 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelData.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelData.cs @@ -370,19 +370,36 @@ namespace Barotrauma public static IEnumerable GetSuitableOutpostGenerationParams(Location location, LevelData levelData) { - var suitableParams = OutpostGenerationParams.OutpostParams - .Where(p => p.LevelType == null || levelData.Type == p.LevelType) + var paramsForGameMode = OutpostGenerationParams.OutpostParams.Where(p => + p.AllowedGameModeIdentifiers.None() || GameMain.GameSession?.GameMode is not GameMode gameMode || p.AllowedGameModeIdentifiers.Contains(gameMode.Preset.Identifier)); + + var paramsWithMatchingLevelType = paramsForGameMode + .Where(p => p.LevelType == null || levelData.Type == p.LevelType); + + //1. try finding params specifically for this location type + var suitableParams = paramsWithMatchingLevelType .Where(p => location == null || p.AllowedLocationTypes.Contains(location.Type.Identifier)); if (!suitableParams.Any()) { - suitableParams = OutpostGenerationParams.OutpostParams - .Where(p => p.LevelType == null || levelData.Type == p.LevelType) - .Where(p => location == null || !p.AllowedLocationTypes.Any()); + //2. not found, if the location type is configured to use the modules of some other location type, + // see if we could use that location type's generation params + if (!location.Type.UseOutpostModulesOfLocationType.IsEmpty) + { + suitableParams = paramsWithMatchingLevelType + .Where(p => p.AllowedLocationTypes.Contains(location.Type.UseOutpostModulesOfLocationType)); + } if (!suitableParams.Any()) { - DebugConsole.ThrowError($"No suitable outpost generation parameters found for the location type \"{location.Type.Identifier}\". Selecting random parameters."); - suitableParams = OutpostGenerationParams.OutpostParams; + //3. still not found, choose some parameters that are suitable for any location type + suitableParams = paramsWithMatchingLevelType + .Where(p => location == null || !p.AllowedLocationTypes.Any()); + if (!suitableParams.Any()) + { + DebugConsole.ThrowError($"No suitable outpost generation parameters found for the location type \"{location.Type.Identifier}\". Selecting random parameters."); + suitableParams = paramsForGameMode; + } } + } return suitableParams; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Ruins/RuinGenerator.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Ruins/RuinGenerator.cs index 4d4d7ab3b..015787cab 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Ruins/RuinGenerator.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/Ruins/RuinGenerator.cs @@ -37,7 +37,7 @@ namespace Barotrauma.RuinGeneration public void Generate(Level level, LocationType locationType, Point position, bool mirror = false) { - Submarine = OutpostGenerator.Generate(generationParams, locationType, onlyEntrance: false); + Submarine = OutpostGenerator.Generate(generationParams, locationType, onlyEntrance: false, allowInvalidOutpost: level.LevelData.AllowInvalidOutpost); Submarine.Info.Name = $"Ruin ({level.Seed})"; Submarine.Info.Type = SubmarineType.Ruin; Submarine.TeamID = CharacterTeamType.None; diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Map/Location.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Map/Location.cs index 29ddeb2e4..95d602dce 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Map/Location.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Map/Location.cs @@ -478,6 +478,11 @@ namespace Barotrauma } } + /// + /// Missions that are available and visible in menus () + /// + public IEnumerable AvailableAndVisibleMissions => AvailableMissions.Where(m => m.Prefab.ShowInMenus); + private readonly List selectedMissions = new List(); public IEnumerable SelectedMissions { @@ -580,9 +585,9 @@ namespace Barotrauma return $"Location ({DisplayName ?? "null"})"; } - public Location(Vector2 mapPosition, int? zone, Random rand, bool requireOutpost = false, LocationType forceLocationType = null, IEnumerable existingLocations = null) + public Location(Vector2 mapPosition, int? zone, Identifier? biomeId, Random rand, bool requireOutpost = false, LocationType forceLocationType = null, IEnumerable existingLocations = null) { - Type = OriginalType = forceLocationType ?? LocationType.Random(rand, zone, requireOutpost); + Type = OriginalType = forceLocationType ?? LocationType.Random(rand, zone, biomeId, requireOutpost); CreateRandomName(Type, rand, existingLocations); MapPosition = mapPosition; PortraitId = ToolBox.StringToInt(nameIdentifier.Value); @@ -782,12 +787,12 @@ namespace Barotrauma } } - public static Location CreateRandom(Vector2 position, int? zone, Random rand, bool requireOutpost, LocationType forceLocationType = null, IEnumerable existingLocations = null) + public static Location CreateRandom(Vector2 position, int? zone, Identifier? biomeId, Random rand, bool requireOutpost, LocationType forceLocationType = null, IEnumerable existingLocations = null) { - return new Location(position, zone, rand, requireOutpost, forceLocationType, existingLocations); + return new Location(position, zone, biomeId, rand, requireOutpost, forceLocationType, existingLocations); } - public void ChangeType(CampaignMode campaign, LocationType newType, bool createStores = true) + public void ChangeType(CampaignMode campaign, LocationType newType, bool createStores = true, bool unlockInitialMissions = true) { if (newType == Type) { return; } @@ -826,10 +831,10 @@ namespace Barotrauma if (Type.Faction == Identifier.Empty) { Faction = null; } if (Type.SecondaryFaction == Identifier.Empty) { SecondaryFaction = null; } } - - if (!IsCriticallyRadiated()) + + if (unlockInitialMissions && !IsCriticallyRadiated()) { - UnlockInitialMissions(Rand.RandSync.Unsynced); + UnlockInitialMissions(Rand.RandSync.Unsynced); } if (createStores) @@ -1257,7 +1262,7 @@ namespace Barotrauma { if (type?.NameFormats == null || !type.NameFormats.Any() || nameFormatIndex < 0) { - return TextManager.Get(nameId); + return TextManager.Get(nameId).Fallback(nameId.Value); } return type.NameFormats[nameFormatIndex % type.NameFormats.Count].Replace("[name]", TextManager.Get(nameId).Value); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Map/LocationType.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Map/LocationType.cs index 3c9960488..710397b4a 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Map/LocationType.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Map/LocationType.cs @@ -13,7 +13,7 @@ namespace Barotrauma class LocationType : PrefabWithUintIdentifier { public static readonly PrefabCollection Prefabs = new PrefabCollection(); - + private readonly ImmutableArray rawNames; private readonly ImmutableArray portraits; @@ -21,13 +21,14 @@ namespace Barotrauma private readonly ImmutableArray<(Identifier Identifier, float Commonness, bool AlwaysAvailableIfMissingFromCrew)> hireableJobs; private readonly float totalHireableWeight; - public readonly Dictionary CommonnessPerZone = new Dictionary(); - public readonly Dictionary MinCountPerZone = new Dictionary(); - public readonly LocalizedString Name; + public readonly LocalizedString Description; - public readonly Identifier ForceLocationName; + /// + /// Forces all locations of this LocationType to use the given name. Can either be a text tag or the actual name. + /// + public readonly Identifier ForceLocationName; public readonly float BeaconStationChance; @@ -43,11 +44,151 @@ namespace Barotrauma public readonly ImmutableArray MissionIdentifiers; public readonly ImmutableArray MissionTags; - public readonly List HideEntitySubcategories = new List(); + public abstract class AreaSettingData + { + public int? MinCount { get; } + public int? MaxCount { get; } + public float Commonness { get; } - public bool IsEnterable { get; private set; } + /// + /// Desired position in the biome or difficulty zone. A value between 0 and 1, where 0 is the left side of the zone/biome, and 1 the right side. + /// + public float? DesiredPosition { get; } + + public bool HasCounts => MinCount.HasValue && MaxCount.HasValue && (MaxCount > 0 || MinCount > 0); + public virtual bool HasValidData => true; - public bool AllowAsBiomeGate { get; private set; } + internal AreaSettingData(int? minCount, int? maxCount, float commonness, float? desiredPosition) + { + MinCount = minCount; + MaxCount = maxCount; + Commonness = commonness; + DesiredPosition = desiredPosition; + } + + public virtual bool MatchesRemainingCount(MapLocationTypeGenerator.LocationTypeCount locationTypeCount) + { + return false; + } + + public virtual bool MatchesLocation(Map map, Location location) + { + return false; + } + + public virtual bool MatchesZone(int zoneIndex) + { + return false; + } + + public virtual bool MatchesBiome(Identifier biomeIdentifier) + { + return false; + } + + public virtual bool Matches(int? zone = null, Identifier? biomeId = null) + { + return false; + } + } + + public class BiomeSettingData : AreaSettingData + { + public Identifier BiomeIdentifier { get; } + + public override bool HasValidData => Biome.Prefabs.ContainsKey(BiomeIdentifier); + + public BiomeSettingData(Identifier biomeIdentifier, int? minCount, int? maxCount, float commonness, float? desiredPosition, LocationType locationType) + : base(minCount, maxCount, commonness, desiredPosition) + { + if (minCount > maxCount) + { + DebugConsole.AddWarning($"Error in location type {locationType.Identifier}: minimum count larger than maximum count in biome {biomeIdentifier}.", + contentPackage: locationType.ContentPackage); + } + BiomeIdentifier = biomeIdentifier; + } + + public override bool MatchesRemainingCount(MapLocationTypeGenerator.LocationTypeCount locationTypeCount) + { + return locationTypeCount.BiomeId == BiomeIdentifier; + } + + public override bool MatchesLocation(Map map, Location location) + { + return BiomeIdentifier == location.Biome?.Identifier; + } + + public override bool MatchesBiome(Identifier biomeIdentifier) + { + return BiomeIdentifier == biomeIdentifier; + } + + public override bool Matches(int? zone = null, Identifier? biomeId = null) + { + return biomeId.HasValue && biomeId == BiomeIdentifier; + } + } + + public class DifficultyZoneSettingData : AreaSettingData + { + public int DifficultyZone { get; } + + public DifficultyZoneSettingData(int difficultyZone, int? minCount, int? maxCount, float commonness, float? desiredPosition, LocationType locationType) + : base(minCount, maxCount, commonness, desiredPosition) + { + if (minCount > maxCount) + { + DebugConsole.AddWarning($"Error in location type {locationType.Identifier}: minimum count larger than maximum count in difficulty zone {difficultyZone}.", + contentPackage: locationType.ContentPackage); + } + DifficultyZone = difficultyZone; + } + + public override bool MatchesRemainingCount(MapLocationTypeGenerator.LocationTypeCount locationTypeCount) + { + return locationTypeCount.DifficultyZone == DifficultyZone; + } + + public override bool MatchesLocation(Map map, Location location) + { + return DifficultyZone == map.GetZoneIndex(location.MapPosition.X); + } + + public override bool MatchesZone(int zoneIndex) + { + return DifficultyZone == zoneIndex; + } + + public override bool Matches(int? zone = null, Identifier? biomeId = null) + { + return zone.HasValue && zone == DifficultyZone; + } + } + + public readonly List AreaSettings = new List(); + + public readonly List HideEntitySubcategories; + + public enum BiomeGateSetting + { + /// + /// Can be used as a gate between biomes, but not required + /// + Allow, + /// + /// Cannot be used as a gate between biomes + /// + Deny, + /// + /// Must be used as a gate between biomes during map generation + /// + Force + } + + public BiomeGateSetting BiomeGate { get; private set; } + + public bool ForceAsStartOutpost { get; private set; } /// /// Can this location type be used in the random, non-campaign levels that don't take place in any specific zone @@ -108,10 +249,26 @@ namespace Barotrauma private readonly Identifier forceOutpostGenerationParamsIdentifier; + /// + /// Can be used to make the location type use the same background music tracks as another location type. + /// + public readonly Identifier BackgroundMusicLocationType; + /// /// If set to true, only event sets that explicitly define this location type in can be selected at this location. Defaults to false. /// public bool IgnoreGenericEvents { get; } + + /// + /// Used as criteria for validating if a given event set is suitable for this locationType. + /// For example, if set to "city", events that appear in "city" type locations can also appear here. + /// + public Identifier EventLocationType { get; private set; } + + /// + /// If set, outpost modules configured to be suitable for the specified location type can also be used in this type of location. + /// + public Identifier UseOutpostModulesOfLocationType { get; set; } public Color SpriteColor { @@ -134,7 +291,7 @@ namespace Barotrauma public int DailySpecialsCount { get; } = 1; public int RequestedGoodsCount { get; } = 1; - public readonly bool ShowSonarMarker = true; + public readonly bool ShowSonarMarker; public override string ToString() { @@ -145,13 +302,41 @@ namespace Barotrauma { Name = TextManager.Get("LocationName." + Identifier, "unknown"); Description = TextManager.Get("LocationDescription." + Identifier, ""); - + + // for location types based on others, e.g., Named Unique outpost, we may want to override the name of the type to still say Outpost on the map: + var forceNameId = element.GetAttributeIdentifier("ForceLocationTypeName", string.Empty); + if (!forceNameId.IsEmpty) + { + var forcedName = TextManager.Get("LocationName." + forceNameId); + if (!forcedName.IsNullOrEmpty()) + { + Name = forcedName; + } + } + + var forceDescriptionId = element.GetAttributeIdentifier("ForceLocationTypeDescription", string.Empty); + if (!forceDescriptionId.IsEmpty) + { + var forcedDescription = TextManager.Get("LocationDescription." + forceDescriptionId); + if (!forcedDescription.IsNullOrEmpty()) + { + Description = forcedDescription; + } + } + BeaconStationChance = element.GetAttributeFloat("beaconstationchance", 0.0f); UsePortraitInRandomLoadingScreens = element.GetAttributeBool(nameof(UsePortraitInRandomLoadingScreens), true); HasOutpost = element.GetAttributeBool("hasoutpost", true); - IsEnterable = element.GetAttributeBool("isenterable", HasOutpost); - AllowAsBiomeGate = element.GetAttributeBool(nameof(AllowAsBiomeGate), true); + bool allowAsBiomeGateLegacy = element.GetAttributeBool("allowasbiomegate", true); + BiomeGate = element.GetAttributeEnum("BiomeGate", def: allowAsBiomeGateLegacy ? BiomeGateSetting.Allow : BiomeGateSetting.Deny); + if (BiomeGate != BiomeGateSetting.Deny && !HasOutpost) + { + DebugConsole.AddWarning($"Potential error in location type {Identifier}: the location is set to be allowed as a biome gate, but will never be chosen as one because it has no outpost.", + contentPackage: ContentPackage); + } + + ForceAsStartOutpost = element.GetAttributeBool(nameof(ForceAsStartOutpost), false); AllowInRandomLevels = element.GetAttributeBool(nameof(AllowInRandomLevels), true); Faction = element.GetAttributeIdentifier(nameof(Faction), Identifier.Empty); @@ -168,17 +353,24 @@ namespace Barotrauma DescriptionInRadiation = element.GetAttributeIdentifier(nameof(DescriptionInRadiation), "locationdescription.abandonedirradiated"); forceOutpostGenerationParamsIdentifier = element.GetAttributeIdentifier("forceoutpostgenerationparams", Identifier.Empty); + BackgroundMusicLocationType = element.GetAttributeIdentifier(nameof(BackgroundMusicLocationType), Identifier.Empty); IgnoreGenericEvents = element.GetAttributeBool(nameof(IgnoreGenericEvents), false); + + EventLocationType = element.GetAttributeIdentifier(nameof(EventLocationType), Identifier.Empty); + UseOutpostModulesOfLocationType = element.GetAttributeIdentifier(nameof(UseOutpostModulesOfLocationType), Identifier.Empty); IsAnyOutpost = element.GetAttributeBool(nameof(IsAnyOutpost), def: HasOutpost); string teamStr = element.GetAttributeString("outpostteam", "FriendlyNPC"); Enum.TryParse(teamStr, out OutpostTeam); - if (element.GetAttribute("name") != null) + if (element.GetAttribute(nameof(ForceLocationName)) != null || + element.GetAttribute("name") != null) { - ForceLocationName = element.GetAttributeIdentifier("name", string.Empty); + ForceLocationName = element.GetAttributeIdentifier(nameof(ForceLocationName), + //backwards compatibility + def: element.GetAttributeIdentifier("name", string.Empty)); } else { @@ -214,15 +406,18 @@ namespace Barotrauma string[] commonnessPerZoneStrs = element.GetAttributeStringArray("commonnessperzone", Array.Empty()); foreach (string commonnessPerZoneStr in commonnessPerZoneStrs) { - string[] splitCommonnessPerZone = commonnessPerZoneStr.Split(':'); + string[] splitCommonnessPerZone = commonnessPerZoneStr.Split(':'); if (splitCommonnessPerZone.Length != 2 || !int.TryParse(splitCommonnessPerZone[0].Trim(), out int zoneIndex) || !float.TryParse(splitCommonnessPerZone[1].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture, out float zoneCommonness)) { - DebugConsole.ThrowError("Failed to read commonness values for location type \"" + Identifier + "\" - commonness should be given in the format \"zone1index: zone1commonness, zone2index: zone2commonness\""); + DebugConsole.ThrowError("Failed to read commonness values for location type \"" + Identifier + "\" - commonness should be given in the format \"zone1index: zone1commonness, zone2index: zone2commonness\"", contentPackage: element.ContentPackage); break; } - CommonnessPerZone[zoneIndex] = zoneCommonness; + + if (zoneCommonness <= 0.0f) { continue; } + + AugmentDifficultyZoneSettings(zoneIndex, zoneCommonness, minCount: null); } string[] minCountPerZoneStrs = element.GetAttributeStringArray("mincountperzone", Array.Empty()); @@ -233,13 +428,40 @@ namespace Barotrauma !int.TryParse(splitMinCountPerZone[0].Trim(), out int zoneIndex) || !int.TryParse(splitMinCountPerZone[1].Trim(), out int minCount)) { - DebugConsole.ThrowError("Failed to read minimum count values for location type \"" + Identifier + "\" - minimum counts should be given in the format \"zone1index: zone1mincount, zone2index: zone2mincount\""); + DebugConsole.ThrowError("Failed to read minimum zone count values for location type \"" + Identifier + + "\" - minimum zone counts should be given in the format \"zone1index: zone1mincount, zone2index: zone2mincount\"", contentPackage: element.ContentPackage); break; } - MinCountPerZone[zoneIndex] = minCount; + + if (minCount <= 0) { continue; } + + AugmentDifficultyZoneSettings(zoneIndex, zoneCommonness: null, minCount); } - var portraits = new List(); - var hireableJobs = new List<(Identifier, float, bool)>(); + + void AugmentDifficultyZoneSettings(int zoneIndex, float? zoneCommonness, int? minCount) + { + + var existingSettings = AreaSettings.Find(areaSettingData => areaSettingData is DifficultyZoneSettingData difficultyZoneSettingData && + difficultyZoneSettingData.DifficultyZone == zoneIndex); + + if (existingSettings != null) + { + int index = AreaSettings.IndexOf(existingSettings); + AreaSettings[index] = new DifficultyZoneSettingData(zoneIndex, + minCount ?? existingSettings.MinCount, + //note that assigning minCount to maxCount is intentional here: + //previously it was only possible to define minCount (essentially the same as just defining "count" now) + maxCount: minCount ?? existingSettings.MaxCount, + commonness: zoneCommonness ?? existingSettings.Commonness, desiredPosition: null, locationType: this); + } + else + { + AreaSettings.Add(new DifficultyZoneSettingData(zoneIndex, minCount ?? 0, maxCount: minCount ?? 0, commonness: zoneCommonness ?? 0, desiredPosition: null, locationType: this)); + } + } + + var portraitsList = new List(); + var hireableJobsList = new List<(Identifier, float, bool)>(); foreach (var subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) @@ -249,7 +471,7 @@ namespace Barotrauma float jobCommonness = subElement.GetAttributeFloat("commonness", 1.0f); bool availableIfMissing = subElement.GetAttributeBool("AlwaysAvailableIfMissingFromCrew", false); totalHireableWeight += jobCommonness; - hireableJobs.Add((jobIdentifier, jobCommonness, availableIfMissing)); + hireableJobsList.Add((jobIdentifier, jobCommonness, availableIfMissing)); break; case "symbol": Sprite = new Sprite(subElement, lazyLoad: true); @@ -265,7 +487,7 @@ namespace Barotrauma var portrait = new Sprite(subElement, lazyLoad: true); if (portrait != null) { - portraits.Add(portrait); + portraitsList.Add(portrait); } break; case "store": @@ -281,10 +503,71 @@ namespace Barotrauma DailySpecialsCount = subElement.GetAttributeInt("dailyspecialscount", DailySpecialsCount); RequestedGoodsCount = subElement.GetAttributeInt("requestedgoodscount", RequestedGoodsCount); break; + case "areasettings": + ParseAreaSettings(subElement); + break; + } + } + this.portraits = portraitsList.ToImmutableArray(); + this.hireableJobs = hireableJobsList.ToImmutableArray(); + + void ParseAreaSettings(ContentXElement areaSettingsElement) + { + Identifier biomeIdentifier = areaSettingsElement.GetAttributeIdentifier("biome", Identifier.Empty); + int zone = areaSettingsElement.GetAttributeInt("zone", 0); + + if (biomeIdentifier == Identifier.Empty && zone == 0) + { + DebugConsole.ThrowError("Failed to read area settings for locationType \"" + Identifier + "\" - biome identifier and zone are both missing.", contentPackage: element.ContentPackage); + return; + } + + if (biomeIdentifier != Identifier.Empty && zone != 0) + { + DebugConsole.ThrowError("Failed to read area settings for locationType \"" + Identifier + "\" - both biome identifier and zone are defined. Must be one or the other.", contentPackage: element.ContentPackage); + return; + } + + bool HasComma(string intAttributeName) + { + var attr = areaSettingsElement.GetAttribute(intAttributeName); + if (attr == null) { return false;} + return attr.Value.Contains(','); + } + + if (HasComma("mincount") || HasComma("maxcount") || HasComma("count")) + { + DebugConsole.LogError($"AreaSettings for locationType {Identifier} has comma inside int count attribute. This causes the resulting parse to combine the numbers, resulting in incorrect amount of locations.", + contentPackage: ContentPackage); + } + + int? minCount = areaSettingsElement.GetAttributeNullableInt("mincount"); + int? maxCount = areaSettingsElement.GetAttributeNullableInt("maxcount"); + int? count = areaSettingsElement.GetAttributeNullableInt("count"); + float? desiredPosition = areaSettingsElement.GetAttributeNullableFloat("desiredposition"); + float commonness = areaSettingsElement.GetAttributeFloat("commonness", 0); + + // if set, count overrides min and max count to eliminate randomness + if (count.HasValue) + { + minCount = count; + maxCount = count; + } + else if (minCount.HasValue && maxCount.HasValue && minCount <= 0 && maxCount <= 0) + { + DebugConsole.AddWarning("Failed to read count value for location type \"" + Identifier + "\" - both min and max count are 0.", contentPackage: element.ContentPackage); + return; + } + + if (biomeIdentifier != Identifier.Empty) + { + AreaSettings.Add(new BiomeSettingData(biomeIdentifier, minCount, maxCount, commonness, desiredPosition, locationType: this)); + } + else + { + AreaSettings.Add(new DifficultyZoneSettingData(zone, minCount, maxCount, commonness, desiredPosition, locationType: this)); } } - this.portraits = portraits.ToImmutableArray(); - this.hireableJobs = hireableJobs.ToImmutableArray(); } public IEnumerable GetHireablesMissingFromCrew() @@ -383,7 +666,7 @@ namespace Barotrauma return rawNames[rand.Next() % rawNames.Length]; } - public static LocationType Random(Random rand, int? zone = null, bool requireOutpost = false, Func predicate = null) + public static LocationType Random(Random rand, int? zone = null, Identifier? biomeId = null, bool requireOutpost = false, Func predicate = null) { Debug.Assert(Prefabs.Any(), "LocationType.list.Count == 0, you probably need to initialize LocationTypes"); @@ -392,19 +675,22 @@ namespace Barotrauma (predicate == null || predicate(lt)) && IsValid(lt)) .OrderBy(p => p.UintIdentifier).ToArray(); - bool IsValid(LocationType lt) + bool IsValid(LocationType locationType) { - if (requireOutpost && !lt.HasOutpost) { return false; } - if (zone.HasValue) - { - if (!lt.CommonnessPerZone.ContainsKey(zone.Value)) { return false; } - } + if (requireOutpost && !locationType.HasOutpost) { return false; } + + bool validZone = !zone.HasValue || locationType.AreaSettings.Any(areaSetting => areaSetting.MatchesZone(zone.Value)); + bool validBiome = !biomeId.HasValue || locationType.AreaSettings.Any(areaSetting => areaSetting.MatchesBiome(biomeId.Value)); + + if (!validZone && !validBiome) { return false; } + //if zone is not defined, this is a "random" (non-campaign) level //-> don't choose location types that aren't allowed in those - else if (!lt.AllowInRandomLevels) + if (!zone.HasValue && !biomeId.HasValue && !locationType.AllowInRandomLevels) { return false; } + return true; } @@ -413,11 +699,12 @@ namespace Barotrauma DebugConsole.ThrowError("Could not generate a random location type - no location types for the zone " + zone + " found!"); } - if (zone.HasValue) + if (zone.HasValue || biomeId.HasValue) { return ToolBox.SelectWeightedRandom( allowedLocationTypes, - allowedLocationTypes.Select(a => a.CommonnessPerZone[zone.Value]).ToArray(), + allowedLocationTypes.Select(allowedType => + allowedType.AreaSettings.Find(areaSetting => areaSetting.MatchesZone(zone.Value) || areaSetting.MatchesBiome(biomeId.Value))?.Commonness ?? 0).ToArray(), rand); } else @@ -425,6 +712,17 @@ namespace Barotrauma return allowedLocationTypes[rand.Next() % allowedLocationTypes.Length]; } } + + public bool IsValidForZoneOrBiome(int? zone, Identifier? biomeIdentifier) + { + //if zone is not defined, this is a "random" (non-campaign) level + //-> don't choose location types that aren't allowed in those + if (!zone.HasValue && !AllowInRandomLevels) { return false; } + + if (!zone.HasValue && !biomeIdentifier.HasValue) { return true; } + + return AreaSettings.Any(setting => setting.Matches(zone, biomeIdentifier)); + } public OutpostGenerationParams GetForcedOutpostGenerationParams() { @@ -434,6 +732,11 @@ namespace Barotrauma } return null; } + + public bool HasCounts() + { + return AreaSettings.Any(setting => setting.HasCounts); + } public override void Dispose() { } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Map/Map.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Map/Map.cs index 7565080b8..dbfb5ece0 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Map/Map.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Map/Map.cs @@ -77,6 +77,9 @@ namespace Barotrauma public Radiation Radiation; private bool trackedLocationDiscoveryAndVisitOrder = true; + + private IOrderedEnumerable _orderedBiomes; + public IOrderedEnumerable OrderedBiomes => _orderedBiomes ??= Biome.Prefabs.GetOrdered(); public Map(CampaignSettings settings) { @@ -240,10 +243,7 @@ namespace Barotrauma Vector2 mapPos = new Vector2( MathHelper.Lerp(firstEndLocation.MapPosition.X, Width, MathHelper.Lerp(0.2f, 0.8f, i / (float)missingOutpostCount)), Height * MathHelper.Lerp(0.2f, 1.0f, (float)rand.NextDouble())); - var newEndLocation = new Location(mapPos, generationParams.DifficultyZones, rand, forceLocationType: firstEndLocation.Type, existingLocations: Locations) - { - Biome = endLocations.First().Biome - }; + var newEndLocation = new Location(mapPos, generationParams.DifficultyZones, firstEndLocation.Biome.Identifier, rand, forceLocationType: firstEndLocation.Type, existingLocations: Locations); newEndLocation.LevelData = new LevelData(newEndLocation, this, difficulty: 100.0f); Locations.Add(newEndLocation); endLocations.Add(newEndLocation); @@ -365,6 +365,14 @@ namespace Barotrauma { CurrentLocation.ChangeType(campaign, tutorialOutpost); } + else + { + var forceStartOutpostType = LocationType.Prefabs.Where(lt => lt.ForceAsStartOutpost).GetRandom(Rand.RandSync.ServerAndClient); + if (forceStartOutpostType != null) + { + CurrentLocation.ChangeType(campaign, forceStartOutpostType); + } + } Discover(CurrentLocation); Visit(CurrentLocation); CurrentLocation.CreateStores(); @@ -396,13 +404,16 @@ namespace Barotrauma y + generationParams.VoronoiSiteVariance.Y * Rand.Range(-0.5f, 0.5f, Rand.RandSync.ServerAndClient))); } } + + // put some of this stuff in a helper class, this function is getting unwieldy + MapLocationTypeGenerator mapLocationTypeGenerator = new MapLocationTypeGenerator(campaign, this); Voronoi voronoi = new Voronoi(0.5f); List edges = voronoi.MakeVoronoiGraph(voronoiSites, Width, Height); Vector2 margin = new Vector2( - Math.Min(10, Width * 0.1f), - Math.Min(10, Height * 0.2f)); + Math.Min(10, Width * 0.1f), + Math.Min(10, Height * 0.2f)); float startX = margin.X, endX = Width - margin.X; float startY = margin.Y, endY = Height - margin.Y; @@ -413,8 +424,6 @@ namespace Barotrauma } voronoiSites.Clear(); - Dictionary> locationsPerZone = new Dictionary>(); - bool possibleStartOutpostCreated = false; foreach (GraphEdge edge in edges) { if (edge.Point1 == edge.Point2) { continue; } @@ -442,33 +451,18 @@ namespace Barotrauma Vector2 position = points[positionIndex]; if (newLocations[1 - i] != null && newLocations[1 - i].MapPosition == position) { position = points[1 - positionIndex]; } + int zone = GetZoneIndex(position.X); - if (!locationsPerZone.ContainsKey(zone)) - { - locationsPerZone[zone] = new List(); - } - LocationType forceLocationType = null; - if (forceLocationType == null) - { - foreach (LocationType locationType in LocationType.Prefabs.OrderBy(lt => lt.Identifier)) - { - if (locationType.MinCountPerZone.TryGetValue(zone, out int minCount) && locationsPerZone[zone].Count(l => l.Type == locationType) < minCount) - { - forceLocationType = locationType; - break; - } - } - } - - newLocations[i] = Location.CreateRandom(position, zone, Rand.GetRNG(Rand.RandSync.ServerAndClient), - requireOutpost: false, forceLocationType: forceLocationType, existingLocations: Locations); - locationsPerZone[zone].Add(newLocations[i]); + newLocations[i] = Location.CreateRandom(position, zone, GetBiome(position.X)?.Identifier, Rand.GetRNG(Rand.RandSync.ServerAndClient), + requireOutpost: false, forceLocationType: null, existingLocations: Locations); + + mapLocationTypeGenerator.AddToLocationsPerZone(zone, newLocations[i]); Locations.Add(newLocations[i]); } var newConnection = new LocationConnection(newLocations[0], newLocations[1]); - Connections.Add(newConnection); + Connections.Add(newConnection); } //remove connections that are too short @@ -481,7 +475,6 @@ namespace Barotrauma { continue; } - //locations.Remove(connection.Locations[0]); Connections.Remove(connection); @@ -572,7 +565,6 @@ namespace Barotrauma { (zone1, zone2) = (zone2, zone1); } - if (generationParams.GateCount[zone1] == 0) { continue; } if (!connectionsBetweenZones[zone1].Any()) @@ -589,7 +581,7 @@ namespace Barotrauma } } else if (connectionsBetweenZones[zone1].Count() < generationParams.GateCount[zone1] && - connectionsBetweenZones[zone1].None(c => c.Locations.Contains(connection.Locations[0]) || c.Locations.Contains(connection.Locations[1]))) + connectionsBetweenZones[zone1].None(c => c.Locations.Contains(connection.Locations[0]) || c.Locations.Contains(connection.Locations[1]))) { connectionsBetweenZones[zone1].Add(connection); } @@ -599,6 +591,8 @@ namespace Barotrauma } } + var orderedPrefabs = LocationType.Prefabs.GetOrdered(); + List forciblyReassignedGateLocations = new List(); var gateFactions = campaign.Factions.Where(f => f.Prefab.ControlledOutpostPercentage > 0).OrderBy(f => f.Prefab.Identifier).ToList(); for (int i = Connections.Count - 1; i >= 0; i--) { @@ -617,20 +611,37 @@ namespace Barotrauma { var leftMostLocation = Connections[i].Locations[0].MapPosition.X < Connections[i].Locations[1].MapPosition.X ? - Connections[i].Locations[0] : - Connections[i].Locations[1]; + Connections[i].Locations[0] : + Connections[i].Locations[1]; if (!AllowAsBiomeGate(leftMostLocation.Type)) { + var potentialGateLocationTypes = orderedPrefabs.Where(AllowAsBiomeGate); + LocationType gateLocationType = + //choose some location type that's allowed in this zone/biome, and has a non zero commonness (instead of some fixed count) + potentialGateLocationTypes.Where(lt => lt.AreaSettings.Any(areaSettings => areaSettings.MatchesLocation(this, leftMostLocation) && areaSettings.Commonness > 0)).GetRandom(Rand.RandSync.ServerAndClient) ?? + //if not found, use something with a fixed count + potentialGateLocationTypes.Where(lt => lt.AreaSettings.Any(areaSettings => areaSettings.MatchesLocation(this, leftMostLocation) && areaSettings.MinCount > 0)).GetRandom(Rand.RandSync.ServerAndClient) ?? + //if that's not found either, try finding a type that doesn't spawn in any biome, but is allowed as a biome gate + //(a mod might have some special "biome gate" location types that are meant just for the gate locations) + potentialGateLocationTypes.Where(lt => lt.AreaSettings.None(areaSettings => areaSettings.Commonness > 0.0f || areaSettings.HasCounts)).GetRandom(Rand.RandSync.ServerAndClient); + + if (gateLocationType == null) + { + DebugConsole.ThrowError($"Failed to find a suitable location type for a gate location between zones {zone1} and {zone2}."); + continue; + } leftMostLocation.ChangeType( campaign, - LocationType.Prefabs.OrderBy(lt => lt.Identifier).First(lt => AllowAsBiomeGate(lt)), - createStores: false); + gateLocationType, + createStores: false, + unlockInitialMissions: false); + forciblyReassignedGateLocations.Add(leftMostLocation); } static bool AllowAsBiomeGate(LocationType lt) { //checking for "abandoned" is not strictly necessary here because it's now configured to not be allowed as a biome gate //but might be better to keep it for backwards compatibility (previously we relied only on that check) - return lt.HasOutpost && lt.Identifier != "abandoned" && lt.AllowAsBiomeGate; + return lt.HasOutpost && lt.Identifier != "abandoned" && lt.BiomeGate != LocationType.BiomeGateSetting.Deny; } leftMostLocation.IsGateBetweenBiomes = true; @@ -663,8 +674,8 @@ namespace Barotrauma if (!connection.Locked) { continue; } var rightMostLocation = connection.Locations[0].MapPosition.X > connection.Locations[1].MapPosition.X ? - connection.Locations[0] : - connection.Locations[1]; + connection.Locations[0] : + connection.Locations[1]; //if all of the other connected locations are to the left (= if there's no path forwards from the outpost), //create a new connection to the closest location to the right @@ -693,8 +704,18 @@ namespace Barotrauma //remove orphans Locations.RemoveAll(l => !Connections.Any(c => c.Locations.Contains(l))); + + AssignBiomes(Rand.GetRNG(Rand.RandSync.ServerAndClient)); - AssignBiomes(new MTRandom(ToolBox.StringToInt(Seed))); + var gateLocations = Locations.Where(l => l.IsGateBetweenBiomes); + foreach (var gateLocation in forciblyReassignedGateLocations) + { + //remove the gate locations who's types we've reassigned from the remaining types left to assign, + //(i.e. if we want just 1 of some location type, and we were forced to choose it as a gate, don't use that type again) + //must be done after assigning biomes + mapLocationTypeGenerator.RemoveOneFromTotals(gateLocation.Type, gateLocation); + } + mapLocationTypeGenerator.AssignForcedBiomeGateTypes(gateLocations); foreach (LocationConnection connection in Connections) { @@ -713,8 +734,13 @@ namespace Barotrauma if (LocationType.Prefabs.TryGet("outpost", out LocationType startLocationType)) { startLocation.ChangeType(campaign, startLocationType, createStores: false); + mapLocationTypeGenerator.AddToFilled(startLocation); } + mapLocationTypeGenerator.AssignLocationTypesBasedOnDesiredPosition(gateLocations); + + //create proper level data and stores for all locations + //(needs to be done before AssignLocationCounts, since LevelData may be required for the location type changes) foreach (Location location in Locations) { location.LevelData = new LevelData(location, this, CalculateDifficulty(location.MapPosition.X, location.Biome)); @@ -733,6 +759,15 @@ namespace Barotrauma } } } + //needs to be done after the LevelData has been assigned above + foreach (var gateLocation in forciblyReassignedGateLocations) + { + gateLocation.UnlockInitialMissions(Rand.RandSync.ServerAndClient); + } + + List locationsToAssign = Locations.ToList(); + locationsToAssign.Remove(GetPreviousToEndLocation()); + mapLocationTypeGenerator.AssignLocationTypesBasedOnCount(gateLocations, locations: locationsToAssign); foreach (LocationConnection connection in Connections) { @@ -740,7 +775,6 @@ namespace Barotrauma } CreateEndLocation(campaign); - float CalculateDifficulty(float mapPosition, Biome biome) { float settingsFactor = campaign.Settings.LevelDifficultyMultiplier; @@ -779,23 +813,27 @@ namespace Barotrauma float zoneWidth = Width / generationParams.DifficultyZones; int zoneIndex = (int)Math.Floor(xPos / zoneWidth) + 1; zoneIndex = Math.Clamp(zoneIndex, 1, generationParams.DifficultyZones - 1); - return Biome.Prefabs.FirstOrDefault(b => b.AllowedZones.Contains(zoneIndex)); + return OrderedBiomes.FirstOrDefault(b => b.AllowedZones.Contains(zoneIndex)); } + /// + /// Assign biomes for the connections between locations, ad for the locations that don't yet have a biome assigned. + /// private void AssignBiomes(Random rand) { - var biomes = Biome.Prefabs; float zoneWidth = Width / generationParams.DifficultyZones; List allowedBiomes = new List(10); for (int i = 0; i < generationParams.DifficultyZones; i++) { + int zoneIndex = i + 1; allowedBiomes.Clear(); - allowedBiomes.AddRange(biomes.Where(b => b.AllowedZones.Contains(generationParams.DifficultyZones - i))); - float zoneX = zoneWidth * (generationParams.DifficultyZones - i); + allowedBiomes.AddRange(OrderedBiomes.Where(b => b.AllowedZones.Contains(zoneIndex))); + float zoneX = zoneWidth * (zoneIndex); foreach (Location location in Locations) { + if (location.Biome != null) { continue; } if (location.MapPosition.X < zoneX) { location.Biome = allowedBiomes[rand.Next() % allowedBiomes.Count]; @@ -812,6 +850,9 @@ namespace Barotrauma System.Diagnostics.Debug.Assert(Connections.All(c => c.Biome != null)); } + /// + /// Returns the location prior to the final location. The type of this location is hard-coded just as that of the final location. + /// private Location GetPreviousToEndLocation() { Location previousToEndLocation = null; @@ -970,9 +1011,8 @@ namespace Barotrauma } } - #endregion Generation - + public void MoveToNextLocation() { if (SelectedLocation == null && Level.Loaded?.EndLocation != null) @@ -1167,7 +1207,6 @@ namespace Barotrauma { List nextLocations = CurrentLocation.Connections.Where(c => !c.Locked).Select(c => c.OtherLocation(CurrentLocation)).ToList(); List undiscoveredLocations = nextLocations.FindAll(l => !l.Discovered); - if (undiscoveredLocations.Count > 0 && preferUndiscovered) { SelectLocation(undiscoveredLocations[Rand.Int(undiscoveredLocations.Count, Rand.RandSync.Unsynced)]); @@ -1285,8 +1324,8 @@ namespace Barotrauma { location.PendingLocationTypeChange = (location.PendingLocationTypeChange.Value.typeChange, - location.PendingLocationTypeChange.Value.delay - 1, - location.PendingLocationTypeChange.Value.parentMission); + location.PendingLocationTypeChange.Value.delay - 1, + location.PendingLocationTypeChange.Value.parentMission); if (location.PendingLocationTypeChange.Value.delay <= 0) { return ChangeLocationType(campaign, location, location.PendingLocationTypeChange.Value.typeChange); @@ -1317,8 +1356,8 @@ namespace Barotrauma { location.PendingLocationTypeChange = (selectedTypeChange, - Rand.Range(selectedTypeChange.RequiredDurationRange.X, selectedTypeChange.RequiredDurationRange.Y), - null); + Rand.Range(selectedTypeChange.RequiredDurationRange.X, selectedTypeChange.RequiredDurationRange.Y), + parentMission: null); } else { @@ -1554,7 +1593,7 @@ namespace Barotrauma Identifier locationType = subElement.GetAttributeIdentifier("type", Identifier.Empty); LocalizedString prevLocationName = location.DisplayName; LocationType prevLocationType = location.Type; - LocationType newLocationType = LocationType.Prefabs.Find(lt => lt.Identifier == locationType) ?? LocationType.Prefabs.First(); + LocationType newLocationType = LocationType.Prefabs.Find(lt => lt.Identifier == locationType) ?? LocationType.Prefabs.GetOrdered().First(); location.ChangeType(campaign, newLocationType); if (showNotifications && prevLocationType != location.Type) @@ -1636,7 +1675,7 @@ namespace Barotrauma if (index < 0) { return null; } return Locations[index]; } - + } void Discover(Location location) @@ -1774,4 +1813,4 @@ namespace Barotrauma partial void RemoveProjSpecific(); } -} +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Map/MapLocationTypeGenerator.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Map/MapLocationTypeGenerator.cs new file mode 100644 index 000000000..7003b9848 --- /dev/null +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Map/MapLocationTypeGenerator.cs @@ -0,0 +1,397 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Barotrauma.Extensions; +using Microsoft.Xna.Framework; + +namespace Barotrauma +{ + internal class MapLocationTypeGenerator + { + internal class LocationTypeCount + { + public int AmountToAssign; + public int? DifficultyZone; + public Identifier? BiomeId; + + public LocationTypeCount(int amountToAssign, int difficultyZone) + { + AmountToAssign = amountToAssign; + DifficultyZone = difficultyZone; + } + + public LocationTypeCount(int amountToAssign, Identifier biomeId) + { + AmountToAssign = amountToAssign; + BiomeId = biomeId; + } + + public string ToDebugString() + { + if (DifficultyZone.HasValue) + { + return $"x{AmountToAssign} in (zone {DifficultyZone.Value})"; + } + else if (BiomeId.HasValue) + { + return $"x{AmountToAssign} in (biome {BiomeId.Value})"; + } + return $"x{AmountToAssign}"; + } + } + + /// + /// Actual amounts of location types that need to be assigned to locations, after resolving random variation from min/max counts. + /// + private Dictionary> locationTypeAmountsToAssign; + private readonly Map map; + + private readonly CampaignMode campaign; + /// + /// List of locations that have been filled from specific requirements and should not be overwritten by some subsequent generation pass (e.g. the start outpost). + /// + private readonly List filledLocations; + private readonly Dictionary> locationsPerZone = new Dictionary>(); + + private readonly IOrderedEnumerable orderedLocationTypes = LocationType.Prefabs.GetOrdered(); + + private bool IsEveryLocationTypeAssigned + { + get + { + return locationTypeAmountsToAssign.SelectMany(kvp => kvp.Value) + .None(locationTypeCount => locationTypeCount.AmountToAssign > 0); + } + } + + public MapLocationTypeGenerator(CampaignMode campaign, Map map) + { + filledLocations = new List(); + this.map = map; + this.campaign = campaign; + locationTypeAmountsToAssign = new Dictionary>(); + GenerateTotalAmountsToAssign(); + } + + private void GenerateTotalAmountsToAssign() + { + foreach (var locationTypePrefab in orderedLocationTypes) + { + foreach (var areaSetting in locationTypePrefab.AreaSettings) + { + if (!areaSetting.HasCounts) { continue; } + + if (!areaSetting.HasValidData) + { + // the only case for invalid data right now is the biome id + DebugConsole.AddWarning($"Biome ID is invalid for AreaSetting in locationType '{locationTypePrefab.Identifier}'. Skipping invalid setting.", locationTypePrefab.ContentPackage); + continue; + } + + int amountToAdd = Rand.GetRNG(Rand.RandSync.ServerAndClient).Next(areaSetting.MinCount ?? 0, areaSetting.MaxCount ?? 0 + 1); + if (amountToAdd <= 0) { continue; } + + // data is either for a biome or a zone, but not both + var existingCount = GetExistingCount(locationTypePrefab, areaSetting); + + if (existingCount != null) + { + existingCount.AmountToAssign += amountToAdd; + } + else + { + if (!locationTypeAmountsToAssign.ContainsKey(locationTypePrefab)) + { + locationTypeAmountsToAssign[locationTypePrefab] = new List(); + } + locationTypeAmountsToAssign[locationTypePrefab].Add(CreateNewCount(areaSetting, amountToAdd)); + } + } + } + + LocationTypeCount CreateNewCount(LocationType.AreaSettingData areaSettingData, int amountToAdd) + { + if (areaSettingData is LocationType.BiomeSettingData biomeSettingData) + { + return new LocationTypeCount(amountToAdd, biomeSettingData.BiomeIdentifier); + } + else if (areaSettingData is LocationType.DifficultyZoneSettingData difficultyZoneSettingData) + { + return new LocationTypeCount(amountToAdd, difficultyZoneSettingData.DifficultyZone); + } + else + { + throw new ArgumentException("Unrecognized areaSettingData"); + } + } + + LocationTypeCount? GetExistingCount(LocationType locationTypePrefab, LocationType.AreaSettingData areaSettingData) + { + if (!locationTypeAmountsToAssign.TryGetValue(locationTypePrefab, out List? value)) { return null; } + return value.FirstOrDefault(areaSettingData.MatchesRemainingCount); + } + } + + public void AddToLocationsPerZone(int zone, Location location) + { + if (!locationsPerZone.ContainsKey(zone)) + { + locationsPerZone[zone] = new List(); + } + locationsPerZone[zone].Add(location); + } + + public void AddToFilled(Location location) + { + if (filledLocations.Contains(location)) { return; } + filledLocations.Add(location); + } + + public bool IsFilled(Location location) + { + return filledLocations.Contains(location); + } + + public static void ChangeLocationTypeAndName(CampaignMode campaign, Location location, LocationType suitableLocationType) + { + location.ChangeType(campaign, suitableLocationType, createStores: false, unlockInitialMissions: false); + if (!suitableLocationType.ForceLocationName.IsEmpty) + { + location.ForceName(suitableLocationType.ForceLocationName); + } + } + + public void AssignForcedBiomeGateTypes(IEnumerable gateLocations) + { + foreach (Location gateLocation in gateLocations) + { + foreach (LocationType locationType in orderedLocationTypes) + { + if (locationType.BiomeGate != LocationType.BiomeGateSetting.Force) { continue; } + + int zone = map.GetZoneIndex(gateLocation.MapPosition.X); + + // if there are no counts left for this location type, skip it + if (locationType.HasCounts() && !TypeHasRemainingCountForLocation(locationType, gateLocation)) { continue; } + + // wrong faction, can't place here + if (!locationType.Faction.IsEmpty && locationType.Faction != gateLocation.Faction?.Prefab.Identifier) + { + continue; + } + + // if the location already happens to be of the type we want to assign, skip and remove from totals + if (gateLocation.Type == locationType) + { + AddToFilled(gateLocation); + RemoveOneFromTotals(locationType, gateLocation); + break; + } + + if (!IsFilled(gateLocation) && + locationType.IsValidForZoneOrBiome(zone, gateLocation.Biome.Identifier)) + { + AddToFilled(gateLocation); + ChangeLocationTypeAndName(campaign, gateLocation, locationType); + RemoveOneFromTotals(locationType, gateLocation); + break; + } + } + } + } + + private bool TypeHasRemainingCountForLocation(LocationType countLocationType, Location location) + { + if (!locationTypeAmountsToAssign.TryGetValue(countLocationType, out List? locationTypeCounts)) + { + return false; + } + + bool hasZoneCount = locationTypeCounts.Any(ltc => ltc.DifficultyZone == map.GetZoneIndex(location.MapPosition.X) && ltc.AmountToAssign > 0); + bool hasBiomeCount = locationTypeCounts.Any(ltc => ltc.BiomeId == location.Biome.Identifier && ltc.AmountToAssign > 0); + + return hasZoneCount || hasBiomeCount; + } + + private int GetRemainingCount(LocationType locationType, LocationType.AreaSettingData areaSetting) + { + locationTypeAmountsToAssign.TryGetValue(locationType, out List? locationTypeCounts); + if (locationTypeCounts == null || locationTypeCounts.None()) { return 0; } + + var match = locationTypeCounts.FirstOrDefault(ltc => areaSetting.MatchesRemainingCount(ltc)); + return match?.AmountToAssign ?? 0; + } + + public void RemoveOneFromTotals(LocationType locationType, Location location) + { + if (!locationTypeAmountsToAssign.TryGetValue(locationType, out List? locationTypeCounts)) + { + return; + } + + var zoneMatch = locationTypeCounts.FirstOrDefault(ltc => ltc.AmountToAssign > 0 && ltc.DifficultyZone == map.GetZoneIndex(location.MapPosition.X)); + if (zoneMatch != null) + { + zoneMatch.AmountToAssign--; + } + var biomeMatch = locationTypeCounts.FirstOrDefault(ltc => ltc.AmountToAssign > 0 && ltc.BiomeId == location.Biome.Identifier); + if (biomeMatch != null) + { + biomeMatch.AmountToAssign--; + } + } + + /// + /// Assign the location types that should be placed in some specific part of a biome/zone . + /// + public void AssignLocationTypesBasedOnDesiredPosition(IEnumerable gateLocations) + { + foreach (LocationType locationType in LocationType.Prefabs) + { + foreach (var areaSetting in locationType.AreaSettings) + { + if (!areaSetting.DesiredPosition.HasValue) { continue; } + + int remainingCount = GetRemainingCount(locationType, areaSetting); + if (remainingCount == 0) { continue; } + + var locations = map.Locations.Where(location => areaSetting.MatchesLocation(map, location)).Where(location => !gateLocations.Contains(location)); + if (locations.None()) { continue; } + + FillLocations(locations, areaSetting.DesiredPosition.Value, remainingCount, locationType); + } + } + + void FillLocations(IEnumerable locations, float desiredPosition, int locationCount, LocationType locationType) + { + float areaStart = locations.Min(l => l.MapPosition.X); + float areaEnd = locations.Max(l => l.MapPosition.X); + + float desiredMapPosition = MathHelper.Lerp(areaStart, areaEnd, desiredPosition); + + List sortedLocations = locations.Where(location => !IsFilled(location)).ToList(); + sortedLocations.Sort((firstLocation, secondLocation) => Math.Abs(firstLocation.MapPosition.X - desiredMapPosition).CompareTo(secondLocation.MapPosition.X - desiredMapPosition)); + + for (int i = 0; i < locationCount; i++) + { + if (sortedLocations.None()) { break; } + var closestLocation = sortedLocations.First(); + ChangeLocationTypeAndName(campaign, closestLocation, locationType); + AddToFilled(closestLocation); + RemoveOneFromTotals(closestLocation.Type, closestLocation); + sortedLocations.Remove(closestLocation); + } + } + } + + public void AssignLocationTypesBasedOnCount(IEnumerable gateLocations, IEnumerable locations) + { + // generate lists of all the instances of location types that we are supposed to try and fit into the available locations + List shuffledLocations = locations.ToList(); + shuffledLocations.Shuffle(Rand.GetRNG(Rand.RandSync.ServerAndClient)); + + foreach (Location location in shuffledLocations) + { + if (IsFilled(location)) { continue; } + + bool isBiomeGate = gateLocations.Contains(location); + if (isBiomeGate && location.Type.BiomeGate == LocationType.BiomeGateSetting.Force) + { + //forced as a biome gate, let's not touch this location + continue; + } + if (IsEveryLocationTypeAssigned) { break; } + + var suitableLocationType = TryPickSuitableLocationTypeFromTotals(location, isBiomeGate); + + // if we found something suitable, change the location type and name, and add to filled locations + // (otherwise we will honor the initial random location type) + if (suitableLocationType != null) + { + ChangeLocationTypeAndName(campaign, location, suitableLocationType); + AddToFilled(location); + } + } + + // warn if we couldn't fill in all the desired counts + if (!IsEveryLocationTypeAssigned) + { + ContentPackage? nonVanillaContentPackage = null; + StringBuilder sb = new StringBuilder("Following location types could not be assigned to locations:\n"); + foreach ((LocationType locationType, List locationTypeCounts) in locationTypeAmountsToAssign) + { + foreach (var locationTypeCount in locationTypeCounts) + { + if (locationTypeCount.AmountToAssign > 0) + { + if (locationType.ContentPackage != ContentPackageManager.VanillaCorePackage) + { + nonVanillaContentPackage = locationType.ContentPackage; + } + sb.AppendLine($"- {locationType.Identifier} - {locationType.Name} ({locationTypeCount.ToDebugString()})"); + } + } + } + DebugConsole.AddWarning(sb.ToString(), + //blame the mod where one of the problematic location types is defined in + contentPackage: nonVanillaContentPackage); + } + } + + private LocationType? TryPickSuitableLocationTypeFromTotals(Location location, bool isBiomeGate) + { + int locationZone = map.GetZoneIndex(location.MapPosition.X); + Identifier locationBiomeId = location.Biome.Identifier; + LocationType? suitableLocationType = null; + + //find location type counts that haven't been fully assigned yet + List<(LocationType LocationType, LocationTypeCount Count)> potentialLocationTypeCounts = []; + foreach ((LocationType locationType, List countList) in locationTypeAmountsToAssign) + { + //if we're picking a potential new type for a biome gate, it must be a location type that's allowed as a biome gate + if (isBiomeGate && locationType.BiomeGate == LocationType.BiomeGateSetting.Deny) { continue; } + foreach (var locationTypeCount in countList) + { + if (locationTypeCount.AmountToAssign > 0) + { + potentialLocationTypeCounts.Add((locationType, locationTypeCount)); + } + } + } + + var zoneMatches = potentialLocationTypeCounts.Where(locationTypeCount => locationTypeCount.Count.DifficultyZone == locationZone); + var biomeMatches = potentialLocationTypeCounts.Where(locationTypeCount => locationTypeCount.Count.BiomeId == locationBiomeId); + if (zoneMatches.None() && biomeMatches.None()) + { + return null; + } + + // if both lists have something, we will try to find a location type that is in both lists + if (zoneMatches.Any() && biomeMatches.Any()) + { + var dualMatch = zoneMatches.FirstOrDefault(zoneCount => biomeMatches.Any(biomeCount => biomeCount.LocationType == zoneCount.LocationType)); + if (dualMatch.LocationType != null) + { + suitableLocationType = dualMatch.LocationType; + } + } + + // no dual match, find individual match + if (suitableLocationType == null) + { + suitableLocationType = zoneMatches.Any() ? + zoneMatches.First().LocationType : biomeMatches.First().LocationType; + } + + if (suitableLocationType != null) + { + RemoveOneFromTotals(suitableLocationType, location); + } + + return suitableLocationType; + } + } +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs index aa5be0a83..f0d5d35d7 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs @@ -47,9 +47,8 @@ namespace Barotrauma public readonly List linkedTo = new List(); - protected bool flippedX, flippedY; - public bool FlippedX { get { return flippedX; } } - public bool FlippedY { get { return flippedY; } } + public bool FlippedX { get; protected set; } + public bool FlippedY { get; protected set; } public bool ShouldBeSaved = true; @@ -91,6 +90,16 @@ namespace Barotrauma } } + public virtual float RotationRad { get; protected set; } + + /// + /// Rotation taking into account flipping: if the entity is flipped on either axis, the rotation is negated + /// (but not if it's flipped on both axes, two flips is essentially double negation). + /// + public float RotationRadWithFlipping => FlippedX ^ FlippedY ? -RotationRad : RotationRad; + + public float RotationWithFlipping => MathHelper.ToDegrees(RotationRadWithFlipping); + public virtual Rectangle Rect { get { return rect; } @@ -697,9 +706,10 @@ namespace Barotrauma /// Flip the entity horizontally /// /// Should the entity be flipped across the y-axis of the sub it's inside - public virtual void FlipX(bool relativeToSub) + /// Forces the item to be flipped even if it's configured not to be flippable. + public virtual void FlipX(bool relativeToSub, bool force = false) { - flippedX = !flippedX; + FlippedX = !FlippedX; if (!relativeToSub || Submarine == null) { return; } Vector2 relative = WorldPosition - Submarine.WorldPosition; @@ -711,9 +721,10 @@ namespace Barotrauma /// Flip the entity vertically /// /// Should the entity be flipped across the x-axis of the sub it's inside - public virtual void FlipY(bool relativeToSub) + /// Forces the item to be flipped even if it's configured not to be flippable. + public virtual void FlipY(bool relativeToSub, bool force = false) { - flippedY = !flippedY; + FlippedY = !FlippedY; if (!relativeToSub || Submarine == null) { return; } Vector2 relative = WorldPosition - Submarine.WorldPosition; diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostGenerationParams.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostGenerationParams.cs index bdbf0c3cb..0a932c4e4 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostGenerationParams.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostGenerationParams.cs @@ -23,6 +23,12 @@ namespace Barotrauma get { return allowedLocationTypes; } } + private readonly HashSet allowedGameModeIdentifiers = new HashSet(); + + public IEnumerable AllowedGameModeIdentifiers + { + get { return allowedGameModeIdentifiers; } + } [Serialize(-1, IsPropertySaveable.Yes, description: "Should this type of outpost be forced to the locations at the end of the campaign map? 0 = first end level, 1 = second end level, and so on."), Editable(MinValueInt = -1, MaxValueInt = 10)] public int ForceToEndLocationIndex @@ -279,6 +285,7 @@ namespace Barotrauma { Name = element.GetAttributeString("name", Identifier.Value); allowedLocationTypes = element.GetAttributeIdentifierArray("allowedlocationtypes", Array.Empty()).ToHashSet(); + allowedGameModeIdentifiers = element.GetAttributeIdentifierArray("allowedgamemodes", Array.Empty()).ToHashSet(); SerializableProperties = SerializableProperty.DeserializeProperties(this, element); if (element.GetAttribute("leveltype") != null) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostGenerator.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostGenerator.cs index 99c20a501..dcb60b4b1 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostGenerator.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostGenerator.cs @@ -1,5 +1,6 @@ using Barotrauma.Extensions; using Barotrauma.Items.Components; +using Barotrauma.RuinGeneration; using Microsoft.Xna.Framework; using System; using System.Collections.Generic; @@ -110,6 +111,17 @@ namespace Barotrauma } } + var prebuiltOutpostInfo = ChooseOutpost(generationParams); + prebuiltOutpostInfo.Type = SubmarineType.Outpost; + sub = new Submarine(prebuiltOutpostInfo); + sub.Info.OutpostGenerationParams = generationParams; + location?.RemoveTakenItems(); + EnableFactionSpecificEntities(sub, location); + return sub; + } + + private static SubmarineInfo ChooseOutpost(OutpostGenerationParams generationParams) + { var outpostFiles = ContentPackageManager.EnabledPackages.All .SelectMany(p => p.GetFiles()) .Where(f => !TutorialPrefab.Prefabs.Any(tp => tp.OutpostPath == f.Path)) @@ -120,6 +132,50 @@ namespace Barotrauma { outpostInfos.Add(new SubmarineInfo(outpostFile.Path.Value)); } + + + //if there's missions selected that allow outpost selection from some specific set of outposts, + //choose one of those outposts + List outpostInfosSuitableForMission = new List(); + if (GameMain.GameSession?.GameMode is { } gameMode) + { + foreach (var mission in gameMode.Missions) + { + if (!mission.Prefab.AllowOutpostSelectionFromTag.IsEmpty) + { + foreach (var outpostInfo in outpostInfos) + { + if (outpostInfo.OutpostTags.Contains(mission.Prefab.AllowOutpostSelectionFromTag) && + !outpostInfosSuitableForMission.Contains(outpostInfo)) + { + outpostInfosSuitableForMission.Add(outpostInfo); + } + } + } + } + } + + //if an outpost has been select in the server settings, choose that... + if (GameMain.NetworkMember?.ServerSettings is { } serverSettings && + serverSettings.SelectedOutpostName != "Random") + { + //...but only if the outpost is suitable for the mission (or if the mission has no specific requirements for the outpost) + if (outpostInfosSuitableForMission.None() || + outpostInfosSuitableForMission.Any(outpostInfo => outpostInfo.OutpostTags.Contains(serverSettings.SelectedOutpostName))) + { + var matchingOutpost = outpostInfos.FirstOrDefault(o => o.Name == serverSettings.SelectedOutpostName); + if (matchingOutpost != null) + { + return matchingOutpost; + } + } + } + + if (outpostInfosSuitableForMission.Any()) + { + return outpostInfosSuitableForMission.GetRandom(Rand.RandSync.ServerAndClient); + } + if (generationParams.OutpostTag.IsEmpty) { outpostInfos = outpostInfos.FindAll(o => o.OutpostTags.None()); @@ -139,24 +195,7 @@ namespace Barotrauma { throw new Exception("Failed to generate an outpost. Could not generate an outpost from the available outpost modules and there are no pre-built outposts available."); } - var prebuiltOutpostInfo = outpostInfos.GetRandom(Rand.RandSync.ServerAndClient); - - if (GameMain.NetworkMember?.ServerSettings is { } serverSettings && - serverSettings.SelectedOutpostName != "Random") - { - var matchingOutpost = outpostInfos.FirstOrDefault(o => o.Name == serverSettings.SelectedOutpostName); - if (matchingOutpost != null) - { - prebuiltOutpostInfo = matchingOutpost; - } - } - - prebuiltOutpostInfo.Type = SubmarineType.Outpost; - sub = new Submarine(prebuiltOutpostInfo); - sub.Info.OutpostGenerationParams = generationParams; - location?.RemoveTakenItems(); - EnableFactionSpecificEntities(sub, location); - return sub; + return outpostInfos.GetRandom(Rand.RandSync.ServerAndClient); } private static Submarine GenerateFromModules(OutpostGenerationParams generationParams, OutpostModuleFile[] outpostModuleFiles, Submarine sub, LocationType locationType, Location location, bool onlyEntrance = false, bool allowInvalidOutpost = false) @@ -260,13 +299,15 @@ namespace Barotrauma if (hasForceOutpostWithInitialFlag) { - DebugConsole.NewMessage($"Using Force outpost module as initial in Outpost generation: {GameMain.GameSession.ForceOutpostModule.OutpostModuleInfo.Name}", Color.Yellow); + DebugConsole.NewMessage($"Forcing module \"{GameMain.GameSession.ForceOutpostModule.OutpostModuleInfo.Name}\" as the initial module...", Color.Yellow); usedForceOutpostModule = GameMain.GameSession.ForceOutpostModule; - GameMain.GameSession.ForceOutpostModule = null; } if (initialModule == null) { + //reset the forced outpost module so that it won't be used + //if we attempt to generate a new outpost later after this failed attempt + GameMain.GameSession.ForceOutpostModule = null; throw new Exception("Failed to generate an outpost (no airlock modules found)."); } foreach (Identifier initialFlag in initialModule.OutpostModuleInfo.ModuleFlags) @@ -297,25 +338,34 @@ namespace Barotrauma remainingOutpostGenerationTries--; continue; } - DebugConsole.ThrowError($"Could not place force outpost module: {GameMain.GameSession.ForceOutpostModule.OutpostModuleInfo.Name}"); - GameMain.GameSession.ForceOutpostModule = null; + DebugConsole.ThrowError($"Could not force the outpost module \"{GameMain.GameSession.ForceOutpostModule.OutpostModuleInfo.Name}\" to the outpost. Loading the module as-is..."); return null; } + if (GameMain.GameSession != null) + { + GameMain.GameSession.ForceOutpostModule = null; + } + if (pendingModuleFlags.Any(flag => flag != "none")) { if (!allowInvalidOutpost) { remainingOutpostGenerationTries--; - if (remainingOutpostGenerationTries <= 0) + if (remainingOutpostGenerationTries > 0) { - DebugConsole.ThrowError("Could not generate an outpost with all of the required modules. Some modules may not have enough connections at the edges to generate a valid layout. Pending modules: " + string.Join(", ", pendingModuleFlags)); + //tries left -> don't finish generating the outpost, try generating another layout + continue; + } + else + { + //out of tries, log an error, but let the method continue into loading the outpost (even if it doesn't have all the required modules) + DebugConsole.AddSafeError("Could not generate an outpost with all of the required modules. Some modules may not have enough connections at the edges to generate a valid layout. Pending modules: " + string.Join(", ", pendingModuleFlags)); } - continue; } else { - DebugConsole.ThrowError("Could not generate an outpost with all of the required modules. Some modules may not have enough connections at the edges to generate a valid layout. Pending modules: " + string.Join(", ", pendingModuleFlags) + ". Won't retry because invalid outposts are allowed."); + DebugConsole.AddSafeError("Could not generate an outpost with all of the required modules. Some modules may not have enough connections at the edges to generate a valid layout. Pending modules: " + string.Join(", ", pendingModuleFlags) + ". Won't retry because invalid outposts are allowed."); } } @@ -354,7 +404,7 @@ namespace Barotrauma remainingOutpostGenerationTries--; } - DebugConsole.AddSafeError("Failed to generate an outpost without overlapping modules. Trying to use a pre-built outpost instead..."); + DebugConsole.AddSafeError("Failed to generate an outpost with a valid layout and all the required modules. Trying to use a pre-built outpost instead..."); return null; List loadEntities(Submarine sub) @@ -463,10 +513,13 @@ namespace Barotrauma int maxMoveAmount = Math.Max(2000, selectedModules.Max(m => Math.Max(m.Bounds.Width, m.Bounds.Height))); bool overlapsFound = true; + PlacedModule overlappingModule1, overlappingModule2, moduleBelowAirlock; int iteration = 0; + const int MaxIterations = 20; while (overlapsFound) { overlapsFound = false; + overlappingModule1 = overlappingModule2 = moduleBelowAirlock = null; foreach (PlacedModule placedModule in selectedModules) { if (placedModule.PreviousModule == null) { continue; } @@ -478,6 +531,8 @@ namespace Barotrauma int remainingOverlapPreventionTries = 10; while (FindOverlap(subsequentModules, otherModules, out var module1, out var module2) && remainingOverlapPreventionTries > 0) { + overlappingModule1 = module1; + overlappingModule2 = module2; overlapsFound = true; if (FindOverlapSolution(subsequentModules, module1, module2, selectedModules, generationParams.MinHallwayLength, maxMoveAmount, out Dictionary solution)) { @@ -492,16 +547,40 @@ namespace Barotrauma } remainingOverlapPreventionTries--; } - if (remainingOutpostGenerationTries > MaxOutpostGenerationRetries / 2 && + + //check that the module doesn't extend below the airlock and potentially overlap with the sub + if (generationParams is not RuinGenerationParams && + //if we've already exhausted half of the retries, accept potential overlaps + remainingOutpostGenerationTries > MaxOutpostGenerationRetries / 2 && + //if the module is horizontally very far, it's ok to expand below the airlock + (placedModule.Bounds.X + placedModule.Offset.X < 5000 && placedModule.Bounds.Right + placedModule.Offset.X > -5000) && ModuleBelowInitialModule(placedModule, selectedModules.First())) { + moduleBelowAirlock = placedModule; overlapsFound = true; } } iteration++; - if (iteration > 10) + if (iteration > MaxIterations) { +#if DEBUG + string warningMsg = "Failed to create an outpost layout with no overlaps."; + if (overlappingModule1 != null && overlappingModule2 != null) + { + warningMsg += $" Overlapping modules: {overlappingModule1.Info.Name}, {overlappingModule2.Info.Name}."; + } + if (moduleBelowAirlock != null) + { + warningMsg += $" Module below airlock: {moduleBelowAirlock.Info.Name}."; + } + if (remainingOutpostGenerationTries > 0) + { + warningMsg += " Retrying..."; + } + + DebugConsole.AddWarning(warningMsg); +#endif generationFailed = true; break; } @@ -931,7 +1010,7 @@ namespace Barotrauma Rectangle initialModuleBounds = initialModule.Bounds; initialModuleBounds.Location += (initialModule.Offset + initialModule.MoveOffset).ToPoint(); - return bounds.Bottom < initialModuleBounds.Bottom; + return bounds.Y < initialModuleBounds.Y; } /// @@ -1053,8 +1132,8 @@ namespace Barotrauma } modulesWithCorrectFlags = modulesWithCorrectFlags.Where(m => m.OutpostModuleInfo.GapPositions.HasFlag(gapPosition) && m.OutpostModuleInfo.CanAttachToPrevious.HasFlag(gapPosition)); - var suitableModules = GetSuitableModules(modulesWithCorrectFlags, requireAllowAttachToPrevious: true, requireCorrectLocationType: true, disallowNonLocationTypeSpecific: true); - var suitableModulesForAnyOutpost = GetSuitableModules(modulesWithCorrectFlags, requireAllowAttachToPrevious: true, requireCorrectLocationType: true, disallowNonLocationTypeSpecific: false); + var suitableModules = GetSuitableModules(modulesWithCorrectFlags, requireAllowAttachToPrevious: true, requireCorrectLocationType: true, requireLocationTypeSpecific: true); + var suitableModulesForAnyOutpost = GetSuitableModules(modulesWithCorrectFlags, requireAllowAttachToPrevious: true, requireCorrectLocationType: true, requireLocationTypeSpecific: false); if (!suitableModules.Any()) { //no suitable module found, see if we can find a "generic" module that's not meant for any specific type of outpost @@ -1062,12 +1141,12 @@ namespace Barotrauma //still not found, see if we can find something that's otherwise suitable but not meant to attach to the previous module if (!suitableModules.Any()) { - suitableModules = GetSuitableModules(modulesWithCorrectFlags, requireAllowAttachToPrevious: false, requireCorrectLocationType: true, disallowNonLocationTypeSpecific: true); + suitableModules = GetSuitableModules(modulesWithCorrectFlags, requireAllowAttachToPrevious: false, requireCorrectLocationType: true, requireLocationTypeSpecific: true); } //still not found! Try if we can find a generic module that's not meant to attach to the previous module if (!suitableModules.Any()) { - suitableModules = GetSuitableModules(modulesWithCorrectFlags, requireAllowAttachToPrevious: false, requireCorrectLocationType: true, disallowNonLocationTypeSpecific: false); + suitableModules = GetSuitableModules(modulesWithCorrectFlags, requireAllowAttachToPrevious: false, requireCorrectLocationType: true, requireLocationTypeSpecific: false); } } @@ -1109,20 +1188,12 @@ namespace Barotrauma return suitableModule; } - IEnumerable GetSuitableModules(IEnumerable modules, bool requireAllowAttachToPrevious, bool requireCorrectLocationType, bool disallowNonLocationTypeSpecific) + IEnumerable GetSuitableModules(IEnumerable modules, bool requireAllowAttachToPrevious, bool requireCorrectLocationType, bool requireLocationTypeSpecific) { IEnumerable suitable = modules; if (requireCorrectLocationType) { - if (disallowNonLocationTypeSpecific) - { - //don't use OutpostModuleInfo.IsLocationTypeAllowed here - we're trying to choose a module specifically for this location type, not modules suitable for any location type - suitable = modules.Where(m => m.OutpostModuleInfo.AllowedLocationTypes.Contains(locationType.Identifier)); - } - else - { - suitable = modules.Where(m => m.OutpostModuleInfo.IsAllowedInLocationType(locationType)); - } + suitable = modules.Where(m => m.OutpostModuleInfo.IsAllowedInLocationType(locationType, requireLocationTypeSpecific: requireLocationTypeSpecific)); } if (requireAllowAttachToPrevious && prevModule != null) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostModuleInfo.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostModuleInfo.cs index 46330d892..8c0c97477 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostModuleInfo.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Outposts/OutpostModuleInfo.cs @@ -138,10 +138,15 @@ namespace Barotrauma return allowedLocationTypes.None() || allowedLocationTypes.Contains("Any".ToIdentifier()); } - public bool IsAllowedInLocationType(LocationType locationType) + + /// Does the module need to be explicitly configured as suitable for the location type, or is it ok if it's allowed for any location type? + public bool IsAllowedInLocationType(LocationType locationType, bool requireLocationTypeSpecific = false) { - if (locationType == null || IsAllowedInAnyLocationType()) { return true; } - return allowedLocationTypes.Contains(locationType.Identifier); + if (locationType == null) { return true; } + if (!requireLocationTypeSpecific && IsAllowedInAnyLocationType()) { return true; } + return + allowedLocationTypes.Contains(locationType.Identifier) || + (!locationType.UseOutpostModulesOfLocationType.IsEmpty && allowedLocationTypes.Contains(locationType.UseOutpostModulesOfLocationType)); } public void DetermineGapPositions(Submarine sub) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Structure.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Structure.cs index 0fbaa6e0b..3d1a11195 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Structure.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Structure.cs @@ -251,14 +251,13 @@ namespace Barotrauma } } - protected float rotationRad = 0f; [ConditionallyEditable(ConditionallyEditable.ConditionType.AllowRotating, DecimalCount = 3, ForceShowPlusMinusButtons = true, ValueStep = 0.1f), Serialize(0.0f, IsPropertySaveable.Yes)] public float Rotation { - get => MathHelper.ToDegrees(rotationRad); + get => MathHelper.ToDegrees(RotationRad); set { - rotationRad = MathHelper.WrapAngle(MathHelper.ToRadians(value)); + RotationRad = MathHelper.WrapAngle(MathHelper.ToRadians(value)); if (StairDirection != Direction.None) { CreateStairBodies(); @@ -373,7 +372,7 @@ namespace Barotrauma { get { - float rotation = MathHelper.ToRadians(Prefab.BodyRotation) + this.rotationRad; + float rotation = MathHelper.ToRadians(Prefab.BodyRotation) + this.RotationRad; if (IsHorizontal) { if (FlippedX) { rotation = -MathHelper.Pi - rotation; } @@ -396,9 +395,9 @@ namespace Barotrauma get { Vector2 bodyOffset = Prefab.BodyOffset; - if (rotationRad != 0f) + if (RotationRad != 0f) { - bodyOffset = MathUtils.RotatePoint(bodyOffset, -rotationRad); + bodyOffset = MathUtils.RotatePoint(bodyOffset, -RotationRad); } if (FlippedX) { bodyOffset.X = -bodyOffset.X; } if (FlippedY) { bodyOffset.Y = -bodyOffset.Y; } @@ -627,7 +626,7 @@ namespace Barotrauma Body newBody = GameMain.World.CreateRectangle(bodyWidth, bodyHeight, 1.5f); - var rotationWithFlip = FlippedX ^ FlippedY ? -rotationRad : rotationRad; + float rotationWithFlip = RotationRadWithFlipping; newBody.BodyType = BodyType.Static; Vector2 stairRectHeightDiff = new Vector2(0f, stairHeight / 2.0f - rect.Height / 2.0f); @@ -764,8 +763,8 @@ namespace Barotrauma public override Quad2D GetTransformedQuad() => Quad2D.FromSubmarineRectangle(rect).Rotated( FlippedX != FlippedY - ? rotationRad - : -rotationRad); + ? RotationRad + : -RotationRad); /// /// Checks if there's a structure items can be attached to at the given position and returns it. @@ -1280,7 +1279,7 @@ namespace Barotrauma gapRect.Width += 20; gapRect.Height += 20; - bool rotatedEnoughToChangeOrientation = (MathUtils.WrapAngleTwoPi(rotationRad - MathHelper.PiOver4) % MathHelper.Pi < MathHelper.PiOver2); + bool rotatedEnoughToChangeOrientation = (MathUtils.WrapAngleTwoPi(RotationRad - MathHelper.PiOver4) % MathHelper.Pi < MathHelper.PiOver2); if (rotatedEnoughToChangeOrientation) { var center = gapRect.Location + gapRect.Size.FlipY() / new Point(2); @@ -1345,6 +1344,9 @@ namespace Barotrauma if (gapOpen - prevGapOpenState > 0.25f && createExplosionEffect && !gap.IsRoomToRoom) { CreateWallDamageExplosion(gap, attacker, createWallDamageProjectiles); +#if CLIENT + SteamTimelineManager.OnHullBreached(this); +#endif } } @@ -1378,7 +1380,7 @@ namespace Barotrauma { const float explosionRange = 500.0f; float explosionStrength = gap.Open; - + var linkedHull = gap.linkedTo.FirstOrDefault() as Hull; if (linkedHull != null) { @@ -1595,7 +1597,7 @@ namespace Barotrauma partial void CreateConvexHull(Vector2 position, Vector2 size, float rotation); - public override void FlipX(bool relativeToSub) + public override void FlipX(bool relativeToSub, bool force = false) { base.FlipX(relativeToSub); @@ -1623,7 +1625,7 @@ namespace Barotrauma } } - public override void FlipY(bool relativeToSub) + public override void FlipY(bool relativeToSub, bool force = false) { base.FlipY(relativeToSub); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Submarine.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Submarine.cs index 1d262b380..e3816f58c 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Submarine.cs @@ -1141,6 +1141,17 @@ namespace Barotrauma } } + foreach (var dockingPort in DockingPort.List) + { + //a little hacky: undock and redock to ensure the hulls and gaps between docking ports are correct + //after all the parts of the submarine have been flipped and moved to correct places. + if (dockingPort.DockingTarget is { } dockingTarget) + { + dockingPort.Undock(); + dockingPort.Dock(dockingTarget); + } + } + Item.UpdateHulls(); Gap.UpdateHulls(); #if CLIENT @@ -2090,6 +2101,10 @@ namespace Barotrauma foreach (Submarine sub in _loaded) { sub.Remove(); + if (sub.Info.LazyLoad) + { + sub.Info.UnloadSubmarineElement(); + } } loaded.Clear(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/SubmarineInfo.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/SubmarineInfo.cs index 2ae85e4eb..239b38056 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/SubmarineInfo.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/SubmarineInfo.cs @@ -1,4 +1,4 @@ -using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -194,10 +194,27 @@ namespace Barotrauma set; } + /// + /// When enabled, the XML element is not loaded until it is accessed. + /// + public readonly bool LazyLoad; + + private XElement submarineElement; + public XElement SubmarineElement { - get; - private set; + get + { + if (LazyLoad && submarineElement == null) + { + Reload(); + } + return submarineElement; + } + private set + { + submarineElement = value; + } } public override string ToString() @@ -263,7 +280,11 @@ namespace Barotrauma RequiredContentPackages = new HashSet(); } - public SubmarineInfo(string filePath, string hash = "", XElement element = null, bool tryLoad = true) + /// + /// Creates a new SubmarineInfo from a file. + /// + /// When enabled, the XML element is not loaded until it is accessed. + public SubmarineInfo(string filePath, string hash = "", XElement element = null, bool tryLoad = true, bool lazyLoad = false) { FilePath = filePath; if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath)) @@ -296,11 +317,17 @@ namespace Barotrauma else { SubmarineElement = element; - } + } Name = SubmarineElement.GetAttributeString("name", null) ?? Name; Init(); + + if (lazyLoad) + { + LazyLoad = true; + SubmarineElement = null; + } } public SubmarineInfo(Submarine sub) : this(sub.Info) @@ -512,6 +539,11 @@ namespace Barotrauma if (savedSubmarines.Contains(this)) { savedSubmarines.Remove(this); } } + public void UnloadSubmarineElement() + { + SubmarineElement = null; + } + public bool IsVanillaSubmarine() { if (FilePath == null) { return false; } @@ -689,7 +721,7 @@ namespace Barotrauma RemoveSavedSub(filePath); if (File.Exists(filePath)) { - var subInfo = new SubmarineInfo(filePath); + var subInfo = new SubmarineInfo(filePath, lazyLoad: true); if (!subInfo.IsFileCorrupted) { savedSubmarines.Add(subInfo); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Networking/ChatMessage.cs b/Barotrauma/BarotraumaShared/SharedSource/Networking/ChatMessage.cs index 0068136e2..786347ad1 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Networking/ChatMessage.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Networking/ChatMessage.cs @@ -21,6 +21,7 @@ namespace Barotrauma.Networking ServerMessageBox = 10, ServerMessageBoxInGame = 11, Team = 12, + BlockedBySpamFilter = 13, } public enum PlayerConnectionChangeType { None = 0, Joined = 1, Kicked = 2, Disconnected = 3, Banned = 4 } @@ -39,24 +40,26 @@ namespace Barotrauma.Networking /// public const float SpeakRangeVOIP = 1000.0f; + public const float BlockedBySpamFilterTime = 10.0f; + private static readonly string dateTimeFormatLongTimePattern = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern; public static Color[] MessageColor = { new Color(190, 198, 205), //default new Color(204, 74, 78), //error - new Color(136, 177, 255), //dead + new Color(136, 177, 255), //dead new Color(157, 225, 160), //server new Color(238, 208, 0), //radio new Color(64, 240, 89), //private new Color(255, 255, 255), //console new Color(255, 255, 255), //messagebox - new Color(255, 128, 0), //order - new Color(), // ServerLog - new Color(), // ServerMessageBox - new Color(), // ServerMessageBoxInGame - //new Color(128, 0, 255), // team - new Color(86, 91, 205), // team + new Color(255, 128, 0), //order + new Color(), // ServerLog + new Color(), // ServerMessageBox + new Color(), // ServerMessageBoxInGame + new Color(86, 91, 205), // team + new Color(255, 0, 0), // blocked by spam filter }; public readonly string Text; diff --git a/Barotrauma/BarotraumaShared/SharedSource/Networking/Client.cs b/Barotrauma/BarotraumaShared/SharedSource/Networking/Client.cs index 85b8d2872..c59fd4ec9 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Networking/Client.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Networking/Client.cs @@ -92,13 +92,6 @@ namespace Barotrauma.Networking CharacterID = value.ID; } } - else - { - if (value != null) - { - DebugConsole.NewMessage(value.Name, Color.Yellow); - } - } character = value; if (character != null) { @@ -272,12 +265,15 @@ namespace Barotrauma.Networking SetPermissions(permissions, permittedCommands); } - public static string SanitizeName(string name) + /// + /// Strips out newlines and some common non-renderable symbols (ASCII codes below 32) out of the name, and optionally limits the maximum size. + /// + public static string SanitizeName(string name, int maxLength = MaxNameLength) { - name = name.Trim(); - if (name.Length > MaxNameLength) + name = name.Trim().Replace("\r\n", " ").Replace('\n', ' ').Replace('\r', ' '); + if (name.Length > maxLength) { - name = name.Substring(0, MaxNameLength); + name = name.Substring(0, maxLength); } string rName = ""; for (int i = 0; i < name.Length; i++) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Networking/EntitySpawner.cs b/Barotrauma/BarotraumaShared/SharedSource/Networking/EntitySpawner.cs index 0b85e7ac2..87c9cda4a 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Networking/EntitySpawner.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Networking/EntitySpawner.cs @@ -377,6 +377,7 @@ namespace Barotrauma if (IsInRemoveQueue(item) || item.Removed) { return; } spawnOrRemoveQueue.Enqueue(item); + item.IsInRemoveQueue = true; foreach (var containedItem in item.ContainedItems) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Networking/NetworkMember.cs b/Barotrauma/BarotraumaShared/SharedSource/Networking/NetworkMember.cs index d918da4f6..59fed5243 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Networking/NetworkMember.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Networking/NetworkMember.cs @@ -1,8 +1,6 @@ -using Barotrauma.Items.Components; -using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework; using System; using System.Collections.Generic; -using System.Linq; namespace Barotrauma.Networking { @@ -103,6 +101,7 @@ namespace Barotrauma.Networking CIRCUITBOX, MONEY, READY_CHECK, //start, end and update a ready check + UNLOCKRECIPE, //unlocking a fabrication recipe SEND_BACKUP_INDICES // the server sends a list of available backups for a save file } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Networking/Primitives/Auth/SteamAuthTicketForEosHostAuthenticator.cs b/Barotrauma/BarotraumaShared/SharedSource/Networking/Primitives/Auth/SteamAuthTicketForEosHostAuthenticator.cs index 1202e1052..ff2788158 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Networking/Primitives/Auth/SteamAuthTicketForEosHostAuthenticator.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Networking/Primitives/Auth/SteamAuthTicketForEosHostAuthenticator.cs @@ -1,25 +1,23 @@ -using System; -using System.Collections.Generic; +using RestSharp; +using System; using System.Text.Json; using System.Threading.Tasks; -using RestSharp; namespace Barotrauma.Networking; sealed class SteamAuthTicketForEosHostAuthenticator : Authenticator { - #warning FIXME change URL back to the non-experimental one once this passes QA - private const string consentServerUrl = "https://barotraumagame.com/baromaster/experimental/"; - private const string consentServerFile = "getOwnerSteamId.php"; + private const string ServerUrl = "https://barotraumagame.com/baromaster/"; + private const string ServerFile = "getOwnerSteamId.php"; private const int RemoteRequestVersion = 1; public override async Task VerifyTicket(AuthenticationTicket ticket) { string ticketData = ToolBoxCore.ByteArrayToHexString(ticket.Data); - var client = new RestClient(consentServerUrl); + var client = new RestClient(ServerUrl); - var request = new RestRequest(consentServerFile, Method.GET); + var request = new RestRequest(ServerFile, Method.GET); request.AddParameter("authticket", ticketData); request.AddParameter("request_version", RemoteRequestVersion); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Prefabs/IImplementsVariants.cs b/Barotrauma/BarotraumaShared/SharedSource/Prefabs/IImplementsVariants.cs index 568235ecd..1c70a649d 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Prefabs/IImplementsVariants.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Prefabs/IImplementsVariants.cs @@ -57,6 +57,18 @@ namespace Barotrauma { ReplaceAttribute(element, attribute); } + + //collect the names of the elements that we want to remove all instances of + //(e.g. if a variant wants to remove all fabrication recipes) + List elementNamesToRemove = new List(); + foreach (var subElement in replacement.Elements()) + { + if (subElement.Name.ToString().Equals("clearall", StringComparison.OrdinalIgnoreCase)) + { + elementNamesToRemove.AddRange(subElement.Elements().Select(e => e.Name.ToIdentifier())); + } + } + foreach (XElement replacementSubElement in replacement.Elements()) { int index = replacement.Elements().ToList().FindAll(e => e.Name.ToString().Equals(replacementSubElement.Name.ToString(), StringComparison.OrdinalIgnoreCase)).IndexOf(replacementSubElement); @@ -67,7 +79,17 @@ namespace Barotrauma bool cleared = false; foreach (var subElement in element.Elements()) { - if (replacementSubElement.Name.ToString().Equals("clear", StringComparison.OrdinalIgnoreCase)) + if (elementNamesToRemove.Contains(subElement.NameAsIdentifier())) + { + if (!elementsToRemove.Contains(subElement)) { elementsToRemove.Add(subElement); } + matchingElementFound = true; + continue; + } + if (replacementSubElement.Name.ToString().Equals("clearall", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + else if (replacementSubElement.Name.ToString().Equals("clear", StringComparison.OrdinalIgnoreCase)) { matchingElementFound = true; newElementsFromBase.Clear(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Prefabs/PrefabCollection.cs b/Barotrauma/BarotraumaShared/SharedSource/Prefabs/PrefabCollection.cs index cef4c5681..47b575be5 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Prefabs/PrefabCollection.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Prefabs/PrefabCollection.cs @@ -45,6 +45,20 @@ namespace Barotrauma { OnSort = onSort; } + + /// + /// For iterating through the Prefabs in a deterministic order (e.g. for map generation). Sorting is not cached, so use sparingly. + /// + public IOrderedEnumerable GetOrdered() + { + // UintIdentifier comparison is preferred to Identifier comparison that uses strings + if ((typeof(T).IsAssignableFrom(typeof(PrefabWithUintIdentifier)))) + { + return this.OrderBy(p => (p as PrefabWithUintIdentifier)!.UintIdentifier); + } + + return this.OrderBy(p => p.Identifier); + } /// /// Method to be called when calling Add(T prefab, bool override). diff --git a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs index cf926a1bb..60b864baf 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs @@ -141,7 +141,10 @@ namespace Barotrauma foreach (PhysicsBody body in PhysicsBody.List) { - if (body.Enabled && body.BodyType != FarseerPhysics.BodyType.Static) + //update character (colliders) regardless if they're enabled or not, so that the draw position is updated + //necessary to sync the character's position even if the character is ragdolled and the collider is disabled + if ((body.Enabled || body.UserData is Character) && + body.BodyType != BodyType.Static) { body.Update(); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Serialization/SerializableProperty/SerializableProperty.cs b/Barotrauma/BarotraumaShared/SharedSource/Serialization/SerializableProperty/SerializableProperty.cs index f3979fd50..ab31f4582 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Serialization/SerializableProperty/SerializableProperty.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Serialization/SerializableProperty/SerializableProperty.cs @@ -1,6 +1,7 @@ using Barotrauma.Extensions; using Barotrauma.Items.Components; using Microsoft.Xna.Framework; +using RestSharp.Extensions; using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -12,6 +13,10 @@ using System.Xml.Linq; namespace Barotrauma { + /// + /// Is the value of the property saved when saving (serializing) the entity? + /// Can be set to false if e.g. the value doesn't ever change from the prefab value, or if changes to it shouldn't persist between rounds. + /// public enum IsPropertySaveable { Yes, @@ -883,7 +888,16 @@ namespace Barotrauma public static Dictionary DeserializeProperties(object obj, XElement element = null) { Dictionary dictionary = GetProperties(obj); - +#if DEBUG + var nonPublicProperties = obj.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Instance); + foreach (var property in nonPublicProperties) + { + if (property.GetAttribute() != null) + { + DebugConsole.ThrowError($"The property {property.Name} in class {obj.GetType()} is set as serializable, but isn't public. Serializable properties must have at least a public getter."); + } + } +#endif foreach (var property in dictionary.Values) { //set the value of the property to the default value if there is one diff --git a/Barotrauma/BarotraumaShared/SharedSource/Serialization/XMLExtensions.cs b/Barotrauma/BarotraumaShared/SharedSource/Serialization/XMLExtensions.cs index 0d1fa0fcd..b04914057 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Serialization/XMLExtensions.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Serialization/XMLExtensions.cs @@ -239,6 +239,16 @@ namespace Barotrauma return element.GetAttributeIdentifierArray(key, null, trim)?.ToImmutableHashSet() ?? defaultValue; } + + public static float? GetAttributeNullableFloat(this XElement element, string attributeName) + { + if (element.GetAttribute(attributeName) is XAttribute attribute) + { + // if there is an error in parsing, we will return the default value, which may cause edge case errors down the line + return GetAttributeFloat(attribute, 0.0f); + } + return null; + } public static float GetAttributeFloat(this XElement element, float defaultValue, params string[] matchingAttributeName) { @@ -253,7 +263,7 @@ namespace Barotrauma return defaultValue; } - + public static float GetAttributeFloat(this XElement element, string name, float defaultValue) => GetAttributeFloat(element?.GetAttribute(name), defaultValue); public static float GetAttributeFloat(this XAttribute attribute, float defaultValue) @@ -352,6 +362,16 @@ namespace Barotrauma } return false; } + + public static int? GetAttributeNullableInt(this XElement element, string attributeName) + { + if (element.GetAttribute(attributeName) is XAttribute attribute) + { + // if there is an error in parsing, we will return the default value, which may cause edge case errors down the line + return GetAttributeInt(attribute, 0); + } + return null; + } public static int GetAttributeInt(this XElement element, string name, int defaultValue) => GetAttributeInt(element?.GetAttribute(name), defaultValue); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Settings/GameSettings.cs b/Barotrauma/BarotraumaShared/SharedSource/Settings/GameSettings.cs index 540696e3c..1f5e2d51b 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Settings/GameSettings.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Settings/GameSettings.cs @@ -632,7 +632,7 @@ namespace Barotrauma GameMain.SoundManager?.ApplySettings(); #endif - if (languageChanged) { TextManager.ClearCache(); } + if (languageChanged) { TextManager.LanguageChanged(); } } public static void SaveCurrentConfig() diff --git a/Barotrauma/BarotraumaShared/SharedSource/Sprite/SpriteSheet.cs b/Barotrauma/BarotraumaShared/SharedSource/Sprite/SpriteSheet.cs index b9164a09a..1383fe3bb 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Sprite/SpriteSheet.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Sprite/SpriteSheet.cs @@ -1,6 +1,5 @@ using Microsoft.Xna.Framework; using System; -using System.Xml.Linq; namespace Barotrauma { diff --git a/Barotrauma/BarotraumaShared/SharedSource/StatusEffects/DelayedEffect.cs b/Barotrauma/BarotraumaShared/SharedSource/StatusEffects/DelayedEffect.cs index 11c2e0ef2..5a72a36cb 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/StatusEffects/DelayedEffect.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/StatusEffects/DelayedEffect.cs @@ -1,10 +1,8 @@ -using System; +using Barotrauma.Items.Components; +using Microsoft.Xna.Framework; +using System; using System.Collections.Generic; using System.Linq; -using System.Xml.Linq; -using Barotrauma.Extensions; -using Barotrauma.Items.Components; -using Microsoft.Xna.Framework; namespace Barotrauma { @@ -12,7 +10,11 @@ namespace Barotrauma { public readonly DelayedEffect Parent; public readonly Entity Entity; - public readonly Vector2? WorldPosition; + public Vector2? WorldPosition; + /// + /// Should the delayed effect attempt to determine the position of the effect based on the targets, or just use the position that was passed to the constructor. + /// + public bool GetPositionBasedOnTargets; public readonly Vector2? StartPosition; public readonly List Targets; public float Delay; @@ -62,7 +64,10 @@ namespace Barotrauma { foreach (var existingEffect in DelayList) { - if (existingEffect.Parent == this && existingEffect.Targets.FirstOrDefault() == target) { return; } + if (existingEffect.Parent == this && existingEffect.Targets.FirstOrDefault() == target) + { + return; + } } } if (!IsValidTarget(target)) { return; } @@ -74,7 +79,11 @@ namespace Barotrauma switch (delayType) { case DelayTypes.Timer: - DelayList.Add(new DelayedListElement(this, entity, currentTargets, delay, worldPosition ?? GetPosition(entity, currentTargets, worldPosition), startPosition: null)); + var newDelayListElement = new DelayedListElement(this, entity, currentTargets, delay, worldPosition ?? GetPosition(entity, currentTargets, worldPosition), startPosition: null) + { + GetPositionBasedOnTargets = worldPosition == null + }; + DelayList.Add(newDelayListElement); break; case DelayTypes.ReachCursor: Projectile projectile = (entity as Item)?.GetComponent(); @@ -171,7 +180,16 @@ namespace Barotrauma { case DelayTypes.Timer: element.Delay -= deltaTime; - if (element.Delay > 0.0f) { continue; } + if (element.Delay > 0.0f) + { + //if the delayed effect is supposed to get the position from the targets, + //keep refreshing the position until the effect runs (so e.g. a delayed effect runs at the last known position of a monster before it despawned) + if (element.GetPositionBasedOnTargets && element.Entity is { Removed: false }) + { + element.WorldPosition = element.Parent.GetPosition(element.Entity, element.Parent.currentTargets); + } + continue; + } break; case DelayTypes.ReachCursor: if (Vector2.Distance(element.Entity.WorldPosition, element.StartPosition.Value) < element.Delay) { continue; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/StatusEffects/StatusEffect.cs b/Barotrauma/BarotraumaShared/SharedSource/StatusEffects/StatusEffect.cs index 6980ef045..c62d2fe39 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/StatusEffects/StatusEffect.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/StatusEffects/StatusEffect.cs @@ -5,6 +5,7 @@ using Barotrauma.Networking; using FarseerPhysics; using FarseerPhysics.Dynamics; using Microsoft.Xna.Framework; +using Steamworks; using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -639,6 +640,10 @@ namespace Barotrauma /// Should the sound(s) configured in the effect be played if the required items aren't found? /// private readonly bool playSoundOnRequiredItemFailure = false; + + public readonly record struct SteamTimeLineEvent(string title, string description, string icon); + private readonly SteamTimeLineEvent steamTimeLineEventToTrigger; + #endif private readonly int useItemCount; @@ -716,6 +721,11 @@ namespace Barotrauma /// private readonly List<(Identifier eventIdentifier, Identifier tag)> eventTargetTags; + /// + /// Can be used to make the effect unlock a fabrication recipe globally for the entire crew. + /// + public readonly Identifier UnlockRecipe; + private Character user; public readonly float FireSize; @@ -926,6 +936,8 @@ namespace Barotrauma playSoundOnRequiredItemFailure = element.GetAttributeBool("playsoundonrequireditemfailure", false); #endif + UnlockRecipe = element.GetAttributeIdentifier(nameof(UnlockRecipe), Identifier.Empty); + List propertyAttributes = new List(); propertyConditionals = new List(); foreach (XAttribute attribute in element.Attributes()) @@ -1238,6 +1250,26 @@ namespace Barotrauma forceSayIdentifier = subElement.GetAttributeIdentifier("message", Identifier.Empty); forceSayInRadio = subElement.GetAttributeBool("sayinradio", false); break; +#if CLIENT + case "steamtimelineevent": + steamTimeLineEventToTrigger = new SteamTimeLineEvent( + subElement.GetAttributeString("title", string.Empty), + subElement.GetAttributeString("description", string.Empty), + subElement.GetAttributeString("icon", string.Empty)); + if (steamTimeLineEventToTrigger.title.IsNullOrWhiteSpace()) + { + DebugConsole.ThrowError("Error in StatusEffect (" + parentDebugName + ") - steam timeline event has no title.", contentPackage: element.ContentPackage); + } + if (steamTimeLineEventToTrigger.description.IsNullOrWhiteSpace()) + { + DebugConsole.ThrowError("Error in StatusEffect (" + parentDebugName + ") - steam timeline event has no description.", contentPackage: element.ContentPackage); + } + if (steamTimeLineEventToTrigger.icon.IsNullOrWhiteSpace()) + { + DebugConsole.ThrowError("Error in StatusEffect (" + parentDebugName + ") - steam timeline event has no icon.", contentPackage: element.ContentPackage); + } + break; +#endif } } InitProjSpecific(element, parentDebugName); @@ -2122,6 +2154,11 @@ namespace Barotrauma fire.Size = new Vector2(FireSize, fire.Size.Y); } + if (isNotClient && !UnlockRecipe.IsEmpty && GameMain.GameSession is { } gameSession) + { + gameSession.UnlockRecipe(UnlockRecipe, showNotifications: true); + } + if (isNotClient && triggeredEvents != null && GameMain.GameSession?.EventManager is { } eventManager) { foreach (EventPrefab eventPrefab in triggeredEvents) @@ -2489,6 +2526,12 @@ namespace Barotrauma { rotation = parentItemBody.TransformRotation(chosenItemSpawnInfo.RotationRad); } + else if (parentItem != null) + { + rotation = PhysicsBody.TransformRotation( + -parentItem.RotationRad + chosenItemSpawnInfo.RotationRad, + dir: parentItem.FlippedX ? -1.0f : 1.0f); + } break; case ItemSpawnInfo.SpawnRotationType.Target: if (!entity.Removed) @@ -2556,11 +2599,17 @@ namespace Barotrauma projectile.Shoot(user, spawnPos, spawnPos, rotation, ignoredBodies: ignoredBodies, createNetworkEvent: true, damageMultiplier: damageMultiplier); projectile.Item.Submarine = projectile.LaunchSub = sourceEntity?.Submarine; } - else if (newItem.body != null) + else { - newItem.body.SetTransform(newItem.SimPosition, rotation); - Vector2 impulseDir = new Vector2(MathF.Cos(rotation), MathF.Sin(rotation)); - newItem.body.ApplyLinearImpulse(impulseDir * chosenItemSpawnInfo.Impulse); + if (newItem.body != null) + { + //flipped on one axis = need to flip the rotation of the item (not if flipped on both, that's essentially double negation) + bool flip = parentItem is { FlippedX: true } != parentItem is { FlippedY: true }; + newItem.body.Dir = flip ? -1 : 1; + newItem.body.SetTransform(newItem.SimPosition, flip ? rotation - MathHelper.Pi : rotation); + Vector2 impulseDir = new Vector2(MathF.Cos(rotation), MathF.Sin(rotation)); + newItem.body.ApplyLinearImpulse(impulseDir * chosenItemSpawnInfo.Impulse); + } } } OnItemSpawned(newItem, chosenItemSpawnInfo); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Steam/AuthTicket.cs b/Barotrauma/BarotraumaShared/SharedSource/Steam/AuthTicket.cs index a41889ad4..bd5b5811e 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Steam/AuthTicket.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Steam/AuthTicket.cs @@ -44,8 +44,8 @@ namespace Barotrauma.Steam #region Auth ticket for EOS host private const string EosHostAuthIdentity = "BarotraumaRemotePlayerAuth"; - private static Option currentEosHostAuthTicket = Option.None; - public static async Task> GetAuthTicketForEosHostAuth() + private static Option currentEosHostAuthTicket = Option.None; + public static async Task> GetAuthTicketForEosHostAuth() { if (!IsInitialized) { @@ -58,7 +58,7 @@ namespace Barotrauma.Steam } currentEosHostAuthTicket = Option.None; - var newTicket = await Steamworks.SteamUser.GetAuthTicketForWebApi(identity: EosHostAuthIdentity); + var newTicket = await Steamworks.SteamUser.GetAuthTicketForWebApiAsync(identity: EosHostAuthIdentity); currentEosHostAuthTicket = newTicket != null ? Option.Some(newTicket) @@ -71,8 +71,8 @@ namespace Barotrauma.Steam #region Auth ticket for GameAnalytics consent server private const string GameAnalyticsConsentIdentity = "BarotraumaGameAnalyticsConsent"; - private static Option currentGameAnalyticsConsentTicket = Option.None; - public static async Task> GetAuthTicketForGameAnalyticsConsent() + private static Option currentGameAnalyticsConsentTicket = Option.None; + public static async Task> GetAuthTicketForGameAnalyticsConsent() { if (!IsInitialized) { @@ -85,7 +85,7 @@ namespace Barotrauma.Steam } currentGameAnalyticsConsentTicket = Option.None; - var newTicket = await Steamworks.SteamUser.GetAuthTicketForWebApi(identity: GameAnalyticsConsentIdentity); + var newTicket = await Steamworks.SteamUser.GetAuthTicketForWebApiAsync(identity: GameAnalyticsConsentIdentity); currentGameAnalyticsConsentTicket = newTicket != null ? Option.Some(newTicket) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Steam/SteamManager.cs b/Barotrauma/BarotraumaShared/SharedSource/Steam/SteamManager.cs index 18f992415..0b709c74c 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Steam/SteamManager.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Steam/SteamManager.cs @@ -247,6 +247,9 @@ namespace Barotrauma.Steam //this should be run even if SteamManager is uninitialized //servers need to be able to notify clients of unlocked talents even if the server isn't connected to Steam AchievementManager.Update(deltaTime); +#if CLIENT + SteamTimelineManager.Update(deltaTime); +#endif if (!IsInitialized) { return; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Tags.cs b/Barotrauma/BarotraumaShared/SharedSource/Tags.cs index e398bed82..6af96e15e 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Tags.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Tags.cs @@ -164,5 +164,9 @@ public static class Tags public static readonly Identifier Decoy = "decoy".ToIdentifier(); public static readonly Identifier Provocative = "provocative".ToIdentifier(); + /// + /// Tag used on status effects that mark the entity as being on fire. + /// + public static readonly Identifier OnFireStatusEffectTag = "onfire".ToIdentifier(); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Text/TextManager.cs b/Barotrauma/BarotraumaShared/SharedSource/Text/TextManager.cs index 99334e23f..d0035a9ab 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Text/TextManager.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Text/TextManager.cs @@ -295,6 +295,25 @@ namespace Barotrauma return TextPacks[languageIdentifier].First().TranslatedName; } + public static void LanguageChanged() + { + foreach ((LanguageIdentifier language, ImmutableList textPacks) in TextPacks) + { + foreach (TextPack textPack in textPacks) + { + if (GameSettings.CurrentConfig.Language == language) + { + textPack.VerifyLoaded(); + } + else + { + textPack.Unload(); + } + } + } + ClearCache(); + } + public static void ClearCache() { lock (cachedStrings) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Text/TextPack.cs b/Barotrauma/BarotraumaShared/SharedSource/Text/TextPack.cs index 142343aaf..19ee41a2f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Text/TextPack.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Text/TextPack.cs @@ -48,17 +48,30 @@ namespace Barotrauma public readonly LanguageIdentifier Language; - public readonly record struct Text( string String, bool IsOverride, TextPack TextPack); - public readonly ImmutableDictionary> Texts; + + private ImmutableDictionary> texts; + + public ImmutableDictionary> Texts + { + get + { + if (texts == null) + { + DebugConsole.NewMessage($"Accessed texts in an unloaded text package ({Language}). Loading the text pack..."); + VerifyLoaded(); + } + return texts; + } + } public readonly string TranslatedName; public readonly bool NoWhitespace; - public TextPack(TextFile file, ContentXElement mainElement, LanguageIdentifier language) + public TextPack(TextFile file, ContentXElement mainElement, LanguageIdentifier language, bool load = false) { ContentFile = file; @@ -73,6 +86,20 @@ namespace Barotrauma TranslatedName = mainElement.GetAttributeString("translatedname", languageName.Value); NoWhitespace = mainElement.GetAttributeBool("nowhitespace", false); + if (load) + { + VerifyLoaded(); + } + } + + public void VerifyLoaded() + { + //already loaded + if (this.texts != null) { return; } + + XDocument doc = XMLExtensions.TryLoadXml(ContentFile.Path); + var mainElement = doc.Root.FromPackage(ContentFile.ContentPackage); + Dictionary> texts = new Dictionary>(); LoadElements(mainElement, isOverride: mainElement.IsOverride()); @@ -103,9 +130,14 @@ namespace Barotrauma } } - Texts = texts.Select(kvp => (kvp.Key, kvp.Value.ToImmutableArray())).ToImmutableDictionary(); + this.texts = texts.Select(kvp => (kvp.Key, kvp.Value.ToImmutableArray())).ToImmutableDictionary(); } - + + public void Unload() + { + texts = null; + } + #if DEBUG public void CheckForDuplicates(int index) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Utils/Rand.cs b/Barotrauma/BarotraumaShared/SharedSource/Utils/Rand.cs index 84d609f92..3559d4313 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Utils/Rand.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Utils/Rand.cs @@ -11,9 +11,22 @@ namespace Barotrauma { public enum RandSync { - Unsynced, //not synced, used for unimportant details like minor particle properties - ServerAndClient, //synced with the server (used for gameplay elements that the players can interact with) + /// + /// Not synced, used for unimportant details like minor particle properties. + /// + Unsynced, + /// + /// An RNG instance shared by the client and the server is used to generate the values. + /// Please note that just using RandSync.ServerAndClient DOES NOT guarantee that the server and the client will generate the same values when doing some arbitrary calls to the methods in this class. + /// The values are only guaranteed to be the same if the same seed () is set on both sides, and then the same sequence of calls is made. + /// + ServerAndClient, #if CLIENT + /// + /// An RNG instance shared by different clients. Used for things that the server doesn't track, but clients want to match anyway (e.g. certain level visuals). + /// Please note that just using RandSync.ClientOnly DOES NOT guarantee that the clients will generate the same values when doing some arbitrary calls to the methods in this class. + /// The values are only guaranteed to be the same if the same seed () is set on both sides, and then the same sequence of calls is made. + /// ClientOnly //set to match between clients (used for misc elements that the server doesn't track, but clients want to match anyway) #endif } diff --git a/Barotrauma/BarotraumaShared/changelog.txt b/Barotrauma/BarotraumaShared/changelog.txt index 0c63ae6ec..93a55aa61 100644 --- a/Barotrauma/BarotraumaShared/changelog.txt +++ b/Barotrauma/BarotraumaShared/changelog.txt @@ -1,4 +1,126 @@ ------------------------------------------------------------------------------------------------------------------------------------------------- +v1.9.7.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +Multiplayer: +- Fixed anyone being allowed to modify turrets and the sub's upgrades. Now it requires campaign management permissions. + +Modding: +- Fixed only the first OnInserted effect defined for an item being executed when the item is placed in a container. +- Fixed conditional's TargetSelf property not working on melee weapons. + +------------------------------------------------------------------------------------------------------------------------------------------------- +v1.9.6.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +Changes and additions: +- Added Power Distributor item. Includes 8 power outputs and sliders that can be used to control how much of the input power is distributed to each output. Can be used to, for example, build a circuit that redirects power from less vital systems to weapons or pumps in an emergency. +- Added Rifle Scope. +- Better Steam Timeline support: when recording gameplay using Steam, the game adds markers about notable events in the game. +- Added scaling and rotation tools to the submarine editor. Enabled using buttons in the top-right corner of the editor. +- Characters don't throw flares when also holding a ranged weapon (allows shooting with a flare in hand). +- Improvements to pets (kudos to uberpendragon): improved ragdolls and animations, gave them head slots so they can wear hats, added damage modifiers to shells. +- Mindwipe resets the extra talents gained via the assistant's Apprentice talent tree, preventing the use of Mindwipes as a way to make an assistant unlock the specialization trees of all classes. +- Alien Blood is now less powerful, by curing less "Bloodloss" affliction and causing more psychosis. It is widely available and made saline and blood packs pretty redundant. It now also requires more medical skill. +- Added option to filter by name and to change the sorting of the save files listed in the "load game" menu. +- Made circuit boxes' external connections (the once that hook up to other items) use the same labels that have been set inside the circuit box. +- Made the freecam console command a toggle: entering it again gives you back control of the character. +- Added "loslightingfreecam" console command (convenient for testing, executes those 3 commands). +- Upgraded to .NET 8. This should not cause any noticeable changes, aside from perhaps very minor performance improvements. Allows code mods to use C# 12 features. + +Multiplayer: +- Fixed sending rapid reports of leaks, fires, enemies etc easily causing the spam filter to kick players with no warning. +- Added buttons for selecting or deselecting all mission types to the server lobby's mission type selection. +- Fixed wall damage desyncing if you purchase wall repairs in an outpost, undock and then save and reload (the walls would appear repaired client-side, even though they're actually broken server-side). +- Fixed the "nudge buttons" that appear next to the nav terminal's docking button not working in multiplayer. +- Fixed oxygen and fuel tank explosions not appearing client-side in multiplayer, making it seem like you're taking burn damage out of nowhere when you happened to be near one an "infinite explosion loop" (described below in the fixes section). +- Fixed players only getting a karma penalty for overheating the reactor if they stay at the reactor. +- Fixed another networking issue that sometimes caused the biome and outpost selection dropdowns to break in the server lobby, causing the clients to constantly spam the server with requests to change the biome/outpost. + +Optimization: +- Optimized memory usage of text files. Now only the text files for the language you have currently selected are kept in memory. +- Optimized the memory usage of submarine files. Previously the XML of all the enabled submarines was kept in memory, causing excessive memory usage when you have a ton of custom submarines installed. + +Fixes: +- Fixed oxygen tank shelves sometimes causing "infinite explosion loops", when tanks in the shelves exploded other tanks while the shelves were filling the tanks. +- Fixed camera not following your character when ragdolled/unconscious. +- Fixed "unsubscribe" option not showing up on the mod list on mods that have pending updates. +- Fixed NPCs spawned by events sometimes spawning inside jail cells in outposts. +- Fixed clowns never turning psychotic in the clown escort missions (there should be a small chance of that happening as the mission progresses). +- Fixed talent progress not being mentioned in the tooltip on "extra talents" (talents unlocked from outside the tree). +- Fixed salt bulbs exploding immediately in water (as opposed to having a small delay like other water-reactant items). +- Fixed hair and other attachment sprites still being misaligned in some UIs (character creation menu and outpost medic UI) if their origin doesn't match the head's origin. +- Fixes to several outpost and ruin generation issues: + - Pre-built "fallback outposts" sometimes spawning instead of a proper outpost, and sometimes even instead of a ruin. + - PvP outposts still sometimes generating outside the PvP mode (particularly when using mods with new location/outpost types). +- Fixed some consumables (e.g. energy drinks, beer, protein bars) getting consumed immediately if you hit E while drinking/eating. +- Fixed lights rendering upside-down on planters that have been flipped horizontally. +- Fixed inability to sit while using a surveillance center. +- Fixed option to give an item to another character showing up when you drag a large item (an item that won't go in the inventory slots) over someone, even though these items can't be given by dragging and dropping. +- Fixed ability to give characters multi-line names, which would break some UI elements. +- Fixed spawncharacter console command spawning monsters in the player team if the team argument is not given. +- Fixed R-29's bottom wall not leaking. Might've affected other submarines as well: there was a bug in the logic that prevents overlapping walls leaking faster than individual walls, which caused the game to sometimes interpret large gaps next to the wall as "overlapping walls". +- Fixed fabricator no longer communicating in any way when an item can't be fabricated because it requires a recipe. +- Fixed inability to focus on unconscious characters by clicking on the crew list. +- Fixed parts of the Jove sculptures found in ruins being misaligned in mirrored levels (= when travelling through the level backwards). +- Fixed the Multi-tool not functioning as a screwdriver for event checks. +- Fixed "fake fires" you see when under psychosis sometimes turning into real fires in single player. +- Fixed PvP mode weapon crates showing up in the sub editor. +- Fixed undoing the removal of an item from a container sometimes causing a crash in the sub editor. +- Fixed hulls extending below the floor in Kastrull's drone and the lowest deck, preventing them from draining fully. +- Fixed endworm's jaws sometimes doing AOE damage to characters after the endworm has died. +- Fixed rotated structures not appearing rotated on the sonar. +- Fixed talent refund points getting lost on save and reload. +- Fixed multi-part subs (subs consisting of multiple docked subs with other subs ducked to them) getting flipped incorrectly in PvP mode. +- Fixed "teleportsub endoutpost" crashing the game when a level is not loaded (e.g. in the sub editor's test mode). +- Fixed selected outpost module sometimes not loading in the sub editor's test mode, and a random outpost generating instead. +- Fixed pre-built "fallback outposts" failing to load in the sub editor (generating a full outpost instead). +- Fixed ability to put items in locked containers (e.g. running deconstructors) by hitting the drop key. +- Fixed wearing "mother's providence" and "mother's countenance" (special clown suits worn by the Jestmasters) not unlocking the "Praise the Honkmother" achievement. +- Fixed "secondary explosion" 2 seconds after a gravity shell has exploded and disappeared. +- Yet another fix to contained items rendering incorrectly on flipped items: affected contained items that are set to draw at an angle of 90 degrees relative to the container (e.g. fuel rod in a rapid fissile accelerator), causing them to draw backwards. +- Hid PvP weapon crates in the sub editor (because these require the PvP event and do nothing by themselves when placed in the editor). +- Fixed inability to make motion sensors react to non-humans that are in the "human" group (e.g. some custom android type of character) - they were not considered either humans, pets or monsters. Now characters in the human group are treated as humans, except if they're pets (in that case the sensor only triggers if set to trigger on pets). +- Fixed "firing blanks" traitor event requiring you to replace standard coilgun ammo boxes with fake ones, instead of accepting any type of coilgun ammo. +- Fixed PvP variants of underwater scooters sometimes spawning in cabinets in the campaign. + +Modding: +- Better support for configuring custom location types and configuring where they appear. Examples in the locationTypes.xml file. + - You can spawn a fixed number of a location type on the map (e.g. to have unique named locations). + - More control where specific location types spawn (e.g. near the beginning of a biome). + - Location types can be configured to "inherit" things such as event or outpost modules from another location type. +- Escort mission fixes and improvements: + - Fixed ""terroristAnnounceDialogTag" being completely ignored, making the terrorists always say the default separatist lines regardless of what's configured in XML. + - Added support for spawning multiple items for the terrorist, or optionally choosing random ones using a "ChooseRandom" element. Previously only one random item was chosen. + - Added some documentation for the mission type. +- Added support for making an item variant clear all elements of a certain type from the XML. Done by adding the element to the item variant, and then defining the elements to clear as it's child elements (e.g. would clear all fabrication recipes). +- Support for streaming any audio clip instead of loading them into memory (previously streaming was only supported for background music). Enabled by adding stream="true" to the sound element. Recommended for longer audio clips (such as music tracks played by items). Please note though that streaming audio comes with some CPU and IO overhead, so it's not recommended to blindly enable it on everything. +- Fixed specific kinds of looping sounds sometimes not playing in multiplayer (specifically, long sounds that are triggered right at the start of the round by a status effect, but not in the player's hearing range, e.g. rave music in Dynamic Europa's pirate outposts). +- Fixed NPCs made to hold an item using NPCOperateItemAction repeatedly equipping and unequipping it. +- Fixed delayed effects executing at the position where the entity was when the effect was triggered, not where the entity is when the delay passes. +- Fixed salvage missions causing a crash and the "interact" target type not working if the target item has no physics body. +- Fixed performance issue caused by element when using an invalid item identifier. +- Fixed colored text not working in the options in conversation prompts. +- Added CameraAimOffset property to Holdable component. Allows modifying how far the camera can be offset when aiming, making it possible to implement e.g. scopes. +- Added AbandonOnReset property to CombatAction and NPCWaitAction. +- Fixed some issues with PvP outpost selection that made it difficult to implement custom maps: + - If a mission was set to use a PvP outpost with some custom tag, the game might still not use it, because it chose the PvP level generation parameters, which would enforce an outpost with the vanilla "PvPOutpost" tag. Now the game tries to choose an outpost with the specified tag regardless of the level generation parameters. + - When "random" was selected on the outpost dropdown, the game would choose any random outpost without taking the selected mission into account. +- Fixed sounds configured to loop while an item is worn not stopping when the item is unequipped. Did not affect any vanilla items. +- Option to force a specific type of location as the campaign's start location by adding ForceAsStartOutpost="true" to the location type config. Ignored when the tutorial is enabled. +- Option to disallow attaching items over specific kinds of other items (e.g. DisallowAttachingOverTags="container,wallattachment"). +- Fixed inability to make motion sensors react to non-humans that are in the "human" group (e.g. some custom android type of character) - they were not considered either humans, pets or monsters. Now characters in the human group are treated as humans, except if they're pets (in that case the sensor only triggers if set to trigger on pets). +- Fixed OnInserted status effects triggering when loading a submarine/container which already contains items. Now the effects only trigger when the item is placed in the container. +- Fixed ability to equip/unequip noninteractable items using the "quick use" button above the slot. Only affects modded content (non-interactable items that are forced into a player inventory). +- Fixed Items' HasBeenInstantiatedOnce property not being saved, making it basically unusable. +- Fabrication recipes can be unlocked using StatusEffects (e.g. unlockrecipe="autoinjectorheadset"). +- Fixed SpawnRotationType.This not doing anything if the item executing the effect doesn't have a physics body, or if it's attached to a wall (which makes the item "temporarily" not have a body). +- Hidden missions (ShowInMenus="false") don't show up on the campaign map nor the mission selection panel. In the vanilla game, all hidden mission were triggered when the round starts so they wouldn't be visible there anyway, but that may not be the case with modded missions. +- Added CauseOfDeathType property to Character. Not used by the vanilla game, but can be used by mods to check the cause of death of the character using conditionals (e.g. if some OnDeath effects should or should not be triggered by certain causes of death). +- Support for animated affliction overlays (works the same as the animated HUD overlays on items such as the surveillance cameras). +- More options for configuring how Holdable items can be attached to the sub: AttachesToFloor (when enabled, the item can only be attached to a position where it touches the floor), AllowAttachInsideDoors (enabled by default), DisallowAttachingOverTags (tags of items the item cannot attach over). + +------------------------------------------------------------------------------------------------------------------------------------------------- v1.8.8.1 ------------------------------------------------------------------------------------------------------------------------------------------------- @@ -17,6 +139,7 @@ v1.8.8.1 Modding: - Fixed transferring afflictions to a newly spawned character using status effects causing a crash if the original character had already been removed. Didn't affect any vanilla content. +>>>>>>> master ------------------------------------------------------------------------------------------------------------------------------------------------- v1.8.7.0 diff --git a/Barotrauma/BarotraumaTest/LinuxTest.csproj b/Barotrauma/BarotraumaTest/LinuxTest.csproj index ec8379055..51555d397 100644 --- a/Barotrauma/BarotraumaTest/LinuxTest.csproj +++ b/Barotrauma/BarotraumaTest/LinuxTest.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable false diff --git a/Barotrauma/BarotraumaTest/MacTest.csproj b/Barotrauma/BarotraumaTest/MacTest.csproj index cda656429..b190a0e0d 100644 --- a/Barotrauma/BarotraumaTest/MacTest.csproj +++ b/Barotrauma/BarotraumaTest/MacTest.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable false diff --git a/Barotrauma/BarotraumaTest/WindowsTest.csproj b/Barotrauma/BarotraumaTest/WindowsTest.csproj index a64bc5835..e1babd296 100644 --- a/Barotrauma/BarotraumaTest/WindowsTest.csproj +++ b/Barotrauma/BarotraumaTest/WindowsTest.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable false diff --git a/Deploy/DeployAll/DeployAll.csproj b/Deploy/DeployAll/DeployAll.csproj index 72669ffd0..0e1e96340 100644 --- a/Deploy/DeployAll/DeployAll.csproj +++ b/Deploy/DeployAll/DeployAll.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net8.0 disable enable diff --git a/Deploy/DeployAll/DotnetCmd.cs b/Deploy/DeployAll/DotnetCmd.cs index 2ce19f8e6..c83839c2b 100644 --- a/Deploy/DeployAll/DotnetCmd.cs +++ b/Deploy/DeployAll/DotnetCmd.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -16,7 +16,7 @@ public static class DotnetCmd { private const string DotnetAppName = "dotnet"; - private const string DesiredRuntimeVersion = "6.0.8"; + private const string DesiredRuntimeVersion = "8.0.0"; public static void Publish(string projPath, string configuration, string runtime, string resultPath) { diff --git a/Libraries/BarotraumaLibs/BarotraumaCore/BarotraumaCore.csproj b/Libraries/BarotraumaLibs/BarotraumaCore/BarotraumaCore.csproj index 693263fbc..43147b2b5 100644 --- a/Libraries/BarotraumaLibs/BarotraumaCore/BarotraumaCore.csproj +++ b/Libraries/BarotraumaLibs/BarotraumaCore/BarotraumaCore.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 Barotrauma disable enable diff --git a/Libraries/BarotraumaLibs/BarotraumaCore/Extensions/EnumerableExtensionsCore.cs b/Libraries/BarotraumaLibs/BarotraumaCore/Extensions/EnumerableExtensionsCore.cs index e78ac9442..25da635d3 100644 --- a/Libraries/BarotraumaLibs/BarotraumaCore/Extensions/EnumerableExtensionsCore.cs +++ b/Libraries/BarotraumaLibs/BarotraumaCore/Extensions/EnumerableExtensionsCore.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace Barotrauma.Extensions; @@ -9,18 +10,9 @@ public static class EnumerableExtensionsCore public static ImmutableDictionary ToImmutableDictionary(this IEnumerable<(TKey, TValue)> enumerable) where TKey : notnull { - return enumerable.ToDictionary().ToImmutableDictionary(); - } - - public static Dictionary ToDictionary(this IEnumerable<(TKey, TValue)> enumerable) - where TKey : notnull - { - var dictionary = new Dictionary(); - foreach (var (k,v) in enumerable) - { - dictionary.Add(k, v); - } - return dictionary; + return enumerable + .ToDictionary(static pair => pair.Item1, static pair => pair.Item2) + .ToImmutableDictionary(); } [return: NotNullIfNotNull("immutableDictionary")] diff --git a/Libraries/BarotraumaLibs/BarotraumaCore/Extensions/RectangleExtensions.cs b/Libraries/BarotraumaLibs/BarotraumaCore/Extensions/RectangleExtensions.cs index 3c221e32e..c18de4d59 100644 --- a/Libraries/BarotraumaLibs/BarotraumaCore/Extensions/RectangleExtensions.cs +++ b/Libraries/BarotraumaLibs/BarotraumaCore/Extensions/RectangleExtensions.cs @@ -66,6 +66,15 @@ namespace Barotrauma.Extensions value.Top > bottom && rect.Top > otherBottom; } + /// + /// Converts the y-coordinate of the rectangle so that up is greater and down is lower + /// (i.e. so the Location of the rectangle is at the top-left corner in world coordinates). + /// + public static Rectangle ToWorldRect(this Rectangle rect) + { + return new Rectangle(rect.X, rect.Y - rect.Height, rect.Size.X, rect.Size.Y); + } + /// /// Like the XNA method, but treats the y-coordinate so that up is greater and down is lower. /// diff --git a/Libraries/BarotraumaLibs/BarotraumaCore/Utils/IEnumerableExtensionsCore.cs b/Libraries/BarotraumaLibs/BarotraumaCore/Utils/IEnumerableExtensionsCore.cs index 76fce3681..1b9eddbcc 100644 --- a/Libraries/BarotraumaLibs/BarotraumaCore/Utils/IEnumerableExtensionsCore.cs +++ b/Libraries/BarotraumaLibs/BarotraumaCore/Utils/IEnumerableExtensionsCore.cs @@ -69,6 +69,10 @@ public static class IEnumerableExtensionsCore } } + // Upgrading to .NET 8 seems to have caused a false positive on this line, disabled the warning for now. + // See https://github.com/dotnet/roslyn-analyzers/pull/7488 +#pragma warning disable CA2021 + public static IEnumerable Successes( this IEnumerable> source) where TSuccess : notnull @@ -84,4 +88,7 @@ public static class IEnumerableExtensionsCore => source .OfType>() .Select(f => f.Error); + +#pragma warning disable 2021 + } \ No newline at end of file diff --git a/Libraries/BarotraumaLibs/EosInterface/EosInterface.csproj b/Libraries/BarotraumaLibs/EosInterface/EosInterface.csproj index 1acbecf34..e366bb52f 100644 --- a/Libraries/BarotraumaLibs/EosInterface/EosInterface.csproj +++ b/Libraries/BarotraumaLibs/EosInterface/EosInterface.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 disable enable Barotrauma diff --git a/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.Linux.csproj b/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.Linux.csproj index 57341009e..7d6285b43 100644 --- a/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.Linux.csproj +++ b/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.Linux.csproj @@ -2,7 +2,7 @@ EosInterface.Implementation.Linux - net6.0 + net8.0 EosInterfacePrivate false disable diff --git a/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.MacOS.csproj b/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.MacOS.csproj index df8cbade0..92b296731 100644 --- a/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.MacOS.csproj +++ b/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.MacOS.csproj @@ -2,7 +2,7 @@ EosInterface.Implementation.MacOS - net6.0 + net8.0 EosInterfacePrivate false disable diff --git a/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.Win64.csproj b/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.Win64.csproj index 7af67291b..a83dbc148 100644 --- a/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.Win64.csproj +++ b/Libraries/BarotraumaLibs/EosInterfacePrivate/EosInterface.Implementation.Win64.csproj @@ -2,7 +2,7 @@ EosInterface.Implementation.Win64 - net6.0 + net8.0 EosInterfacePrivate false disable diff --git a/Libraries/BarotraumaLibs/EosInterfacePrivate/InterfaceImpl/IdAndAuth/LoginPrivate.cs b/Libraries/BarotraumaLibs/EosInterfacePrivate/InterfaceImpl/IdAndAuth/LoginPrivate.cs index 689ff998a..3b7a78fd6 100644 --- a/Libraries/BarotraumaLibs/EosInterfacePrivate/InterfaceImpl/IdAndAuth/LoginPrivate.cs +++ b/Libraries/BarotraumaLibs/EosInterfacePrivate/InterfaceImpl/IdAndAuth/LoginPrivate.cs @@ -12,7 +12,7 @@ namespace EosInterfacePrivate; static class LoginPrivate { private const string EosLoginSteamIdentity = "BarotraumaEosLogin"; - private static Option steamworksAuthTicket; + private static Option steamworksAuthTicket; private static Option eosConnectExpirationNotifyId, eosConnectStatusChangedNotifyId; private static Option egsAuthExpirationNotifyId; @@ -65,7 +65,7 @@ static class LoginPrivate { if (!Steamworks.SteamClient.IsValid || !Steamworks.SteamClient.IsLoggedOn) { return Result.Failure(EosInterface.Login.LoginError.SteamNotLoggedIn); } if (steamworksAuthTicket.TryUnwrap(out var oldTicket)) { oldTicket.Cancel(); } - var newTicketNullable = await Steamworks.SteamUser.GetAuthTicketForWebApi(EosLoginSteamIdentity); + var newTicketNullable = await Steamworks.SteamUser.GetAuthTicketForWebApiAsync(EosLoginSteamIdentity); if (newTicketNullable is not { Data: not null } ticket) { return Result.Failure(EosInterface.Login.LoginError.FailedToGetSteamSessionTicket); @@ -195,7 +195,7 @@ static class LoginPrivate public static async Task, EosInterface.Login.LoginError>> LoginEpicWithLinkedSteamAccount(EosInterface.Login.LoginEpicFlags flags) { if (steamworksAuthTicket.TryUnwrap(out var oldTicket)) { oldTicket.Cancel(); } - var newTicketNullable = await Steamworks.SteamUser.GetAuthTicketForWebApi(EosLoginSteamIdentity); + var newTicketNullable = await Steamworks.SteamUser.GetAuthTicketForWebApiAsync(EosLoginSteamIdentity); if (newTicketNullable is not { Data: not null } ticket) { return Result.Failure(EosInterface.Login.LoginError.FailedToGetSteamSessionTicket); diff --git a/Libraries/BarotraumaLibs/EosInterfacePrivate/InterfaceImpl/Util/ResultExtension.cs b/Libraries/BarotraumaLibs/EosInterfacePrivate/InterfaceImpl/Util/ResultExtension.cs index a37e80169..3a2ee338d 100644 --- a/Libraries/BarotraumaLibs/EosInterfacePrivate/InterfaceImpl/Util/ResultExtension.cs +++ b/Libraries/BarotraumaLibs/EosInterfacePrivate/InterfaceImpl/Util/ResultExtension.cs @@ -8,7 +8,7 @@ public static class ResultExtension { public static T FailAndLogUnhandledError(this Epic.OnlineServices.Result result, T unknown, [CallerMemberName] string caller = null) { - DebugConsoleCore.NewMessage($"Result \"{result}\" was not handled by \"{caller}\".", Color.Red); + DebugConsoleCore.NewMessage($"Epic Online Services Result \"{result}\" was not handled by \"{caller}\".", Color.Red); return unknown; } } \ No newline at end of file diff --git a/Libraries/Facepunch.Steamworks/Classes/AuthTicketForWebApi.cs b/Libraries/Facepunch.Steamworks/Classes/AuthTicketForWebApi.cs deleted file mode 100644 index d1a363494..000000000 --- a/Libraries/Facepunch.Steamworks/Classes/AuthTicketForWebApi.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; - -namespace Steamworks; - -public class AuthTicketForWebApi : IDisposable -{ - public byte[]? Data { get; private set; } - public uint Handle { get; private set; } - - public bool Canceled { get; private set; } - - public AuthTicketForWebApi( byte[] data, uint handle ) - { - Data = data; - Handle = handle; - } - - /// - /// Cancels a ticket. - /// You should cancel your ticket when you close the game or leave a server. - /// - public void Cancel() - { - if (Handle != 0) - { - SteamUser.Internal?.CancelAuthTicket(Handle); - } - - Handle = 0; - Data = null; - Canceled = true; - } - - public void Dispose() - { - Cancel(); - } -} diff --git a/Libraries/Facepunch.Steamworks/Classes/SteamApi.cs b/Libraries/Facepunch.Steamworks/Classes/SteamApi.cs index a8b882b28..14ec7f9fe 100644 --- a/Libraries/Facepunch.Steamworks/Classes/SteamApi.cs +++ b/Libraries/Facepunch.Steamworks/Classes/SteamApi.cs @@ -11,9 +11,8 @@ namespace Steamworks { internal static class Native { - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_Init", CallingConvention = CallingConvention.Cdecl )] - [return: MarshalAs( UnmanagedType.I1 )] - public static extern bool SteamAPI_Init(); + [DllImport( Platform.LibraryName, EntryPoint = "SteamInternal_SteamAPI_Init", CallingConvention = CallingConvention.Cdecl )] + public static extern SteamAPIInitResult SteamInternal_SteamAPI_Init( IntPtr pszInternalCheckInterfaceVersions, IntPtr pOutErrMsg ); [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_Shutdown", CallingConvention = CallingConvention.Cdecl )] public static extern void SteamAPI_Shutdown(); @@ -26,9 +25,14 @@ namespace Steamworks public static extern bool SteamAPI_RestartAppIfNecessary( uint unOwnAppID ); } - static internal bool Init() + + static internal SteamAPIInitResult Init( string pszInternalCheckInterfaceVersions, out string pOutErrMsg ) { - return Native.SteamAPI_Init(); + using var interfaceVersionsStr = new Utf8StringToNative( pszInternalCheckInterfaceVersions ); + using var buffer = Helpers.Memory.Take(); + var result = Native.SteamInternal_SteamAPI_Init( interfaceVersionsStr.Pointer, buffer.Ptr ); + pOutErrMsg = Helpers.MemoryToString( buffer.Ptr ); + return result; } static internal void Shutdown() diff --git a/Libraries/Facepunch.Steamworks/Classes/SteamInternal.cs b/Libraries/Facepunch.Steamworks/Classes/SteamInternal.cs index bc9ea6d5a..0f76c88ef 100644 --- a/Libraries/Facepunch.Steamworks/Classes/SteamInternal.cs +++ b/Libraries/Facepunch.Steamworks/Classes/SteamInternal.cs @@ -11,14 +11,18 @@ namespace Steamworks { internal static class Native { - [DllImport( Platform.LibraryName, EntryPoint = "SteamInternal_GameServer_Init", CallingConvention = CallingConvention.Cdecl )] - [return: MarshalAs( UnmanagedType.I1 )] - public static extern bool SteamInternal_GameServer_Init( uint unIP, ushort usPort, ushort usGamePort, ushort usQueryPort, int eServerMode, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersionString ); + [DllImport( Platform.LibraryName, EntryPoint = "SteamInternal_GameServer_Init_V2", CallingConvention = CallingConvention.Cdecl )] + public static extern SteamAPIInitResult SteamInternal_GameServer_Init_V2( uint unIP, ushort usGamePort, ushort usQueryPort, int eServerMode, IntPtr pchVersionString, IntPtr pszInternalCheckInterfaceVersions, IntPtr pOutErrMsg ); } - static internal bool GameServer_Init( uint unIP, ushort usPort, ushort usGamePort, ushort usQueryPort, int eServerMode, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersionString ) + static internal SteamAPIInitResult GameServer_Init( uint unIP, ushort usGamePort, ushort usQueryPort, int eServerMode, string pchVersionString, string pszInternalCheckInterfaceVersions, out string pOutErrMsg ) { - return Native.SteamInternal_GameServer_Init( unIP, usPort, usGamePort, usQueryPort, eServerMode, pchVersionString ); + using var versionStr = new Utf8StringToNative( pchVersionString ); + using var interfaceVersionsStr = new Utf8StringToNative( pszInternalCheckInterfaceVersions ); + using var buffer = Helpers.Memory.Take(); + var result = Native.SteamInternal_GameServer_Init_V2( unIP, usGamePort, usQueryPort, eServerMode, versionStr.Pointer, interfaceVersionsStr.Pointer, buffer.Ptr ); + pOutErrMsg = Helpers.MemoryToString( buffer.Ptr ); + return result; } } } diff --git a/Libraries/Facepunch.Steamworks/Facepunch.Steamworks.targets b/Libraries/Facepunch.Steamworks/Facepunch.Steamworks.targets index 2e6b10014..1213aa6e9 100644 --- a/Libraries/Facepunch.Steamworks/Facepunch.Steamworks.targets +++ b/Libraries/Facepunch.Steamworks/Facepunch.Steamworks.targets @@ -6,8 +6,8 @@ - 2.3.4 - 2.3.4 + 2.4.1 + 2.4.1 diff --git a/Libraries/Facepunch.Steamworks/Generated/CustomEnums.cs b/Libraries/Facepunch.Steamworks/Generated/CustomEnums.cs index c7b55f544..34fbefbd7 100644 --- a/Libraries/Facepunch.Steamworks/Generated/CustomEnums.cs +++ b/Libraries/Facepunch.Steamworks/Generated/CustomEnums.cs @@ -159,8 +159,6 @@ namespace Steamworks DeleteItemResult = 3417, UserSubscribedItemsListChanged = 3418, WorkshopEULAStatus = 3420, - SteamAppInstalled = 3901, - SteamAppUninstalled = 3902, PlaybackStatusHasChanged = 4001, VolumeHasChanged = 4002, MusicPlayerWantsVolume = 4011, @@ -200,6 +198,8 @@ namespace Steamworks HTML_UpdateToolTip = 4525, HTML_HideToolTip = 4526, HTML_BrowserRestarted = 4527, + BroadcastUploadStart = 4604, + BroadcastUploadStop = 4605, GetVideoURLResult = 4611, GetOPFSettingsResult = 4624, SteamInventoryResultReady = 4700, @@ -225,6 +225,8 @@ namespace Steamworks SteamRemotePlaySessionConnected = 5701, SteamRemotePlaySessionDisconnected = 5702, SteamRemotePlayTogetherGuestInvite = 5703, + SteamTimelineGamePhaseRecordingExists = 6001, + SteamTimelineEventRecordingExists = 6002, } internal static partial class CallbackTypeFactory { @@ -379,8 +381,6 @@ namespace Steamworks { CallbackType.DeleteItemResult, typeof( DeleteItemResult_t )}, { CallbackType.UserSubscribedItemsListChanged, typeof( UserSubscribedItemsListChanged_t )}, { CallbackType.WorkshopEULAStatus, typeof( WorkshopEULAStatus_t )}, - { CallbackType.SteamAppInstalled, typeof( SteamAppInstalled_t )}, - { CallbackType.SteamAppUninstalled, typeof( SteamAppUninstalled_t )}, { CallbackType.PlaybackStatusHasChanged, typeof( PlaybackStatusHasChanged_t )}, { CallbackType.VolumeHasChanged, typeof( VolumeHasChanged_t )}, { CallbackType.MusicPlayerWantsVolume, typeof( MusicPlayerWantsVolume_t )}, @@ -420,6 +420,8 @@ namespace Steamworks { CallbackType.HTML_UpdateToolTip, typeof( HTML_UpdateToolTip_t )}, { CallbackType.HTML_HideToolTip, typeof( HTML_HideToolTip_t )}, { CallbackType.HTML_BrowserRestarted, typeof( HTML_BrowserRestarted_t )}, + { CallbackType.BroadcastUploadStart, typeof( BroadcastUploadStart_t )}, + { CallbackType.BroadcastUploadStop, typeof( BroadcastUploadStop_t )}, { CallbackType.GetVideoURLResult, typeof( GetVideoURLResult_t )}, { CallbackType.GetOPFSettingsResult, typeof( GetOPFSettingsResult_t )}, { CallbackType.SteamInventoryResultReady, typeof( SteamInventoryResultReady_t )}, @@ -445,6 +447,8 @@ namespace Steamworks { CallbackType.SteamRemotePlaySessionConnected, typeof( SteamRemotePlaySessionConnected_t )}, { CallbackType.SteamRemotePlaySessionDisconnected, typeof( SteamRemotePlaySessionDisconnected_t )}, { CallbackType.SteamRemotePlayTogetherGuestInvite, typeof( SteamRemotePlayTogetherGuestInvite_t )}, + { CallbackType.SteamTimelineGamePhaseRecordingExists, typeof( SteamTimelineGamePhaseRecordingExists_t )}, + { CallbackType.SteamTimelineEventRecordingExists, typeof( SteamTimelineEventRecordingExists_t )}, }; } } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamAppList.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamAppList.cs index b67457561..2b1a7b552 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamAppList.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamAppList.cs @@ -7,7 +7,7 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamAppList : SteamInterface + internal unsafe partial class ISteamAppList : SteamInterface { internal ISteamAppList( bool IsGameServer ) diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs index a64317fc6..2f5c2b42b 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamApps : SteamInterface + internal unsafe partial class ISteamApps : SteamInterface { + public const string Version = "STEAMAPPS_INTERFACE_VERSION008"; internal ISteamApps( bool IsGameServer ) { @@ -156,9 +157,9 @@ namespace Steamworks #endregion internal bool BGetDLCDataByIndex( int iDLC, ref AppId pAppID, [MarshalAs( UnmanagedType.U1 )] ref bool pbAvailable, out string pchName ) { - using var mempchName = Helpers.TakeMemory(); - var returnValue = _BGetDLCDataByIndex( Self, iDLC, ref pAppID, ref pbAvailable, mempchName, (1024 * 32) ); - pchName = Helpers.MemoryToString( mempchName ); + using var mem__pchName = Helpers.TakeMemory(); + var returnValue = _BGetDLCDataByIndex( Self, iDLC, ref pAppID, ref pbAvailable, mem__pchName, (1024 * 32) ); + pchName = Helpers.MemoryToString( mem__pchName ); return returnValue; } @@ -200,9 +201,9 @@ namespace Steamworks #endregion internal bool GetCurrentBetaName( out string pchName ) { - using var mempchName = Helpers.TakeMemory(); - var returnValue = _GetCurrentBetaName( Self, mempchName, (1024 * 32) ); - pchName = Helpers.MemoryToString( mempchName ); + using var mem__pchName = Helpers.TakeMemory(); + var returnValue = _GetCurrentBetaName( Self, mem__pchName, (1024 * 32) ); + pchName = Helpers.MemoryToString( mem__pchName ); return returnValue; } @@ -236,9 +237,9 @@ namespace Steamworks #endregion internal uint GetAppInstallDir( AppId appID, out string pchFolder ) { - using var mempchFolder = Helpers.TakeMemory(); - var returnValue = _GetAppInstallDir( Self, appID, mempchFolder, (1024 * 32) ); - pchFolder = Helpers.MemoryToString( mempchFolder ); + using var mem__pchFolder = Helpers.TakeMemory(); + var returnValue = _GetAppInstallDir( Self, appID, mem__pchFolder, (1024 * 32) ); + pchFolder = Helpers.MemoryToString( mem__pchFolder ); return returnValue; } @@ -267,12 +268,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamApps_GetLaunchQueryParam", CallingConvention = Platform.CC)] - private static extern Utf8StringPointer _GetLaunchQueryParam( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ); + private static extern Utf8StringPointer _GetLaunchQueryParam( IntPtr self, IntPtr pchKey ); #endregion - internal string GetLaunchQueryParam( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ) + internal string GetLaunchQueryParam( string pchKey ) { - var returnValue = _GetLaunchQueryParam( Self, pchKey ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + var returnValue = _GetLaunchQueryParam( Self, str__pchKey.Pointer ); return returnValue; } @@ -311,12 +313,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamApps_GetFileDetails", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _GetFileDetails( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszFileName ); + private static extern SteamAPICall_t _GetFileDetails( IntPtr self, IntPtr pszFileName ); #endregion - internal CallResult GetFileDetails( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszFileName ) + internal CallResult GetFileDetails( string pszFileName ) { - var returnValue = _GetFileDetails( Self, pszFileName ); + using var str__pszFileName = new Utf8StringToNative( pszFileName ); + var returnValue = _GetFileDetails( Self, str__pszFileName.Pointer ); return new CallResult( returnValue, IsServer ); } @@ -327,9 +330,9 @@ namespace Steamworks #endregion internal int GetLaunchCommandLine( out string pszCommandLine ) { - using var mempszCommandLine = Helpers.TakeMemory(); - var returnValue = _GetLaunchCommandLine( Self, mempszCommandLine, (1024 * 32) ); - pszCommandLine = Helpers.MemoryToString( mempszCommandLine ); + using var mem__pszCommandLine = Helpers.TakeMemory(); + var returnValue = _GetLaunchCommandLine( Self, mem__pszCommandLine, (1024 * 32) ); + pszCommandLine = Helpers.MemoryToString( mem__pszCommandLine ); return returnValue; } @@ -369,5 +372,45 @@ namespace Steamworks return returnValue; } + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamApps_GetNumBetas", CallingConvention = Platform.CC)] + private static extern int _GetNumBetas( IntPtr self, ref int pnAvailable, ref int pnPrivate ); + + #endregion + internal int GetNumBetas( ref int pnAvailable, ref int pnPrivate ) + { + var returnValue = _GetNumBetas( Self, ref pnAvailable, ref pnPrivate ); + return returnValue; + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamApps_GetBetaInfo", CallingConvention = Platform.CC)] + [return: MarshalAs( UnmanagedType.I1 )] + private static extern bool _GetBetaInfo( IntPtr self, int iBetaIndex, ref uint punFlags, ref uint punBuildID, IntPtr pchBetaName, int cchBetaName, IntPtr pchDescription, int cchDescription ); + + #endregion + internal bool GetBetaInfo( int iBetaIndex, ref uint punFlags, ref uint punBuildID, out string pchBetaName, out string pchDescription ) + { + using var mem__pchBetaName = Helpers.TakeMemory(); + using var mem__pchDescription = Helpers.TakeMemory(); + var returnValue = _GetBetaInfo( Self, iBetaIndex, ref punFlags, ref punBuildID, mem__pchBetaName, (1024 * 32), mem__pchDescription, (1024 * 32) ); + pchBetaName = Helpers.MemoryToString( mem__pchBetaName ); + pchDescription = Helpers.MemoryToString( mem__pchDescription ); + return returnValue; + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamApps_SetActiveBeta", CallingConvention = Platform.CC)] + [return: MarshalAs( UnmanagedType.I1 )] + private static extern bool _SetActiveBeta( IntPtr self, IntPtr pchBetaName ); + + #endregion + internal bool SetActiveBeta( string pchBetaName ) + { + using var str__pchBetaName = new Utf8StringToNative( pchBetaName ); + var returnValue = _SetActiveBeta( Self, str__pchBetaName.Pointer ); + return returnValue; + } + } } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamClient.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamClient.cs index 418f5dab6..ff610e118 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamClient.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamClient.cs @@ -7,9 +7,8 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamClient : SteamInterface + internal unsafe partial class ISteamClient : SteamInterface { - internal ISteamClient( bool IsGameServer ) { SetupInterface( IsGameServer ); @@ -72,23 +71,25 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamUser", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamUser( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamUser( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamUser( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamUser( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamUser( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamUser( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamGameServer", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamGameServer( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamGameServer( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamGameServer( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamGameServer( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamGameServer( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamGameServer( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } @@ -104,133 +105,145 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamFriends", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamFriends( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamFriends( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamFriends( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamFriends( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamFriends( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamFriends( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamUtils", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamUtils( IntPtr self, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamUtils( IntPtr self, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamUtils( HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamUtils( HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamUtils( Self, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamUtils( Self, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamMatchmaking", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamMatchmaking( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamMatchmaking( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamMatchmaking( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamMatchmaking( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamMatchmaking( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamMatchmaking( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamMatchmakingServers", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamMatchmakingServers( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamMatchmakingServers( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamMatchmakingServers( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamMatchmakingServers( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamMatchmakingServers( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamMatchmakingServers( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamGenericInterface", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamGenericInterface( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamGenericInterface( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamGenericInterface( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamGenericInterface( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamGenericInterface( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamGenericInterface( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamUserStats", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamUserStats( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamUserStats( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamUserStats( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamUserStats( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamUserStats( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamUserStats( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamGameServerStats", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamGameServerStats( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamGameServerStats( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamGameServerStats( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamGameServerStats( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamGameServerStats( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamGameServerStats( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamApps", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamApps( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamApps( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamApps( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamApps( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamApps( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamApps( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamNetworking", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamNetworking( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamNetworking( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamNetworking( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamNetworking( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamNetworking( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamNetworking( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamRemoteStorage", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamRemoteStorage( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamRemoteStorage( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamRemoteStorage( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamRemoteStorage( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamRemoteStorage( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamRemoteStorage( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamScreenshots", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamScreenshots( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamScreenshots( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamScreenshots( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamScreenshots( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamScreenshots( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamScreenshots( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamGameSearch", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamGameSearch( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamGameSearch( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamGameSearch( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamGameSearch( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamGameSearch( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamGameSearch( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } @@ -269,144 +282,145 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamHTTP", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamHTTP( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamHTTP( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamHTTP( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamHTTP( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamHTTP( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamHTTP( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamController", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamController( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamController( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamController( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamController( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamController( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamController( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamUGC", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamUGC( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamUGC( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamUGC( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamUGC( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamUGC( Self, hSteamUser, hSteamPipe, pchVersion ); - return returnValue; - } - - #region FunctionMeta - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamAppList", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamAppList( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); - - #endregion - internal IntPtr GetISteamAppList( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) - { - var returnValue = _GetISteamAppList( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamUGC( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamMusic", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamMusic( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamMusic( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamMusic( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamMusic( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamMusic( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamMusic( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamMusicRemote", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamMusicRemote( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamMusicRemote( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamMusicRemote( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamMusicRemote( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamMusicRemote( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamMusicRemote( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamHTMLSurface", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamHTMLSurface( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamHTMLSurface( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamHTMLSurface( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamHTMLSurface( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamHTMLSurface( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamHTMLSurface( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamInventory", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamInventory( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamInventory( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamInventory( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamInventory( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamInventory( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamInventory( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamVideo", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamVideo( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamVideo( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamVideo( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamVideo( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamVideo( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamVideo( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamParentalSettings", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamParentalSettings( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamParentalSettings( IntPtr self, HSteamUser hSteamuser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamParentalSettings( HSteamUser hSteamuser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamParentalSettings( HSteamUser hSteamuser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamParentalSettings( Self, hSteamuser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamParentalSettings( Self, hSteamuser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamInput", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamInput( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamInput( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamInput( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamInput( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamInput( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamInput( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamParties", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamParties( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamParties( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamParties( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamParties( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamParties( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamParties( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamClient_GetISteamRemotePlay", CallingConvention = Platform.CC)] - private static extern IntPtr _GetISteamRemotePlay( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ); + private static extern IntPtr _GetISteamRemotePlay( IntPtr self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, IntPtr pchVersion ); #endregion - internal IntPtr GetISteamRemotePlay( HSteamUser hSteamUser, HSteamPipe hSteamPipe, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVersion ) + internal IntPtr GetISteamRemotePlay( HSteamUser hSteamUser, HSteamPipe hSteamPipe, string pchVersion ) { - var returnValue = _GetISteamRemotePlay( Self, hSteamUser, hSteamPipe, pchVersion ); + using var str__pchVersion = new Utf8StringToNative( pchVersion ); + var returnValue = _GetISteamRemotePlay( Self, hSteamUser, hSteamPipe, str__pchVersion.Pointer ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamController.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamController.cs index d93dccffe..95b1f592e 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamController.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamController.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamController : SteamInterface + internal unsafe partial class ISteamController : SteamInterface { + public const string Version = "SteamController008"; internal ISteamController( bool IsGameServer ) { @@ -67,12 +68,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamController_GetActionSetHandle", CallingConvention = Platform.CC)] - private static extern ControllerActionSetHandle_t _GetActionSetHandle( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionSetName ); + private static extern ControllerActionSetHandle_t _GetActionSetHandle( IntPtr self, IntPtr pszActionSetName ); #endregion - internal ControllerActionSetHandle_t GetActionSetHandle( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionSetName ) + internal ControllerActionSetHandle_t GetActionSetHandle( string pszActionSetName ) { - var returnValue = _GetActionSetHandle( Self, pszActionSetName ); + using var str__pszActionSetName = new Utf8StringToNative( pszActionSetName ); + var returnValue = _GetActionSetHandle( Self, str__pszActionSetName.Pointer ); return returnValue; } @@ -140,12 +142,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamController_GetDigitalActionHandle", CallingConvention = Platform.CC)] - private static extern ControllerDigitalActionHandle_t _GetDigitalActionHandle( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionName ); + private static extern ControllerDigitalActionHandle_t _GetDigitalActionHandle( IntPtr self, IntPtr pszActionName ); #endregion - internal ControllerDigitalActionHandle_t GetDigitalActionHandle( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionName ) + internal ControllerDigitalActionHandle_t GetDigitalActionHandle( string pszActionName ) { - var returnValue = _GetDigitalActionHandle( Self, pszActionName ); + using var str__pszActionName = new Utf8StringToNative( pszActionName ); + var returnValue = _GetDigitalActionHandle( Self, str__pszActionName.Pointer ); return returnValue; } @@ -173,12 +176,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamController_GetAnalogActionHandle", CallingConvention = Platform.CC)] - private static extern ControllerAnalogActionHandle_t _GetAnalogActionHandle( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionName ); + private static extern ControllerAnalogActionHandle_t _GetAnalogActionHandle( IntPtr self, IntPtr pszActionName ); #endregion - internal ControllerAnalogActionHandle_t GetAnalogActionHandle( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionName ) + internal ControllerAnalogActionHandle_t GetAnalogActionHandle( string pszActionName ) { - var returnValue = _GetAnalogActionHandle( Self, pszActionName ); + using var str__pszActionName = new Utf8StringToNative( pszActionName ); + var returnValue = _GetAnalogActionHandle( Self, str__pszActionName.Pointer ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs index b8e5cd443..b4be58e29 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamFriends : SteamInterface + internal unsafe partial class ISteamFriends : SteamInterface { + public const string Version = "SteamFriends017"; internal ISteamFriends( bool IsGameServer ) { @@ -33,12 +34,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_SetPersonaName", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _SetPersonaName( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPersonaName ); + private static extern SteamAPICall_t _SetPersonaName( IntPtr self, IntPtr pchPersonaName ); #endregion - internal CallResult SetPersonaName( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPersonaName ) + internal CallResult SetPersonaName( string pchPersonaName ) { - var returnValue = _SetPersonaName( Self, pchPersonaName ); + using var str__pchPersonaName = new Utf8StringToNative( pchPersonaName ); + var returnValue = _SetPersonaName( Self, str__pchPersonaName.Pointer ); return new CallResult( returnValue, IsServer ); } @@ -332,32 +334,35 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_ActivateGameOverlay", CallingConvention = Platform.CC)] - private static extern void _ActivateGameOverlay( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchDialog ); + private static extern void _ActivateGameOverlay( IntPtr self, IntPtr pchDialog ); #endregion - internal void ActivateGameOverlay( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchDialog ) + internal void ActivateGameOverlay( string pchDialog ) { - _ActivateGameOverlay( Self, pchDialog ); + using var str__pchDialog = new Utf8StringToNative( pchDialog ); + _ActivateGameOverlay( Self, str__pchDialog.Pointer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_ActivateGameOverlayToUser", CallingConvention = Platform.CC)] - private static extern void _ActivateGameOverlayToUser( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchDialog, SteamId steamID ); + private static extern void _ActivateGameOverlayToUser( IntPtr self, IntPtr pchDialog, SteamId steamID ); #endregion - internal void ActivateGameOverlayToUser( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchDialog, SteamId steamID ) + internal void ActivateGameOverlayToUser( string pchDialog, SteamId steamID ) { - _ActivateGameOverlayToUser( Self, pchDialog, steamID ); + using var str__pchDialog = new Utf8StringToNative( pchDialog ); + _ActivateGameOverlayToUser( Self, str__pchDialog.Pointer, steamID ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_ActivateGameOverlayToWebPage", CallingConvention = Platform.CC)] - private static extern void _ActivateGameOverlayToWebPage( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchURL, ActivateGameOverlayToWebPageMode eMode ); + private static extern void _ActivateGameOverlayToWebPage( IntPtr self, IntPtr pchURL, ActivateGameOverlayToWebPageMode eMode ); #endregion - internal void ActivateGameOverlayToWebPage( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchURL, ActivateGameOverlayToWebPageMode eMode ) + internal void ActivateGameOverlayToWebPage( string pchURL, ActivateGameOverlayToWebPageMode eMode ) { - _ActivateGameOverlayToWebPage( Self, pchURL, eMode ); + using var str__pchURL = new Utf8StringToNative( pchURL ); + _ActivateGameOverlayToWebPage( Self, str__pchURL.Pointer, eMode ); } #region FunctionMeta @@ -493,12 +498,14 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_SetRichPresence", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetRichPresence( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ); + private static extern bool _SetRichPresence( IntPtr self, IntPtr pchKey, IntPtr pchValue ); #endregion - internal bool SetRichPresence( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ) + internal bool SetRichPresence( string pchKey, string pchValue ) { - var returnValue = _SetRichPresence( Self, pchKey, pchValue ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + using var str__pchValue = new Utf8StringToNative( pchValue ); + var returnValue = _SetRichPresence( Self, str__pchKey.Pointer, str__pchValue.Pointer ); return returnValue; } @@ -514,12 +521,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_GetFriendRichPresence", CallingConvention = Platform.CC)] - private static extern Utf8StringPointer _GetFriendRichPresence( IntPtr self, SteamId steamIDFriend, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ); + private static extern Utf8StringPointer _GetFriendRichPresence( IntPtr self, SteamId steamIDFriend, IntPtr pchKey ); #endregion - internal string GetFriendRichPresence( SteamId steamIDFriend, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ) + internal string GetFriendRichPresence( SteamId steamIDFriend, string pchKey ) { - var returnValue = _GetFriendRichPresence( Self, steamIDFriend, pchKey ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + var returnValue = _GetFriendRichPresence( Self, steamIDFriend, str__pchKey.Pointer ); return returnValue; } @@ -558,12 +566,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_InviteUserToGame", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _InviteUserToGame( IntPtr self, SteamId steamIDFriend, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchConnectString ); + private static extern bool _InviteUserToGame( IntPtr self, SteamId steamIDFriend, IntPtr pchConnectString ); #endregion - internal bool InviteUserToGame( SteamId steamIDFriend, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchConnectString ) + internal bool InviteUserToGame( SteamId steamIDFriend, string pchConnectString ) { - var returnValue = _InviteUserToGame( Self, steamIDFriend, pchConnectString ); + using var str__pchConnectString = new Utf8StringToNative( pchConnectString ); + var returnValue = _InviteUserToGame( Self, steamIDFriend, str__pchConnectString.Pointer ); return returnValue; } @@ -659,12 +668,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_SendClanChatMessage", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SendClanChatMessage( IntPtr self, SteamId steamIDClanChat, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchText ); + private static extern bool _SendClanChatMessage( IntPtr self, SteamId steamIDClanChat, IntPtr pchText ); #endregion - internal bool SendClanChatMessage( SteamId steamIDClanChat, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchText ) + internal bool SendClanChatMessage( SteamId steamIDClanChat, string pchText ) { - var returnValue = _SendClanChatMessage( Self, steamIDClanChat, pchText ); + using var str__pchText = new Utf8StringToNative( pchText ); + var returnValue = _SendClanChatMessage( Self, steamIDClanChat, str__pchText.Pointer ); return returnValue; } @@ -742,12 +752,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_ReplyToFriendMessage", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _ReplyToFriendMessage( IntPtr self, SteamId steamIDFriend, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchMsgToSend ); + private static extern bool _ReplyToFriendMessage( IntPtr self, SteamId steamIDFriend, IntPtr pchMsgToSend ); #endregion - internal bool ReplyToFriendMessage( SteamId steamIDFriend, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchMsgToSend ) + internal bool ReplyToFriendMessage( SteamId steamIDFriend, string pchMsgToSend ) { - var returnValue = _ReplyToFriendMessage( Self, steamIDFriend, pchMsgToSend ); + using var str__pchMsgToSend = new Utf8StringToNative( pchMsgToSend ); + var returnValue = _ReplyToFriendMessage( Self, steamIDFriend, str__pchMsgToSend.Pointer ); return returnValue; } @@ -843,23 +854,25 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_RegisterProtocolInOverlayBrowser", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _RegisterProtocolInOverlayBrowser( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchProtocol ); + private static extern bool _RegisterProtocolInOverlayBrowser( IntPtr self, IntPtr pchProtocol ); #endregion - internal bool RegisterProtocolInOverlayBrowser( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchProtocol ) + internal bool RegisterProtocolInOverlayBrowser( string pchProtocol ) { - var returnValue = _RegisterProtocolInOverlayBrowser( Self, pchProtocol ); + using var str__pchProtocol = new Utf8StringToNative( pchProtocol ); + var returnValue = _RegisterProtocolInOverlayBrowser( Self, str__pchProtocol.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamFriends_ActivateGameOverlayInviteDialogConnectString", CallingConvention = Platform.CC)] - private static extern void _ActivateGameOverlayInviteDialogConnectString( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchConnectString ); + private static extern void _ActivateGameOverlayInviteDialogConnectString( IntPtr self, IntPtr pchConnectString ); #endregion - internal void ActivateGameOverlayInviteDialogConnectString( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchConnectString ) + internal void ActivateGameOverlayInviteDialogConnectString( string pchConnectString ) { - _ActivateGameOverlayInviteDialogConnectString( Self, pchConnectString ); + using var str__pchConnectString = new Utf8StringToNative( pchConnectString ); + _ActivateGameOverlayInviteDialogConnectString( Self, str__pchConnectString.Pointer ); } #region FunctionMeta diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameSearch.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameSearch.cs index 3c70b84f7..23566ee05 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameSearch.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameSearch.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamGameSearch : SteamInterface + internal unsafe partial class ISteamGameSearch : SteamInterface { + public const string Version = "SteamMatchGameSearch001"; internal ISteamGameSearch( bool IsGameServer ) { @@ -22,12 +23,14 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameSearch_AddGameSearchParams", CallingConvention = Platform.CC)] - private static extern GameSearchErrorCode_t _AddGameSearchParams( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKeyToFind, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValuesToFind ); + private static extern GameSearchErrorCode_t _AddGameSearchParams( IntPtr self, IntPtr pchKeyToFind, IntPtr pchValuesToFind ); #endregion - internal GameSearchErrorCode_t AddGameSearchParams( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKeyToFind, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValuesToFind ) + internal GameSearchErrorCode_t AddGameSearchParams( string pchKeyToFind, string pchValuesToFind ) { - var returnValue = _AddGameSearchParams( Self, pchKeyToFind, pchValuesToFind ); + using var str__pchKeyToFind = new Utf8StringToNative( pchKeyToFind ); + using var str__pchValuesToFind = new Utf8StringToNative( pchValuesToFind ); + var returnValue = _AddGameSearchParams( Self, str__pchKeyToFind.Pointer, str__pchValuesToFind.Pointer ); return returnValue; } @@ -82,9 +85,9 @@ namespace Steamworks #endregion internal GameSearchErrorCode_t RetrieveConnectionDetails( SteamId steamIDHost, out string pchConnectionDetails ) { - using var mempchConnectionDetails = Helpers.TakeMemory(); - var returnValue = _RetrieveConnectionDetails( Self, steamIDHost, mempchConnectionDetails, (1024 * 32) ); - pchConnectionDetails = Helpers.MemoryToString( mempchConnectionDetails ); + using var mem__pchConnectionDetails = Helpers.TakeMemory(); + var returnValue = _RetrieveConnectionDetails( Self, steamIDHost, mem__pchConnectionDetails, (1024 * 32) ); + pchConnectionDetails = Helpers.MemoryToString( mem__pchConnectionDetails ); return returnValue; } @@ -101,23 +104,26 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameSearch_SetGameHostParams", CallingConvention = Platform.CC)] - private static extern GameSearchErrorCode_t _SetGameHostParams( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ); + private static extern GameSearchErrorCode_t _SetGameHostParams( IntPtr self, IntPtr pchKey, IntPtr pchValue ); #endregion - internal GameSearchErrorCode_t SetGameHostParams( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ) + internal GameSearchErrorCode_t SetGameHostParams( string pchKey, string pchValue ) { - var returnValue = _SetGameHostParams( Self, pchKey, pchValue ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + using var str__pchValue = new Utf8StringToNative( pchValue ); + var returnValue = _SetGameHostParams( Self, str__pchKey.Pointer, str__pchValue.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameSearch_SetConnectionDetails", CallingConvention = Platform.CC)] - private static extern GameSearchErrorCode_t _SetConnectionDetails( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchConnectionDetails, int cubConnectionDetails ); + private static extern GameSearchErrorCode_t _SetConnectionDetails( IntPtr self, IntPtr pchConnectionDetails, int cubConnectionDetails ); #endregion - internal GameSearchErrorCode_t SetConnectionDetails( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchConnectionDetails, int cubConnectionDetails ) + internal GameSearchErrorCode_t SetConnectionDetails( string pchConnectionDetails, int cubConnectionDetails ) { - var returnValue = _SetConnectionDetails( Self, pchConnectionDetails, cubConnectionDetails ); + using var str__pchConnectionDetails = new Utf8StringToNative( pchConnectionDetails ); + var returnValue = _SetConnectionDetails( Self, str__pchConnectionDetails.Pointer, cubConnectionDetails ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs index b80a6953c..f9cccce75 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamGameServer : SteamInterface + internal unsafe partial class ISteamGameServer : SteamInterface { + public const string Version = "SteamGameServer015"; internal ISteamGameServer( bool IsGameServer ) { @@ -22,32 +23,35 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetProduct", CallingConvention = Platform.CC)] - private static extern void _SetProduct( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszProduct ); + private static extern void _SetProduct( IntPtr self, IntPtr pszProduct ); #endregion - internal void SetProduct( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszProduct ) + internal void SetProduct( string pszProduct ) { - _SetProduct( Self, pszProduct ); + using var str__pszProduct = new Utf8StringToNative( pszProduct ); + _SetProduct( Self, str__pszProduct.Pointer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetGameDescription", CallingConvention = Platform.CC)] - private static extern void _SetGameDescription( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszGameDescription ); + private static extern void _SetGameDescription( IntPtr self, IntPtr pszGameDescription ); #endregion - internal void SetGameDescription( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszGameDescription ) + internal void SetGameDescription( string pszGameDescription ) { - _SetGameDescription( Self, pszGameDescription ); + using var str__pszGameDescription = new Utf8StringToNative( pszGameDescription ); + _SetGameDescription( Self, str__pszGameDescription.Pointer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetModDir", CallingConvention = Platform.CC)] - private static extern void _SetModDir( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszModDir ); + private static extern void _SetModDir( IntPtr self, IntPtr pszModDir ); #endregion - internal void SetModDir( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszModDir ) + internal void SetModDir( string pszModDir ) { - _SetModDir( Self, pszModDir ); + using var str__pszModDir = new Utf8StringToNative( pszModDir ); + _SetModDir( Self, str__pszModDir.Pointer ); } #region FunctionMeta @@ -62,12 +66,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_LogOn", CallingConvention = Platform.CC)] - private static extern void _LogOn( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszToken ); + private static extern void _LogOn( IntPtr self, IntPtr pszToken ); #endregion - internal void LogOn( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszToken ) + internal void LogOn( string pszToken ) { - _LogOn( Self, pszToken ); + using var str__pszToken = new Utf8StringToNative( pszToken ); + _LogOn( Self, str__pszToken.Pointer ); } #region FunctionMeta @@ -159,22 +164,24 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetServerName", CallingConvention = Platform.CC)] - private static extern void _SetServerName( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszServerName ); + private static extern void _SetServerName( IntPtr self, IntPtr pszServerName ); #endregion - internal void SetServerName( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszServerName ) + internal void SetServerName( string pszServerName ) { - _SetServerName( Self, pszServerName ); + using var str__pszServerName = new Utf8StringToNative( pszServerName ); + _SetServerName( Self, str__pszServerName.Pointer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetMapName", CallingConvention = Platform.CC)] - private static extern void _SetMapName( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszMapName ); + private static extern void _SetMapName( IntPtr self, IntPtr pszMapName ); #endregion - internal void SetMapName( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszMapName ) + internal void SetMapName( string pszMapName ) { - _SetMapName( Self, pszMapName ); + using var str__pszMapName = new Utf8StringToNative( pszMapName ); + _SetMapName( Self, str__pszMapName.Pointer ); } #region FunctionMeta @@ -199,12 +206,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetSpectatorServerName", CallingConvention = Platform.CC)] - private static extern void _SetSpectatorServerName( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszSpectatorServerName ); + private static extern void _SetSpectatorServerName( IntPtr self, IntPtr pszSpectatorServerName ); #endregion - internal void SetSpectatorServerName( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszSpectatorServerName ) + internal void SetSpectatorServerName( string pszSpectatorServerName ) { - _SetSpectatorServerName( Self, pszSpectatorServerName ); + using var str__pszSpectatorServerName = new Utf8StringToNative( pszSpectatorServerName ); + _SetSpectatorServerName( Self, str__pszSpectatorServerName.Pointer ); } #region FunctionMeta @@ -219,42 +227,47 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetKeyValue", CallingConvention = Platform.CC)] - private static extern void _SetKeyValue( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pValue ); + private static extern void _SetKeyValue( IntPtr self, IntPtr pKey, IntPtr pValue ); #endregion - internal void SetKeyValue( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pValue ) + internal void SetKeyValue( string pKey, string pValue ) { - _SetKeyValue( Self, pKey, pValue ); + using var str__pKey = new Utf8StringToNative( pKey ); + using var str__pValue = new Utf8StringToNative( pValue ); + _SetKeyValue( Self, str__pKey.Pointer, str__pValue.Pointer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetGameTags", CallingConvention = Platform.CC)] - private static extern void _SetGameTags( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchGameTags ); + private static extern void _SetGameTags( IntPtr self, IntPtr pchGameTags ); #endregion - internal void SetGameTags( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchGameTags ) + internal void SetGameTags( string pchGameTags ) { - _SetGameTags( Self, pchGameTags ); + using var str__pchGameTags = new Utf8StringToNative( pchGameTags ); + _SetGameTags( Self, str__pchGameTags.Pointer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetGameData", CallingConvention = Platform.CC)] - private static extern void _SetGameData( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchGameData ); + private static extern void _SetGameData( IntPtr self, IntPtr pchGameData ); #endregion - internal void SetGameData( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchGameData ) + internal void SetGameData( string pchGameData ) { - _SetGameData( Self, pchGameData ); + using var str__pchGameData = new Utf8StringToNative( pchGameData ); + _SetGameData( Self, str__pchGameData.Pointer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_SetRegion", CallingConvention = Platform.CC)] - private static extern void _SetRegion( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszRegion ); + private static extern void _SetRegion( IntPtr self, IntPtr pszRegion ); #endregion - internal void SetRegion( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszRegion ) + internal void SetRegion( string pszRegion ) { - _SetRegion( Self, pszRegion ); + using var str__pszRegion = new Utf8StringToNative( pszRegion ); + _SetRegion( Self, str__pszRegion.Pointer ); } #region FunctionMeta @@ -445,12 +458,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServer_BUpdateUserData", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _BUpdateUserData( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPlayerName, uint uScore ); + private static extern bool _BUpdateUserData( IntPtr self, SteamId steamIDUser, IntPtr pchPlayerName, uint uScore ); #endregion - internal bool BUpdateUserData( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPlayerName, uint uScore ) + internal bool BUpdateUserData( SteamId steamIDUser, string pchPlayerName, uint uScore ) { - var returnValue = _BUpdateUserData( Self, steamIDUser, pchPlayerName, uScore ); + using var str__pchPlayerName = new Utf8StringToNative( pchPlayerName ); + var returnValue = _BUpdateUserData( Self, steamIDUser, str__pchPlayerName.Pointer, uScore ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServerStats.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServerStats.cs index de293cbe5..04c7b41b5 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServerStats.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServerStats.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamGameServerStats : SteamInterface + internal unsafe partial class ISteamGameServerStats : SteamInterface { + public const string Version = "SteamGameServerStats001"; internal ISteamGameServerStats( bool IsGameServer ) { @@ -34,96 +35,104 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServerStats_GetUserStatInt32", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetUserStat( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref int pData ); + private static extern bool _GetUserStat( IntPtr self, SteamId steamIDUser, IntPtr pchName, ref int pData ); #endregion - internal bool GetUserStat( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref int pData ) + internal bool GetUserStat( SteamId steamIDUser, string pchName, ref int pData ) { - var returnValue = _GetUserStat( Self, steamIDUser, pchName, ref pData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetUserStat( Self, steamIDUser, str__pchName.Pointer, ref pData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServerStats_GetUserStatFloat", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetUserStat( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pData ); + private static extern bool _GetUserStat( IntPtr self, SteamId steamIDUser, IntPtr pchName, ref float pData ); #endregion - internal bool GetUserStat( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pData ) + internal bool GetUserStat( SteamId steamIDUser, string pchName, ref float pData ) { - var returnValue = _GetUserStat( Self, steamIDUser, pchName, ref pData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetUserStat( Self, steamIDUser, str__pchName.Pointer, ref pData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServerStats_GetUserAchievement", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetUserAchievement( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); + private static extern bool _GetUserAchievement( IntPtr self, SteamId steamIDUser, IntPtr pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); #endregion - internal bool GetUserAchievement( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) + internal bool GetUserAchievement( SteamId steamIDUser, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) { - var returnValue = _GetUserAchievement( Self, steamIDUser, pchName, ref pbAchieved ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetUserAchievement( Self, steamIDUser, str__pchName.Pointer, ref pbAchieved ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServerStats_SetUserStatInt32", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetUserStat( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, int nData ); + private static extern bool _SetUserStat( IntPtr self, SteamId steamIDUser, IntPtr pchName, int nData ); #endregion - internal bool SetUserStat( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, int nData ) + internal bool SetUserStat( SteamId steamIDUser, string pchName, int nData ) { - var returnValue = _SetUserStat( Self, steamIDUser, pchName, nData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _SetUserStat( Self, steamIDUser, str__pchName.Pointer, nData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServerStats_SetUserStatFloat", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetUserStat( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, float fData ); + private static extern bool _SetUserStat( IntPtr self, SteamId steamIDUser, IntPtr pchName, float fData ); #endregion - internal bool SetUserStat( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, float fData ) + internal bool SetUserStat( SteamId steamIDUser, string pchName, float fData ) { - var returnValue = _SetUserStat( Self, steamIDUser, pchName, fData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _SetUserStat( Self, steamIDUser, str__pchName.Pointer, fData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServerStats_UpdateUserAvgRateStat", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _UpdateUserAvgRateStat( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, float flCountThisSession, double dSessionLength ); + private static extern bool _UpdateUserAvgRateStat( IntPtr self, SteamId steamIDUser, IntPtr pchName, float flCountThisSession, double dSessionLength ); #endregion - internal bool UpdateUserAvgRateStat( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, float flCountThisSession, double dSessionLength ) + internal bool UpdateUserAvgRateStat( SteamId steamIDUser, string pchName, float flCountThisSession, double dSessionLength ) { - var returnValue = _UpdateUserAvgRateStat( Self, steamIDUser, pchName, flCountThisSession, dSessionLength ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _UpdateUserAvgRateStat( Self, steamIDUser, str__pchName.Pointer, flCountThisSession, dSessionLength ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServerStats_SetUserAchievement", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetUserAchievement( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ); + private static extern bool _SetUserAchievement( IntPtr self, SteamId steamIDUser, IntPtr pchName ); #endregion - internal bool SetUserAchievement( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ) + internal bool SetUserAchievement( SteamId steamIDUser, string pchName ) { - var returnValue = _SetUserAchievement( Self, steamIDUser, pchName ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _SetUserAchievement( Self, steamIDUser, str__pchName.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamGameServerStats_ClearUserAchievement", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _ClearUserAchievement( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ); + private static extern bool _ClearUserAchievement( IntPtr self, SteamId steamIDUser, IntPtr pchName ); #endregion - internal bool ClearUserAchievement( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ) + internal bool ClearUserAchievement( SteamId steamIDUser, string pchName ) { - var returnValue = _ClearUserAchievement( Self, steamIDUser, pchName ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _ClearUserAchievement( Self, steamIDUser, str__pchName.Pointer ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamHTMLSurface.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamHTMLSurface.cs index 38c6b462e..04863e7ad 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamHTMLSurface.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamHTMLSurface.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamHTMLSurface : SteamInterface + internal unsafe partial class ISteamHTMLSurface : SteamInterface { + public const string Version = "STEAMHTMLSURFACE_INTERFACE_VERSION_005"; internal ISteamHTMLSurface( bool IsGameServer ) { @@ -46,12 +47,14 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTMLSurface_CreateBrowser", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _CreateBrowser( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchUserAgent, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchUserCSS ); + private static extern SteamAPICall_t _CreateBrowser( IntPtr self, IntPtr pchUserAgent, IntPtr pchUserCSS ); #endregion - internal CallResult CreateBrowser( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchUserAgent, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchUserCSS ) + internal CallResult CreateBrowser( string pchUserAgent, string pchUserCSS ) { - var returnValue = _CreateBrowser( Self, pchUserAgent, pchUserCSS ); + using var str__pchUserAgent = new Utf8StringToNative( pchUserAgent ); + using var str__pchUserCSS = new Utf8StringToNative( pchUserCSS ); + var returnValue = _CreateBrowser( Self, str__pchUserAgent.Pointer, str__pchUserCSS.Pointer ); return new CallResult( returnValue, IsServer ); } @@ -67,12 +70,14 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTMLSurface_LoadURL", CallingConvention = Platform.CC)] - private static extern void _LoadURL( IntPtr self, HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchURL, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPostData ); + private static extern void _LoadURL( IntPtr self, HHTMLBrowser unBrowserHandle, IntPtr pchURL, IntPtr pchPostData ); #endregion - internal void LoadURL( HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchURL, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPostData ) + internal void LoadURL( HHTMLBrowser unBrowserHandle, string pchURL, string pchPostData ) { - _LoadURL( Self, unBrowserHandle, pchURL, pchPostData ); + using var str__pchURL = new Utf8StringToNative( pchURL ); + using var str__pchPostData = new Utf8StringToNative( pchPostData ); + _LoadURL( Self, unBrowserHandle, str__pchURL.Pointer, str__pchPostData.Pointer ); } #region FunctionMeta @@ -127,22 +132,25 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTMLSurface_AddHeader", CallingConvention = Platform.CC)] - private static extern void _AddHeader( IntPtr self, HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ); + private static extern void _AddHeader( IntPtr self, HHTMLBrowser unBrowserHandle, IntPtr pchKey, IntPtr pchValue ); #endregion - internal void AddHeader( HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ) + internal void AddHeader( HHTMLBrowser unBrowserHandle, string pchKey, string pchValue ) { - _AddHeader( Self, unBrowserHandle, pchKey, pchValue ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + using var str__pchValue = new Utf8StringToNative( pchValue ); + _AddHeader( Self, unBrowserHandle, str__pchKey.Pointer, str__pchValue.Pointer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTMLSurface_ExecuteJavascript", CallingConvention = Platform.CC)] - private static extern void _ExecuteJavascript( IntPtr self, HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchScript ); + private static extern void _ExecuteJavascript( IntPtr self, HHTMLBrowser unBrowserHandle, IntPtr pchScript ); #endregion - internal void ExecuteJavascript( HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchScript ) + internal void ExecuteJavascript( HHTMLBrowser unBrowserHandle, string pchScript ) { - _ExecuteJavascript( Self, unBrowserHandle, pchScript ); + using var str__pchScript = new Utf8StringToNative( pchScript ); + _ExecuteJavascript( Self, unBrowserHandle, str__pchScript.Pointer ); } #region FunctionMeta @@ -287,12 +295,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTMLSurface_Find", CallingConvention = Platform.CC)] - private static extern void _Find( IntPtr self, HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchSearchStr, [MarshalAs( UnmanagedType.U1 )] bool bCurrentlyInFind, [MarshalAs( UnmanagedType.U1 )] bool bReverse ); + private static extern void _Find( IntPtr self, HHTMLBrowser unBrowserHandle, IntPtr pchSearchStr, [MarshalAs( UnmanagedType.U1 )] bool bCurrentlyInFind, [MarshalAs( UnmanagedType.U1 )] bool bReverse ); #endregion - internal void Find( HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchSearchStr, [MarshalAs( UnmanagedType.U1 )] bool bCurrentlyInFind, [MarshalAs( UnmanagedType.U1 )] bool bReverse ) + internal void Find( HHTMLBrowser unBrowserHandle, string pchSearchStr, [MarshalAs( UnmanagedType.U1 )] bool bCurrentlyInFind, [MarshalAs( UnmanagedType.U1 )] bool bReverse ) { - _Find( Self, unBrowserHandle, pchSearchStr, bCurrentlyInFind, bReverse ); + using var str__pchSearchStr = new Utf8StringToNative( pchSearchStr ); + _Find( Self, unBrowserHandle, str__pchSearchStr.Pointer, bCurrentlyInFind, bReverse ); } #region FunctionMeta @@ -317,12 +326,16 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTMLSurface_SetCookie", CallingConvention = Platform.CC)] - private static extern void _SetCookie( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHostname, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPath, RTime32 nExpires, [MarshalAs( UnmanagedType.U1 )] bool bSecure, [MarshalAs( UnmanagedType.U1 )] bool bHTTPOnly ); + private static extern void _SetCookie( IntPtr self, IntPtr pchHostname, IntPtr pchKey, IntPtr pchValue, IntPtr pchPath, RTime32 nExpires, [MarshalAs( UnmanagedType.U1 )] bool bSecure, [MarshalAs( UnmanagedType.U1 )] bool bHTTPOnly ); #endregion - internal void SetCookie( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHostname, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPath, RTime32 nExpires, [MarshalAs( UnmanagedType.U1 )] bool bSecure, [MarshalAs( UnmanagedType.U1 )] bool bHTTPOnly ) + internal void SetCookie( string pchHostname, string pchKey, string pchValue, string pchPath, RTime32 nExpires, [MarshalAs( UnmanagedType.U1 )] bool bSecure, [MarshalAs( UnmanagedType.U1 )] bool bHTTPOnly ) { - _SetCookie( Self, pchHostname, pchKey, pchValue, pchPath, nExpires, bSecure, bHTTPOnly ); + using var str__pchHostname = new Utf8StringToNative( pchHostname ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + using var str__pchValue = new Utf8StringToNative( pchValue ); + using var str__pchPath = new Utf8StringToNative( pchPath ); + _SetCookie( Self, str__pchHostname.Pointer, str__pchKey.Pointer, str__pchValue.Pointer, str__pchPath.Pointer, nExpires, bSecure, bHTTPOnly ); } #region FunctionMeta @@ -387,12 +400,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTMLSurface_FileLoadDialogResponse", CallingConvention = Platform.CC)] - private static extern void _FileLoadDialogResponse( IntPtr self, HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchSelectedFiles ); + private static extern void _FileLoadDialogResponse( IntPtr self, HHTMLBrowser unBrowserHandle, IntPtr pchSelectedFiles ); #endregion - internal void FileLoadDialogResponse( HHTMLBrowser unBrowserHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchSelectedFiles ) + internal void FileLoadDialogResponse( HHTMLBrowser unBrowserHandle, string pchSelectedFiles ) { - _FileLoadDialogResponse( Self, unBrowserHandle, pchSelectedFiles ); + using var str__pchSelectedFiles = new Utf8StringToNative( pchSelectedFiles ); + _FileLoadDialogResponse( Self, unBrowserHandle, str__pchSelectedFiles.Pointer ); } } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamHTTP.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamHTTP.cs index 599054b5c..5f3cccb61 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamHTTP.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamHTTP.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamHTTP : SteamInterface + internal unsafe partial class ISteamHTTP : SteamInterface { + public const string Version = "STEAMHTTP_INTERFACE_VERSION003"; internal ISteamHTTP( bool IsGameServer ) { @@ -25,12 +26,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTTP_CreateHTTPRequest", CallingConvention = Platform.CC)] - private static extern HTTPRequestHandle _CreateHTTPRequest( IntPtr self, HTTPMethod eHTTPRequestMethod, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchAbsoluteURL ); + private static extern HTTPRequestHandle _CreateHTTPRequest( IntPtr self, HTTPMethod eHTTPRequestMethod, IntPtr pchAbsoluteURL ); #endregion - internal HTTPRequestHandle CreateHTTPRequest( HTTPMethod eHTTPRequestMethod, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchAbsoluteURL ) + internal HTTPRequestHandle CreateHTTPRequest( HTTPMethod eHTTPRequestMethod, string pchAbsoluteURL ) { - var returnValue = _CreateHTTPRequest( Self, eHTTPRequestMethod, pchAbsoluteURL ); + using var str__pchAbsoluteURL = new Utf8StringToNative( pchAbsoluteURL ); + var returnValue = _CreateHTTPRequest( Self, eHTTPRequestMethod, str__pchAbsoluteURL.Pointer ); return returnValue; } @@ -61,24 +63,28 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTTP_SetHTTPRequestHeaderValue", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetHTTPRequestHeaderValue( IntPtr self, HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHeaderName, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHeaderValue ); + private static extern bool _SetHTTPRequestHeaderValue( IntPtr self, HTTPRequestHandle hRequest, IntPtr pchHeaderName, IntPtr pchHeaderValue ); #endregion - internal bool SetHTTPRequestHeaderValue( HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHeaderName, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHeaderValue ) + internal bool SetHTTPRequestHeaderValue( HTTPRequestHandle hRequest, string pchHeaderName, string pchHeaderValue ) { - var returnValue = _SetHTTPRequestHeaderValue( Self, hRequest, pchHeaderName, pchHeaderValue ); + using var str__pchHeaderName = new Utf8StringToNative( pchHeaderName ); + using var str__pchHeaderValue = new Utf8StringToNative( pchHeaderValue ); + var returnValue = _SetHTTPRequestHeaderValue( Self, hRequest, str__pchHeaderName.Pointer, str__pchHeaderValue.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTTP_SetHTTPRequestGetOrPostParameter", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetHTTPRequestGetOrPostParameter( IntPtr self, HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchParamName, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchParamValue ); + private static extern bool _SetHTTPRequestGetOrPostParameter( IntPtr self, HTTPRequestHandle hRequest, IntPtr pchParamName, IntPtr pchParamValue ); #endregion - internal bool SetHTTPRequestGetOrPostParameter( HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchParamName, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchParamValue ) + internal bool SetHTTPRequestGetOrPostParameter( HTTPRequestHandle hRequest, string pchParamName, string pchParamValue ) { - var returnValue = _SetHTTPRequestGetOrPostParameter( Self, hRequest, pchParamName, pchParamValue ); + using var str__pchParamName = new Utf8StringToNative( pchParamName ); + using var str__pchParamValue = new Utf8StringToNative( pchParamValue ); + var returnValue = _SetHTTPRequestGetOrPostParameter( Self, hRequest, str__pchParamName.Pointer, str__pchParamValue.Pointer ); return returnValue; } @@ -133,24 +139,26 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTTP_GetHTTPResponseHeaderSize", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetHTTPResponseHeaderSize( IntPtr self, HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHeaderName, ref uint unResponseHeaderSize ); + private static extern bool _GetHTTPResponseHeaderSize( IntPtr self, HTTPRequestHandle hRequest, IntPtr pchHeaderName, ref uint unResponseHeaderSize ); #endregion - internal bool GetHTTPResponseHeaderSize( HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHeaderName, ref uint unResponseHeaderSize ) + internal bool GetHTTPResponseHeaderSize( HTTPRequestHandle hRequest, string pchHeaderName, ref uint unResponseHeaderSize ) { - var returnValue = _GetHTTPResponseHeaderSize( Self, hRequest, pchHeaderName, ref unResponseHeaderSize ); + using var str__pchHeaderName = new Utf8StringToNative( pchHeaderName ); + var returnValue = _GetHTTPResponseHeaderSize( Self, hRequest, str__pchHeaderName.Pointer, ref unResponseHeaderSize ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTTP_GetHTTPResponseHeaderValue", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetHTTPResponseHeaderValue( IntPtr self, HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHeaderName, ref byte pHeaderValueBuffer, uint unBufferSize ); + private static extern bool _GetHTTPResponseHeaderValue( IntPtr self, HTTPRequestHandle hRequest, IntPtr pchHeaderName, ref byte pHeaderValueBuffer, uint unBufferSize ); #endregion - internal bool GetHTTPResponseHeaderValue( HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHeaderName, ref byte pHeaderValueBuffer, uint unBufferSize ) + internal bool GetHTTPResponseHeaderValue( HTTPRequestHandle hRequest, string pchHeaderName, ref byte pHeaderValueBuffer, uint unBufferSize ) { - var returnValue = _GetHTTPResponseHeaderValue( Self, hRequest, pchHeaderName, ref pHeaderValueBuffer, unBufferSize ); + using var str__pchHeaderName = new Utf8StringToNative( pchHeaderName ); + var returnValue = _GetHTTPResponseHeaderValue( Self, hRequest, str__pchHeaderName.Pointer, ref pHeaderValueBuffer, unBufferSize ); return returnValue; } @@ -217,12 +225,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTTP_SetHTTPRequestRawPostBody", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetHTTPRequestRawPostBody( IntPtr self, HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchContentType, [In,Out] byte[] pubBody, uint unBodyLen ); + private static extern bool _SetHTTPRequestRawPostBody( IntPtr self, HTTPRequestHandle hRequest, IntPtr pchContentType, [In,Out] byte[] pubBody, uint unBodyLen ); #endregion - internal bool SetHTTPRequestRawPostBody( HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchContentType, [In,Out] byte[] pubBody, uint unBodyLen ) + internal bool SetHTTPRequestRawPostBody( HTTPRequestHandle hRequest, string pchContentType, [In,Out] byte[] pubBody, uint unBodyLen ) { - var returnValue = _SetHTTPRequestRawPostBody( Self, hRequest, pchContentType, pubBody, unBodyLen ); + using var str__pchContentType = new Utf8StringToNative( pchContentType ); + var returnValue = _SetHTTPRequestRawPostBody( Self, hRequest, str__pchContentType.Pointer, pubBody, unBodyLen ); return returnValue; } @@ -252,12 +261,15 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTTP_SetCookie", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetCookie( IntPtr self, HTTPCookieContainerHandle hCookieContainer, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHost, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchUrl, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchCookie ); + private static extern bool _SetCookie( IntPtr self, HTTPCookieContainerHandle hCookieContainer, IntPtr pchHost, IntPtr pchUrl, IntPtr pchCookie ); #endregion - internal bool SetCookie( HTTPCookieContainerHandle hCookieContainer, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchHost, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchUrl, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchCookie ) + internal bool SetCookie( HTTPCookieContainerHandle hCookieContainer, string pchHost, string pchUrl, string pchCookie ) { - var returnValue = _SetCookie( Self, hCookieContainer, pchHost, pchUrl, pchCookie ); + using var str__pchHost = new Utf8StringToNative( pchHost ); + using var str__pchUrl = new Utf8StringToNative( pchUrl ); + using var str__pchCookie = new Utf8StringToNative( pchCookie ); + var returnValue = _SetCookie( Self, hCookieContainer, str__pchHost.Pointer, str__pchUrl.Pointer, str__pchCookie.Pointer ); return returnValue; } @@ -276,12 +288,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamHTTP_SetHTTPRequestUserAgentInfo", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetHTTPRequestUserAgentInfo( IntPtr self, HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchUserAgentInfo ); + private static extern bool _SetHTTPRequestUserAgentInfo( IntPtr self, HTTPRequestHandle hRequest, IntPtr pchUserAgentInfo ); #endregion - internal bool SetHTTPRequestUserAgentInfo( HTTPRequestHandle hRequest, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchUserAgentInfo ) + internal bool SetHTTPRequestUserAgentInfo( HTTPRequestHandle hRequest, string pchUserAgentInfo ) { - var returnValue = _SetHTTPRequestUserAgentInfo( Self, hRequest, pchUserAgentInfo ); + using var str__pchUserAgentInfo = new Utf8StringToNative( pchUserAgentInfo ); + var returnValue = _SetHTTPRequestUserAgentInfo( Self, hRequest, str__pchUserAgentInfo.Pointer ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamInput.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamInput.cs index 3d1ab5227..b591f675a 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamInput.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamInput.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamInput : SteamInterface + internal unsafe partial class ISteamInput : SteamInterface { + public const string Version = "SteamInput006"; internal ISteamInput( bool IsGameServer ) { @@ -47,12 +48,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInput_SetInputActionManifestFilePath", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetInputActionManifestFilePath( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchInputActionManifestAbsolutePath ); + private static extern bool _SetInputActionManifestFilePath( IntPtr self, IntPtr pchInputActionManifestAbsolutePath ); #endregion - internal bool SetInputActionManifestFilePath( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchInputActionManifestAbsolutePath ) + internal bool SetInputActionManifestFilePath( string pchInputActionManifestAbsolutePath ) { - var returnValue = _SetInputActionManifestFilePath( Self, pchInputActionManifestAbsolutePath ); + using var str__pchInputActionManifestAbsolutePath = new Utf8StringToNative( pchInputActionManifestAbsolutePath ); + var returnValue = _SetInputActionManifestFilePath( Self, str__pchInputActionManifestAbsolutePath.Pointer ); return returnValue; } @@ -113,12 +115,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInput_GetActionSetHandle", CallingConvention = Platform.CC)] - private static extern InputActionSetHandle_t _GetActionSetHandle( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionSetName ); + private static extern InputActionSetHandle_t _GetActionSetHandle( IntPtr self, IntPtr pszActionSetName ); #endregion - internal InputActionSetHandle_t GetActionSetHandle( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionSetName ) + internal InputActionSetHandle_t GetActionSetHandle( string pszActionSetName ) { - var returnValue = _GetActionSetHandle( Self, pszActionSetName ); + using var str__pszActionSetName = new Utf8StringToNative( pszActionSetName ); + var returnValue = _GetActionSetHandle( Self, str__pszActionSetName.Pointer ); return returnValue; } @@ -186,12 +189,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInput_GetDigitalActionHandle", CallingConvention = Platform.CC)] - private static extern InputDigitalActionHandle_t _GetDigitalActionHandle( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionName ); + private static extern InputDigitalActionHandle_t _GetDigitalActionHandle( IntPtr self, IntPtr pszActionName ); #endregion - internal InputDigitalActionHandle_t GetDigitalActionHandle( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionName ) + internal InputDigitalActionHandle_t GetDigitalActionHandle( string pszActionName ) { - var returnValue = _GetDigitalActionHandle( Self, pszActionName ); + using var str__pszActionName = new Utf8StringToNative( pszActionName ); + var returnValue = _GetDigitalActionHandle( Self, str__pszActionName.Pointer ); return returnValue; } @@ -230,12 +234,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInput_GetAnalogActionHandle", CallingConvention = Platform.CC)] - private static extern InputAnalogActionHandle_t _GetAnalogActionHandle( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionName ); + private static extern InputAnalogActionHandle_t _GetAnalogActionHandle( IntPtr self, IntPtr pszActionName ); #endregion - internal InputAnalogActionHandle_t GetAnalogActionHandle( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszActionName ) + internal InputAnalogActionHandle_t GetAnalogActionHandle( string pszActionName ) { - var returnValue = _GetAnalogActionHandle( Self, pszActionName ); + using var str__pszActionName = new Utf8StringToNative( pszActionName ); + var returnValue = _GetAnalogActionHandle( Self, str__pszActionName.Pointer ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamInventory.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamInventory.cs index 5b4d20160..27a795f13 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamInventory.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamInventory.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamInventory : SteamInterface + internal unsafe partial class ISteamInventory : SteamInterface { + public const string Version = "STEAMINVENTORY_INTERFACE_V003"; internal ISteamInventory( bool IsGameServer ) { @@ -49,14 +50,16 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInventory_GetResultItemProperty", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetResultItemProperty( IntPtr self, SteamInventoryResult_t resultHandle, uint unItemIndex, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string? pchPropertyName, IntPtr pchValueBuffer, ref uint punValueBufferSizeOut ); + private static extern bool _GetResultItemProperty( IntPtr self, SteamInventoryResult_t resultHandle, uint unItemIndex, IntPtr pchPropertyName, IntPtr pchValueBuffer, ref uint punValueBufferSizeOut ); #endregion - internal bool GetResultItemProperty( SteamInventoryResult_t resultHandle, uint unItemIndex, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string? pchPropertyName, out string pchValueBuffer, ref uint punValueBufferSizeOut ) + internal bool GetResultItemProperty( SteamInventoryResult_t resultHandle, uint unItemIndex, string? pchPropertyName, out string pchValueBuffer ) { - using var mempchValueBuffer = Helpers.TakeMemory(); - var returnValue = _GetResultItemProperty( Self, resultHandle, unItemIndex, pchPropertyName, mempchValueBuffer, ref punValueBufferSizeOut ); - pchValueBuffer = Helpers.MemoryToString( mempchValueBuffer ); + using var str__pchPropertyName = new Utf8StringToNative( pchPropertyName ); + using var mem__pchValueBuffer = Helpers.TakeMemory(); + uint szpunValueBufferSizeOut = (1024 * 32); + var returnValue = _GetResultItemProperty( Self, resultHandle, unItemIndex, str__pchPropertyName.Pointer, mem__pchValueBuffer, ref szpunValueBufferSizeOut ); + pchValueBuffer = Helpers.MemoryToString( mem__pchValueBuffer ); return returnValue; } @@ -286,14 +289,16 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInventory_GetItemDefinitionProperty", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetItemDefinitionProperty( IntPtr self, InventoryDefId iDefinition, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string? pchPropertyName, IntPtr pchValueBuffer, ref uint punValueBufferSizeOut ); + private static extern bool _GetItemDefinitionProperty( IntPtr self, InventoryDefId iDefinition, IntPtr pchPropertyName, IntPtr pchValueBuffer, ref uint punValueBufferSizeOut ); #endregion - internal bool GetItemDefinitionProperty( InventoryDefId iDefinition, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string? pchPropertyName, out string pchValueBuffer, ref uint punValueBufferSizeOut ) + internal bool GetItemDefinitionProperty( InventoryDefId iDefinition, string? pchPropertyName, out string pchValueBuffer ) { - using var mempchValueBuffer = Helpers.TakeMemory(); - var returnValue = _GetItemDefinitionProperty( Self, iDefinition, pchPropertyName, mempchValueBuffer, ref punValueBufferSizeOut ); - pchValueBuffer = Helpers.MemoryToString( mempchValueBuffer ); + using var str__pchPropertyName = new Utf8StringToNative( pchPropertyName ); + using var mem__pchValueBuffer = Helpers.TakeMemory(); + uint szpunValueBufferSizeOut = (1024 * 32); + var returnValue = _GetItemDefinitionProperty( Self, iDefinition, str__pchPropertyName.Pointer, mem__pchValueBuffer, ref szpunValueBufferSizeOut ); + pchValueBuffer = Helpers.MemoryToString( mem__pchValueBuffer ); return returnValue; } @@ -391,60 +396,66 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInventory_RemoveProperty", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _RemoveProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName ); + private static extern bool _RemoveProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, IntPtr pchPropertyName ); #endregion - internal bool RemoveProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName ) + internal bool RemoveProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, string pchPropertyName ) { - var returnValue = _RemoveProperty( Self, handle, nItemID, pchPropertyName ); + using var str__pchPropertyName = new Utf8StringToNative( pchPropertyName ); + var returnValue = _RemoveProperty( Self, handle, nItemID, str__pchPropertyName.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInventory_SetPropertyString", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyValue ); + private static extern bool _SetProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, IntPtr pchPropertyName, IntPtr pchPropertyValue ); #endregion - internal bool SetProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyValue ) + internal bool SetProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, string pchPropertyName, string pchPropertyValue ) { - var returnValue = _SetProperty( Self, handle, nItemID, pchPropertyName, pchPropertyValue ); + using var str__pchPropertyName = new Utf8StringToNative( pchPropertyName ); + using var str__pchPropertyValue = new Utf8StringToNative( pchPropertyValue ); + var returnValue = _SetProperty( Self, handle, nItemID, str__pchPropertyName.Pointer, str__pchPropertyValue.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInventory_SetPropertyBool", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName, [MarshalAs( UnmanagedType.U1 )] bool bValue ); + private static extern bool _SetProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, IntPtr pchPropertyName, [MarshalAs( UnmanagedType.U1 )] bool bValue ); #endregion - internal bool SetProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName, [MarshalAs( UnmanagedType.U1 )] bool bValue ) + internal bool SetProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, string pchPropertyName, [MarshalAs( UnmanagedType.U1 )] bool bValue ) { - var returnValue = _SetProperty( Self, handle, nItemID, pchPropertyName, bValue ); + using var str__pchPropertyName = new Utf8StringToNative( pchPropertyName ); + var returnValue = _SetProperty( Self, handle, nItemID, str__pchPropertyName.Pointer, bValue ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInventory_SetPropertyInt64", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName, long nValue ); + private static extern bool _SetProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, IntPtr pchPropertyName, long nValue ); #endregion - internal bool SetProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName, long nValue ) + internal bool SetProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, string pchPropertyName, long nValue ) { - var returnValue = _SetProperty( Self, handle, nItemID, pchPropertyName, nValue ); + using var str__pchPropertyName = new Utf8StringToNative( pchPropertyName ); + var returnValue = _SetProperty( Self, handle, nItemID, str__pchPropertyName.Pointer, nValue ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInventory_SetPropertyFloat", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName, float flValue ); + private static extern bool _SetProperty( IntPtr self, SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, IntPtr pchPropertyName, float flValue ); #endregion - internal bool SetProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchPropertyName, float flValue ) + internal bool SetProperty( SteamInventoryUpdateHandle_t handle, InventoryItemId nItemID, string pchPropertyName, float flValue ) { - var returnValue = _SetProperty( Self, handle, nItemID, pchPropertyName, flValue ); + using var str__pchPropertyName = new Utf8StringToNative( pchPropertyName ); + var returnValue = _SetProperty( Self, handle, nItemID, str__pchPropertyName.Pointer, flValue ); return returnValue; } @@ -463,12 +474,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamInventory_InspectItem", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _InspectItem( IntPtr self, ref SteamInventoryResult_t pResultHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchItemToken ); + private static extern bool _InspectItem( IntPtr self, ref SteamInventoryResult_t pResultHandle, IntPtr pchItemToken ); #endregion - internal bool InspectItem( ref SteamInventoryResult_t pResultHandle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchItemToken ) + internal bool InspectItem( ref SteamInventoryResult_t pResultHandle, string pchItemToken ) { - var returnValue = _InspectItem( Self, ref pResultHandle, pchItemToken ); + using var str__pchItemToken = new Utf8StringToNative( pchItemToken ); + var returnValue = _InspectItem( Self, ref pResultHandle, str__pchItemToken.Pointer ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmaking.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmaking.cs index 801d41086..8d952d90d 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmaking.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmaking.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamMatchmaking : SteamInterface + internal unsafe partial class ISteamMatchmaking : SteamInterface { + public const string Version = "SteamMatchMaking009"; internal ISteamMatchmaking( bool IsGameServer ) { @@ -79,32 +80,36 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmaking_AddRequestLobbyListStringFilter", CallingConvention = Platform.CC)] - private static extern void _AddRequestLobbyListStringFilter( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKeyToMatch, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValueToMatch, LobbyComparison eComparisonType ); + private static extern void _AddRequestLobbyListStringFilter( IntPtr self, IntPtr pchKeyToMatch, IntPtr pchValueToMatch, LobbyComparison eComparisonType ); #endregion - internal void AddRequestLobbyListStringFilter( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKeyToMatch, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValueToMatch, LobbyComparison eComparisonType ) + internal void AddRequestLobbyListStringFilter( string pchKeyToMatch, string pchValueToMatch, LobbyComparison eComparisonType ) { - _AddRequestLobbyListStringFilter( Self, pchKeyToMatch, pchValueToMatch, eComparisonType ); + using var str__pchKeyToMatch = new Utf8StringToNative( pchKeyToMatch ); + using var str__pchValueToMatch = new Utf8StringToNative( pchValueToMatch ); + _AddRequestLobbyListStringFilter( Self, str__pchKeyToMatch.Pointer, str__pchValueToMatch.Pointer, eComparisonType ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmaking_AddRequestLobbyListNumericalFilter", CallingConvention = Platform.CC)] - private static extern void _AddRequestLobbyListNumericalFilter( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKeyToMatch, int nValueToMatch, LobbyComparison eComparisonType ); + private static extern void _AddRequestLobbyListNumericalFilter( IntPtr self, IntPtr pchKeyToMatch, int nValueToMatch, LobbyComparison eComparisonType ); #endregion - internal void AddRequestLobbyListNumericalFilter( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKeyToMatch, int nValueToMatch, LobbyComparison eComparisonType ) + internal void AddRequestLobbyListNumericalFilter( string pchKeyToMatch, int nValueToMatch, LobbyComparison eComparisonType ) { - _AddRequestLobbyListNumericalFilter( Self, pchKeyToMatch, nValueToMatch, eComparisonType ); + using var str__pchKeyToMatch = new Utf8StringToNative( pchKeyToMatch ); + _AddRequestLobbyListNumericalFilter( Self, str__pchKeyToMatch.Pointer, nValueToMatch, eComparisonType ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmaking_AddRequestLobbyListNearValueFilter", CallingConvention = Platform.CC)] - private static extern void _AddRequestLobbyListNearValueFilter( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKeyToMatch, int nValueToBeCloseTo ); + private static extern void _AddRequestLobbyListNearValueFilter( IntPtr self, IntPtr pchKeyToMatch, int nValueToBeCloseTo ); #endregion - internal void AddRequestLobbyListNearValueFilter( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKeyToMatch, int nValueToBeCloseTo ) + internal void AddRequestLobbyListNearValueFilter( string pchKeyToMatch, int nValueToBeCloseTo ) { - _AddRequestLobbyListNearValueFilter( Self, pchKeyToMatch, nValueToBeCloseTo ); + using var str__pchKeyToMatch = new Utf8StringToNative( pchKeyToMatch ); + _AddRequestLobbyListNearValueFilter( Self, str__pchKeyToMatch.Pointer, nValueToBeCloseTo ); } #region FunctionMeta @@ -226,24 +231,27 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmaking_GetLobbyData", CallingConvention = Platform.CC)] - private static extern Utf8StringPointer _GetLobbyData( IntPtr self, SteamId steamIDLobby, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ); + private static extern Utf8StringPointer _GetLobbyData( IntPtr self, SteamId steamIDLobby, IntPtr pchKey ); #endregion - internal string GetLobbyData( SteamId steamIDLobby, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ) + internal string GetLobbyData( SteamId steamIDLobby, string pchKey ) { - var returnValue = _GetLobbyData( Self, steamIDLobby, pchKey ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + var returnValue = _GetLobbyData( Self, steamIDLobby, str__pchKey.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmaking_SetLobbyData", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetLobbyData( IntPtr self, SteamId steamIDLobby, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ); + private static extern bool _SetLobbyData( IntPtr self, SteamId steamIDLobby, IntPtr pchKey, IntPtr pchValue ); #endregion - internal bool SetLobbyData( SteamId steamIDLobby, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ) + internal bool SetLobbyData( SteamId steamIDLobby, string pchKey, string pchValue ) { - var returnValue = _SetLobbyData( Self, steamIDLobby, pchKey, pchValue ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + using var str__pchValue = new Utf8StringToNative( pchValue ); + var returnValue = _SetLobbyData( Self, steamIDLobby, str__pchKey.Pointer, str__pchValue.Pointer ); return returnValue; } @@ -266,45 +274,49 @@ namespace Steamworks #endregion internal bool GetLobbyDataByIndex( SteamId steamIDLobby, int iLobbyData, out string pchKey, out string pchValue ) { - using var mempchKey = Helpers.TakeMemory(); - using var mempchValue = Helpers.TakeMemory(); - var returnValue = _GetLobbyDataByIndex( Self, steamIDLobby, iLobbyData, mempchKey, (1024 * 32), mempchValue, (1024 * 32) ); - pchKey = Helpers.MemoryToString( mempchKey ); - pchValue = Helpers.MemoryToString( mempchValue ); + using var mem__pchKey = Helpers.TakeMemory(); + using var mem__pchValue = Helpers.TakeMemory(); + var returnValue = _GetLobbyDataByIndex( Self, steamIDLobby, iLobbyData, mem__pchKey, (1024 * 32), mem__pchValue, (1024 * 32) ); + pchKey = Helpers.MemoryToString( mem__pchKey ); + pchValue = Helpers.MemoryToString( mem__pchValue ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmaking_DeleteLobbyData", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _DeleteLobbyData( IntPtr self, SteamId steamIDLobby, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ); + private static extern bool _DeleteLobbyData( IntPtr self, SteamId steamIDLobby, IntPtr pchKey ); #endregion - internal bool DeleteLobbyData( SteamId steamIDLobby, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ) + internal bool DeleteLobbyData( SteamId steamIDLobby, string pchKey ) { - var returnValue = _DeleteLobbyData( Self, steamIDLobby, pchKey ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + var returnValue = _DeleteLobbyData( Self, steamIDLobby, str__pchKey.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmaking_GetLobbyMemberData", CallingConvention = Platform.CC)] - private static extern Utf8StringPointer _GetLobbyMemberData( IntPtr self, SteamId steamIDLobby, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ); + private static extern Utf8StringPointer _GetLobbyMemberData( IntPtr self, SteamId steamIDLobby, SteamId steamIDUser, IntPtr pchKey ); #endregion - internal string GetLobbyMemberData( SteamId steamIDLobby, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ) + internal string GetLobbyMemberData( SteamId steamIDLobby, SteamId steamIDUser, string pchKey ) { - var returnValue = _GetLobbyMemberData( Self, steamIDLobby, steamIDUser, pchKey ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + var returnValue = _GetLobbyMemberData( Self, steamIDLobby, steamIDUser, str__pchKey.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmaking_SetLobbyMemberData", CallingConvention = Platform.CC)] - private static extern void _SetLobbyMemberData( IntPtr self, SteamId steamIDLobby, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ); + private static extern void _SetLobbyMemberData( IntPtr self, SteamId steamIDLobby, IntPtr pchKey, IntPtr pchValue ); #endregion - internal void SetLobbyMemberData( SteamId steamIDLobby, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ) + internal void SetLobbyMemberData( SteamId steamIDLobby, string pchKey, string pchValue ) { - _SetLobbyMemberData( Self, steamIDLobby, pchKey, pchValue ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + using var str__pchValue = new Utf8StringToNative( pchValue ); + _SetLobbyMemberData( Self, steamIDLobby, str__pchKey.Pointer, str__pchValue.Pointer ); } #region FunctionMeta diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingPingResponse.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingPingResponse.cs index 0306b76f6..059189f68 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingPingResponse.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingPingResponse.cs @@ -7,9 +7,8 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamMatchmakingPingResponse : SteamInterface + internal unsafe partial class ISteamMatchmakingPingResponse : SteamInterface { - internal ISteamMatchmakingPingResponse( bool IsGameServer ) { SetupInterface( IsGameServer ); diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingPlayersResponse.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingPlayersResponse.cs index a5ed92691..bd57a7d0a 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingPlayersResponse.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingPlayersResponse.cs @@ -7,9 +7,8 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamMatchmakingPlayersResponse : SteamInterface + internal unsafe partial class ISteamMatchmakingPlayersResponse : SteamInterface { - internal ISteamMatchmakingPlayersResponse( bool IsGameServer ) { SetupInterface( IsGameServer ); @@ -17,12 +16,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmakingPlayersResponse_AddPlayerToList", CallingConvention = Platform.CC)] - private static extern void _AddPlayerToList( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, int nScore, float flTimePlayed ); + private static extern void _AddPlayerToList( IntPtr self, IntPtr pchName, int nScore, float flTimePlayed ); #endregion - internal void AddPlayerToList( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, int nScore, float flTimePlayed ) + internal void AddPlayerToList( string pchName, int nScore, float flTimePlayed ) { - _AddPlayerToList( Self, pchName, nScore, flTimePlayed ); + using var str__pchName = new Utf8StringToNative( pchName ); + _AddPlayerToList( Self, str__pchName.Pointer, nScore, flTimePlayed ); } #region FunctionMeta diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingRulesResponse.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingRulesResponse.cs index 78507b9ea..7bee06ba8 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingRulesResponse.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingRulesResponse.cs @@ -7,9 +7,8 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamMatchmakingRulesResponse : SteamInterface + internal unsafe partial class ISteamMatchmakingRulesResponse : SteamInterface { - internal ISteamMatchmakingRulesResponse( bool IsGameServer ) { SetupInterface( IsGameServer ); @@ -17,12 +16,14 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamMatchmakingRulesResponse_RulesResponded", CallingConvention = Platform.CC)] - private static extern void _RulesResponded( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchRule, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ); + private static extern void _RulesResponded( IntPtr self, IntPtr pchRule, IntPtr pchValue ); #endregion - internal void RulesResponded( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchRule, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ) + internal void RulesResponded( string pchRule, string pchValue ) { - _RulesResponded( Self, pchRule, pchValue ); + using var str__pchRule = new Utf8StringToNative( pchRule ); + using var str__pchValue = new Utf8StringToNative( pchValue ); + _RulesResponded( Self, str__pchRule.Pointer, str__pchValue.Pointer ); } #region FunctionMeta diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServerListResponse.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServerListResponse.cs index 8fd0a9e98..68a4a55ff 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServerListResponse.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServerListResponse.cs @@ -7,9 +7,8 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamMatchmakingServerListResponse : SteamInterface + internal unsafe partial class ISteamMatchmakingServerListResponse : SteamInterface { - internal ISteamMatchmakingServerListResponse( bool IsGameServer ) { SetupInterface( IsGameServer ); diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs index 3eb098c00..93f582b03 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamMatchmakingServers : SteamInterface + internal unsafe partial class ISteamMatchmakingServers : SteamInterface { + public const string Version = "SteamMatchMakingServers002"; internal ISteamMatchmakingServers( bool IsGameServer ) { @@ -25,37 +26,9 @@ namespace Steamworks private static extern HServerListRequest _RequestInternetServerList( IntPtr self, AppId iApp, IntPtr ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); #endregion - internal HServerListRequest RequestInternetServerList( AppId iApp, MatchMakingKeyValuePair[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) + internal HServerListRequest RequestInternetServerList( AppId iApp, IntPtr ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { - int numPtrs = ppchFilters.Length; - if (numPtrs <= 0) { numPtrs = 1; } - - IntPtr[] filterPtrs = new IntPtr[numPtrs]; - GCHandle?[] filterHandles = new GCHandle?[numPtrs]; - for (int i=0;i CreateBeacon( uint unOpenSlots, /* ref */ SteamPartyBeaconLocation_t pBeaconLocation, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchConnectString, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchMetadata ) + internal CallResult CreateBeacon( uint unOpenSlots, /* ref */ SteamPartyBeaconLocation_t pBeaconLocation, string pchConnectString, string pchMetadata ) { - var returnValue = _CreateBeacon( Self, unOpenSlots, ref pBeaconLocation, pchConnectString, pchMetadata ); + using var str__pchConnectString = new Utf8StringToNative( pchConnectString ); + using var str__pchMetadata = new Utf8StringToNative( pchMetadata ); + var returnValue = _CreateBeacon( Self, unOpenSlots, ref pBeaconLocation, str__pchConnectString.Pointer, str__pchMetadata.Pointer ); return new CallResult( returnValue, IsServer ); } @@ -153,9 +156,9 @@ namespace Steamworks #endregion internal bool GetBeaconLocationData( SteamPartyBeaconLocation_t BeaconLocation, SteamPartyBeaconLocationData eData, out string pchDataStringOut ) { - using var mempchDataStringOut = Helpers.TakeMemory(); - var returnValue = _GetBeaconLocationData( Self, BeaconLocation, eData, mempchDataStringOut, (1024 * 32) ); - pchDataStringOut = Helpers.MemoryToString( mempchDataStringOut ); + using var mem__pchDataStringOut = Helpers.TakeMemory(); + var returnValue = _GetBeaconLocationData( Self, BeaconLocation, eData, mem__pchDataStringOut, (1024 * 32) ); + pchDataStringOut = Helpers.MemoryToString( mem__pchDataStringOut ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamRemotePlay.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamRemotePlay.cs index 6ad42043c..c744b158a 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamRemotePlay.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamRemotePlay.cs @@ -7,17 +7,18 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamRemotePlay : SteamInterface + internal unsafe partial class ISteamRemotePlay : SteamInterface { + public const string Version = "STEAMREMOTEPLAY_INTERFACE_VERSION002"; internal ISteamRemotePlay( bool IsGameServer ) { SetupInterface( IsGameServer ); } - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamRemotePlay_v001", CallingConvention = Platform.CC)] - internal static extern IntPtr SteamAPI_SteamRemotePlay_v001(); - public override IntPtr GetUserInterfacePointer() => SteamAPI_SteamRemotePlay_v001(); + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamRemotePlay_v002", CallingConvention = Platform.CC)] + internal static extern IntPtr SteamAPI_SteamRemotePlay_v002(); + public override IntPtr GetUserInterfacePointer() => SteamAPI_SteamRemotePlay_v002(); #region FunctionMeta @@ -87,6 +88,18 @@ namespace Steamworks return returnValue; } + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemotePlay_BStartRemotePlayTogether", CallingConvention = Platform.CC)] + [return: MarshalAs( UnmanagedType.I1 )] + private static extern bool _BStartRemotePlayTogether( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bShowOverlay ); + + #endregion + internal bool BStartRemotePlayTogether( [MarshalAs( UnmanagedType.U1 )] bool bShowOverlay ) + { + var returnValue = _BStartRemotePlayTogether( Self, bShowOverlay ); + return returnValue; + } + #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemotePlay_BSendRemotePlayTogetherInvite", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamRemoteStorage.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamRemoteStorage.cs index c1a872115..c22f50253 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamRemoteStorage.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamRemoteStorage.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamRemoteStorage : SteamInterface + internal unsafe partial class ISteamRemoteStorage : SteamInterface { + public const string Version = "STEAMREMOTESTORAGE_INTERFACE_VERSION016"; internal ISteamRemoteStorage( bool IsGameServer ) { @@ -23,45 +24,49 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FileWrite", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _FileWrite( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, IntPtr pvData, int cubData ); + private static extern bool _FileWrite( IntPtr self, IntPtr pchFile, IntPtr pvData, int cubData ); #endregion - internal bool FileWrite( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, IntPtr pvData, int cubData ) + internal bool FileWrite( string pchFile, IntPtr pvData, int cubData ) { - var returnValue = _FileWrite( Self, pchFile, pvData, cubData ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FileWrite( Self, str__pchFile.Pointer, pvData, cubData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FileRead", CallingConvention = Platform.CC)] - private static extern int _FileRead( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, IntPtr pvData, int cubDataToRead ); + private static extern int _FileRead( IntPtr self, IntPtr pchFile, IntPtr pvData, int cubDataToRead ); #endregion - internal int FileRead( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, IntPtr pvData, int cubDataToRead ) + internal int FileRead( string pchFile, IntPtr pvData, int cubDataToRead ) { - var returnValue = _FileRead( Self, pchFile, pvData, cubDataToRead ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FileRead( Self, str__pchFile.Pointer, pvData, cubDataToRead ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FileWriteAsync", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _FileWriteAsync( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, IntPtr pvData, uint cubData ); + private static extern SteamAPICall_t _FileWriteAsync( IntPtr self, IntPtr pchFile, IntPtr pvData, uint cubData ); #endregion - internal CallResult FileWriteAsync( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, IntPtr pvData, uint cubData ) + internal CallResult FileWriteAsync( string pchFile, IntPtr pvData, uint cubData ) { - var returnValue = _FileWriteAsync( Self, pchFile, pvData, cubData ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FileWriteAsync( Self, str__pchFile.Pointer, pvData, cubData ); return new CallResult( returnValue, IsServer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FileReadAsync", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _FileReadAsync( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, uint nOffset, uint cubToRead ); + private static extern SteamAPICall_t _FileReadAsync( IntPtr self, IntPtr pchFile, uint nOffset, uint cubToRead ); #endregion - internal CallResult FileReadAsync( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, uint nOffset, uint cubToRead ) + internal CallResult FileReadAsync( string pchFile, uint nOffset, uint cubToRead ) { - var returnValue = _FileReadAsync( Self, pchFile, nOffset, cubToRead ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FileReadAsync( Self, str__pchFile.Pointer, nOffset, cubToRead ); return new CallResult( returnValue, IsServer ); } @@ -80,58 +85,63 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FileForget", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _FileForget( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ); + private static extern bool _FileForget( IntPtr self, IntPtr pchFile ); #endregion - internal bool FileForget( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ) + internal bool FileForget( string pchFile ) { - var returnValue = _FileForget( Self, pchFile ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FileForget( Self, str__pchFile.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FileDelete", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _FileDelete( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ); + private static extern bool _FileDelete( IntPtr self, IntPtr pchFile ); #endregion - internal bool FileDelete( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ) + internal bool FileDelete( string pchFile ) { - var returnValue = _FileDelete( Self, pchFile ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FileDelete( Self, str__pchFile.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FileShare", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _FileShare( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ); + private static extern SteamAPICall_t _FileShare( IntPtr self, IntPtr pchFile ); #endregion - internal CallResult FileShare( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ) + internal CallResult FileShare( string pchFile ) { - var returnValue = _FileShare( Self, pchFile ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FileShare( Self, str__pchFile.Pointer ); return new CallResult( returnValue, IsServer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_SetSyncPlatforms", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetSyncPlatforms( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, RemoteStoragePlatform eRemoteStoragePlatform ); + private static extern bool _SetSyncPlatforms( IntPtr self, IntPtr pchFile, RemoteStoragePlatform eRemoteStoragePlatform ); #endregion - internal bool SetSyncPlatforms( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile, RemoteStoragePlatform eRemoteStoragePlatform ) + internal bool SetSyncPlatforms( string pchFile, RemoteStoragePlatform eRemoteStoragePlatform ) { - var returnValue = _SetSyncPlatforms( Self, pchFile, eRemoteStoragePlatform ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _SetSyncPlatforms( Self, str__pchFile.Pointer, eRemoteStoragePlatform ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FileWriteStreamOpen", CallingConvention = Platform.CC)] - private static extern UGCFileWriteStreamHandle_t _FileWriteStreamOpen( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ); + private static extern UGCFileWriteStreamHandle_t _FileWriteStreamOpen( IntPtr self, IntPtr pchFile ); #endregion - internal UGCFileWriteStreamHandle_t FileWriteStreamOpen( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ) + internal UGCFileWriteStreamHandle_t FileWriteStreamOpen( string pchFile ) { - var returnValue = _FileWriteStreamOpen( Self, pchFile ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FileWriteStreamOpen( Self, str__pchFile.Pointer ); return returnValue; } @@ -174,57 +184,62 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FileExists", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _FileExists( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ); + private static extern bool _FileExists( IntPtr self, IntPtr pchFile ); #endregion - internal bool FileExists( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ) + internal bool FileExists( string pchFile ) { - var returnValue = _FileExists( Self, pchFile ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FileExists( Self, str__pchFile.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_FilePersisted", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _FilePersisted( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ); + private static extern bool _FilePersisted( IntPtr self, IntPtr pchFile ); #endregion - internal bool FilePersisted( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ) + internal bool FilePersisted( string pchFile ) { - var returnValue = _FilePersisted( Self, pchFile ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _FilePersisted( Self, str__pchFile.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_GetFileSize", CallingConvention = Platform.CC)] - private static extern int _GetFileSize( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ); + private static extern int _GetFileSize( IntPtr self, IntPtr pchFile ); #endregion - internal int GetFileSize( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ) + internal int GetFileSize( string pchFile ) { - var returnValue = _GetFileSize( Self, pchFile ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _GetFileSize( Self, str__pchFile.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_GetFileTimestamp", CallingConvention = Platform.CC)] - private static extern long _GetFileTimestamp( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ); + private static extern long _GetFileTimestamp( IntPtr self, IntPtr pchFile ); #endregion - internal long GetFileTimestamp( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ) + internal long GetFileTimestamp( string pchFile ) { - var returnValue = _GetFileTimestamp( Self, pchFile ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _GetFileTimestamp( Self, str__pchFile.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_GetSyncPlatforms", CallingConvention = Platform.CC)] - private static extern RemoteStoragePlatform _GetSyncPlatforms( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ); + private static extern RemoteStoragePlatform _GetSyncPlatforms( IntPtr self, IntPtr pchFile ); #endregion - internal RemoteStoragePlatform GetSyncPlatforms( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFile ) + internal RemoteStoragePlatform GetSyncPlatforms( string pchFile ) { - var returnValue = _GetSyncPlatforms( Self, pchFile ); + using var str__pchFile = new Utf8StringToNative( pchFile ); + var returnValue = _GetSyncPlatforms( Self, str__pchFile.Pointer ); return returnValue; } @@ -366,12 +381,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamRemoteStorage_UGCDownloadToLocation", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _UGCDownloadToLocation( IntPtr self, UGCHandle_t hContent, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLocation, uint unPriority ); + private static extern SteamAPICall_t _UGCDownloadToLocation( IntPtr self, UGCHandle_t hContent, IntPtr pchLocation, uint unPriority ); #endregion - internal CallResult UGCDownloadToLocation( UGCHandle_t hContent, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLocation, uint unPriority ) + internal CallResult UGCDownloadToLocation( UGCHandle_t hContent, string pchLocation, uint unPriority ) { - var returnValue = _UGCDownloadToLocation( Self, hContent, pchLocation, unPriority ); + using var str__pchLocation = new Utf8StringToNative( pchLocation ); + var returnValue = _UGCDownloadToLocation( Self, hContent, str__pchLocation.Pointer, unPriority ); return new CallResult( returnValue, IsServer ); } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamScreenshots.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamScreenshots.cs index ff9380a3f..a341eb2be 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamScreenshots.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamScreenshots.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamScreenshots : SteamInterface + internal unsafe partial class ISteamScreenshots : SteamInterface { + public const string Version = "STEAMSCREENSHOTS_INTERFACE_VERSION003"; internal ISteamScreenshots( bool IsGameServer ) { @@ -33,12 +34,14 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamScreenshots_AddScreenshotToLibrary", CallingConvention = Platform.CC)] - private static extern ScreenshotHandle _AddScreenshotToLibrary( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFilename, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchThumbnailFilename, int nWidth, int nHeight ); + private static extern ScreenshotHandle _AddScreenshotToLibrary( IntPtr self, IntPtr pchFilename, IntPtr pchThumbnailFilename, int nWidth, int nHeight ); #endregion - internal ScreenshotHandle AddScreenshotToLibrary( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFilename, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchThumbnailFilename, int nWidth, int nHeight ) + internal ScreenshotHandle AddScreenshotToLibrary( string pchFilename, string pchThumbnailFilename, int nWidth, int nHeight ) { - var returnValue = _AddScreenshotToLibrary( Self, pchFilename, pchThumbnailFilename, nWidth, nHeight ); + using var str__pchFilename = new Utf8StringToNative( pchFilename ); + using var str__pchThumbnailFilename = new Utf8StringToNative( pchThumbnailFilename ); + var returnValue = _AddScreenshotToLibrary( Self, str__pchFilename.Pointer, str__pchThumbnailFilename.Pointer, nWidth, nHeight ); return returnValue; } @@ -65,12 +68,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamScreenshots_SetLocation", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetLocation( IntPtr self, ScreenshotHandle hScreenshot, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLocation ); + private static extern bool _SetLocation( IntPtr self, ScreenshotHandle hScreenshot, IntPtr pchLocation ); #endregion - internal bool SetLocation( ScreenshotHandle hScreenshot, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLocation ) + internal bool SetLocation( ScreenshotHandle hScreenshot, string pchLocation ) { - var returnValue = _SetLocation( Self, hScreenshot, pchLocation ); + using var str__pchLocation = new Utf8StringToNative( pchLocation ); + var returnValue = _SetLocation( Self, hScreenshot, str__pchLocation.Pointer ); return returnValue; } @@ -112,12 +116,14 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamScreenshots_AddVRScreenshotToLibrary", CallingConvention = Platform.CC)] - private static extern ScreenshotHandle _AddVRScreenshotToLibrary( IntPtr self, VRScreenshotType eType, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFilename, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVRFilename ); + private static extern ScreenshotHandle _AddVRScreenshotToLibrary( IntPtr self, VRScreenshotType eType, IntPtr pchFilename, IntPtr pchVRFilename ); #endregion - internal ScreenshotHandle AddVRScreenshotToLibrary( VRScreenshotType eType, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchFilename, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchVRFilename ) + internal ScreenshotHandle AddVRScreenshotToLibrary( VRScreenshotType eType, string pchFilename, string pchVRFilename ) { - var returnValue = _AddVRScreenshotToLibrary( Self, eType, pchFilename, pchVRFilename ); + using var str__pchFilename = new Utf8StringToNative( pchFilename ); + using var str__pchVRFilename = new Utf8StringToNative( pchVRFilename ); + var returnValue = _AddVRScreenshotToLibrary( Self, eType, str__pchFilename.Pointer, str__pchVRFilename.Pointer ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamTimeline.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamTimeline.cs new file mode 100644 index 000000000..8be80a7cc --- /dev/null +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamTimeline.cs @@ -0,0 +1,231 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using Steamworks.Data; + + +namespace Steamworks +{ + internal unsafe partial class ISteamTimeline : SteamInterface + { + public const string Version = "STEAMTIMELINE_INTERFACE_V004"; + + internal ISteamTimeline( bool IsGameServer ) + { + SetupInterface( IsGameServer ); + } + + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamTimeline_v004", CallingConvention = Platform.CC)] + internal static extern IntPtr SteamAPI_SteamTimeline_v004(); + public override IntPtr GetUserInterfacePointer() => SteamAPI_SteamTimeline_v004(); + + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_SetTimelineTooltip", CallingConvention = Platform.CC)] + private static extern void _SetTimelineTooltip( IntPtr self, IntPtr pchDescription, float flTimeDelta ); + + #endregion + internal void SetTimelineTooltip( string pchDescription, float flTimeDelta ) + { + using var str__pchDescription = new Utf8StringToNative( pchDescription ); + _SetTimelineTooltip( Self, str__pchDescription.Pointer, flTimeDelta ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_ClearTimelineTooltip", CallingConvention = Platform.CC)] + private static extern void _ClearTimelineTooltip( IntPtr self, float flTimeDelta ); + + #endregion + internal void ClearTimelineTooltip( float flTimeDelta ) + { + _ClearTimelineTooltip( Self, flTimeDelta ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_SetTimelineGameMode", CallingConvention = Platform.CC)] + private static extern void _SetTimelineGameMode( IntPtr self, TimelineGameMode eMode ); + + #endregion + internal void SetTimelineGameMode( TimelineGameMode eMode ) + { + _SetTimelineGameMode( Self, eMode ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_AddInstantaneousTimelineEvent", CallingConvention = Platform.CC)] + private static extern TimelineEventHandle _AddInstantaneousTimelineEvent( IntPtr self, IntPtr pchTitle, IntPtr pchDescription, IntPtr pchIcon, uint unIconPriority, float flStartOffsetSeconds, TimelineEventClipPriority ePossibleClip ); + + #endregion + internal TimelineEventHandle AddInstantaneousTimelineEvent( string pchTitle, string pchDescription, string pchIcon, uint unIconPriority, float flStartOffsetSeconds, TimelineEventClipPriority ePossibleClip ) + { + using var str__pchTitle = new Utf8StringToNative( pchTitle ); + using var str__pchDescription = new Utf8StringToNative( pchDescription ); + using var str__pchIcon = new Utf8StringToNative( pchIcon ); + var returnValue = _AddInstantaneousTimelineEvent( Self, str__pchTitle.Pointer, str__pchDescription.Pointer, str__pchIcon.Pointer, unIconPriority, flStartOffsetSeconds, ePossibleClip ); + return returnValue; + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_AddRangeTimelineEvent", CallingConvention = Platform.CC)] + private static extern TimelineEventHandle _AddRangeTimelineEvent( IntPtr self, IntPtr pchTitle, IntPtr pchDescription, IntPtr pchIcon, uint unIconPriority, float flStartOffsetSeconds, float flDuration, TimelineEventClipPriority ePossibleClip ); + + #endregion + internal TimelineEventHandle AddRangeTimelineEvent( string pchTitle, string pchDescription, string pchIcon, uint unIconPriority, float flStartOffsetSeconds, float flDuration, TimelineEventClipPriority ePossibleClip ) + { + using var str__pchTitle = new Utf8StringToNative( pchTitle ); + using var str__pchDescription = new Utf8StringToNative( pchDescription ); + using var str__pchIcon = new Utf8StringToNative( pchIcon ); + var returnValue = _AddRangeTimelineEvent( Self, str__pchTitle.Pointer, str__pchDescription.Pointer, str__pchIcon.Pointer, unIconPriority, flStartOffsetSeconds, flDuration, ePossibleClip ); + return returnValue; + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_StartRangeTimelineEvent", CallingConvention = Platform.CC)] + private static extern TimelineEventHandle _StartRangeTimelineEvent( IntPtr self, IntPtr pchTitle, IntPtr pchDescription, IntPtr pchIcon, uint unPriority, float flStartOffsetSeconds, TimelineEventClipPriority ePossibleClip ); + + #endregion + internal TimelineEventHandle StartRangeTimelineEvent( string pchTitle, string pchDescription, string pchIcon, uint unPriority, float flStartOffsetSeconds, TimelineEventClipPriority ePossibleClip ) + { + using var str__pchTitle = new Utf8StringToNative( pchTitle ); + using var str__pchDescription = new Utf8StringToNative( pchDescription ); + using var str__pchIcon = new Utf8StringToNative( pchIcon ); + var returnValue = _StartRangeTimelineEvent( Self, str__pchTitle.Pointer, str__pchDescription.Pointer, str__pchIcon.Pointer, unPriority, flStartOffsetSeconds, ePossibleClip ); + return returnValue; + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_UpdateRangeTimelineEvent", CallingConvention = Platform.CC)] + private static extern void _UpdateRangeTimelineEvent( IntPtr self, TimelineEventHandle ulEvent, IntPtr pchTitle, IntPtr pchDescription, IntPtr pchIcon, uint unPriority, TimelineEventClipPriority ePossibleClip ); + + #endregion + internal void UpdateRangeTimelineEvent( TimelineEventHandle ulEvent, string pchTitle, string pchDescription, string pchIcon, uint unPriority, TimelineEventClipPriority ePossibleClip ) + { + using var str__pchTitle = new Utf8StringToNative( pchTitle ); + using var str__pchDescription = new Utf8StringToNative( pchDescription ); + using var str__pchIcon = new Utf8StringToNative( pchIcon ); + _UpdateRangeTimelineEvent( Self, ulEvent, str__pchTitle.Pointer, str__pchDescription.Pointer, str__pchIcon.Pointer, unPriority, ePossibleClip ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_EndRangeTimelineEvent", CallingConvention = Platform.CC)] + private static extern void _EndRangeTimelineEvent( IntPtr self, TimelineEventHandle ulEvent, float flEndOffsetSeconds ); + + #endregion + internal void EndRangeTimelineEvent( TimelineEventHandle ulEvent, float flEndOffsetSeconds ) + { + _EndRangeTimelineEvent( Self, ulEvent, flEndOffsetSeconds ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_RemoveTimelineEvent", CallingConvention = Platform.CC)] + private static extern void _RemoveTimelineEvent( IntPtr self, TimelineEventHandle ulEvent ); + + #endregion + internal void RemoveTimelineEvent( TimelineEventHandle ulEvent ) + { + _RemoveTimelineEvent( Self, ulEvent ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_DoesEventRecordingExist", CallingConvention = Platform.CC)] + private static extern SteamAPICall_t _DoesEventRecordingExist( IntPtr self, TimelineEventHandle ulEvent ); + + #endregion + internal CallResult DoesEventRecordingExist( TimelineEventHandle ulEvent ) + { + var returnValue = _DoesEventRecordingExist( Self, ulEvent ); + return new CallResult( returnValue, IsServer ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_StartGamePhase", CallingConvention = Platform.CC)] + private static extern void _StartGamePhase( IntPtr self ); + + #endregion + internal void StartGamePhase() + { + _StartGamePhase( Self ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_EndGamePhase", CallingConvention = Platform.CC)] + private static extern void _EndGamePhase( IntPtr self ); + + #endregion + internal void EndGamePhase() + { + _EndGamePhase( Self ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_SetGamePhaseID", CallingConvention = Platform.CC)] + private static extern void _SetGamePhaseID( IntPtr self, IntPtr pchPhaseID ); + + #endregion + internal void SetGamePhaseID( string pchPhaseID ) + { + using var str__pchPhaseID = new Utf8StringToNative( pchPhaseID ); + _SetGamePhaseID( Self, str__pchPhaseID.Pointer ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_DoesGamePhaseRecordingExist", CallingConvention = Platform.CC)] + private static extern SteamAPICall_t _DoesGamePhaseRecordingExist( IntPtr self, IntPtr pchPhaseID ); + + #endregion + internal CallResult DoesGamePhaseRecordingExist( string pchPhaseID ) + { + using var str__pchPhaseID = new Utf8StringToNative( pchPhaseID ); + var returnValue = _DoesGamePhaseRecordingExist( Self, str__pchPhaseID.Pointer ); + return new CallResult( returnValue, IsServer ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_AddGamePhaseTag", CallingConvention = Platform.CC)] + private static extern void _AddGamePhaseTag( IntPtr self, IntPtr pchTagName, IntPtr pchTagIcon, IntPtr pchTagGroup, uint unPriority ); + + #endregion + internal void AddGamePhaseTag( string pchTagName, string pchTagIcon, string pchTagGroup, uint unPriority ) + { + using var str__pchTagName = new Utf8StringToNative( pchTagName ); + using var str__pchTagIcon = new Utf8StringToNative( pchTagIcon ); + using var str__pchTagGroup = new Utf8StringToNative( pchTagGroup ); + _AddGamePhaseTag( Self, str__pchTagName.Pointer, str__pchTagIcon.Pointer, str__pchTagGroup.Pointer, unPriority ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_SetGamePhaseAttribute", CallingConvention = Platform.CC)] + private static extern void _SetGamePhaseAttribute( IntPtr self, IntPtr pchAttributeGroup, IntPtr pchAttributeValue, uint unPriority ); + + #endregion + internal void SetGamePhaseAttribute( string pchAttributeGroup, string pchAttributeValue, uint unPriority ) + { + using var str__pchAttributeGroup = new Utf8StringToNative( pchAttributeGroup ); + using var str__pchAttributeValue = new Utf8StringToNative( pchAttributeValue ); + _SetGamePhaseAttribute( Self, str__pchAttributeGroup.Pointer, str__pchAttributeValue.Pointer, unPriority ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_OpenOverlayToGamePhase", CallingConvention = Platform.CC)] + private static extern void _OpenOverlayToGamePhase( IntPtr self, IntPtr pchPhaseID ); + + #endregion + internal void OpenOverlayToGamePhase( string pchPhaseID ) + { + using var str__pchPhaseID = new Utf8StringToNative( pchPhaseID ); + _OpenOverlayToGamePhase( Self, str__pchPhaseID.Pointer ); + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamTimeline_OpenOverlayToTimelineEvent", CallingConvention = Platform.CC)] + private static extern void _OpenOverlayToTimelineEvent( IntPtr self, TimelineEventHandle ulEvent ); + + #endregion + internal void OpenOverlayToTimelineEvent( TimelineEventHandle ulEvent ) + { + _OpenOverlayToTimelineEvent( Self, ulEvent ); + } + + } +} diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs index 758020c64..f7f69a40b 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs @@ -7,20 +7,21 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamUGC : SteamInterface + internal unsafe partial class ISteamUGC : SteamInterface { + public const string Version = "STEAMUGC_INTERFACE_VERSION020"; internal ISteamUGC( bool IsGameServer ) { SetupInterface( IsGameServer ); } - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamUGC_v017", CallingConvention = Platform.CC)] - internal static extern IntPtr SteamAPI_SteamUGC_v017(); - public override IntPtr GetUserInterfacePointer() => SteamAPI_SteamUGC_v017(); - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamGameServerUGC_v017", CallingConvention = Platform.CC)] - internal static extern IntPtr SteamAPI_SteamGameServerUGC_v017(); - public override IntPtr GetServerInterfacePointer() => SteamAPI_SteamGameServerUGC_v017(); + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamUGC_v020", CallingConvention = Platform.CC)] + internal static extern IntPtr SteamAPI_SteamUGC_v020(); + public override IntPtr GetUserInterfacePointer() => SteamAPI_SteamUGC_v020(); + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamGameServerUGC_v020", CallingConvention = Platform.CC)] + internal static extern IntPtr SteamAPI_SteamGameServerUGC_v020(); + public override IntPtr GetServerInterfacePointer() => SteamAPI_SteamGameServerUGC_v020(); #region FunctionMeta @@ -47,12 +48,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_CreateQueryAllUGCRequestCursor", CallingConvention = Platform.CC)] - private static extern UGCQueryHandle_t _CreateQueryAllUGCRequest( IntPtr self, UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId nCreatorAppID, AppId nConsumerAppID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchCursor ); + private static extern UGCQueryHandle_t _CreateQueryAllUGCRequest( IntPtr self, UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId nCreatorAppID, AppId nConsumerAppID, IntPtr pchCursor ); #endregion - internal UGCQueryHandle_t CreateQueryAllUGCRequest( UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId nCreatorAppID, AppId nConsumerAppID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchCursor ) + internal UGCQueryHandle_t CreateQueryAllUGCRequest( UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId nCreatorAppID, AppId nConsumerAppID, string pchCursor ) { - var returnValue = _CreateQueryAllUGCRequest( Self, eQueryType, eMatchingeMatchingUGCTypeFileType, nCreatorAppID, nConsumerAppID, pchCursor ); + using var str__pchCursor = new Utf8StringToNative( pchCursor ); + var returnValue = _CreateQueryAllUGCRequest( Self, eQueryType, eMatchingeMatchingUGCTypeFileType, nCreatorAppID, nConsumerAppID, str__pchCursor.Pointer ); return returnValue; } @@ -109,9 +111,9 @@ namespace Steamworks #endregion internal bool GetQueryUGCTag( UGCQueryHandle_t handle, uint index, uint indexTag, out string pchValue ) { - using var mempchValue = Helpers.TakeMemory(); - var returnValue = _GetQueryUGCTag( Self, handle, index, indexTag, mempchValue, (1024 * 32) ); - pchValue = Helpers.MemoryToString( mempchValue ); + using var mem__pchValue = Helpers.TakeMemory(); + var returnValue = _GetQueryUGCTag( Self, handle, index, indexTag, mem__pchValue, (1024 * 32) ); + pchValue = Helpers.MemoryToString( mem__pchValue ); return returnValue; } @@ -123,9 +125,9 @@ namespace Steamworks #endregion internal bool GetQueryUGCTagDisplayName( UGCQueryHandle_t handle, uint index, uint indexTag, out string pchValue ) { - using var mempchValue = Helpers.TakeMemory(); - var returnValue = _GetQueryUGCTagDisplayName( Self, handle, index, indexTag, mempchValue, (1024 * 32) ); - pchValue = Helpers.MemoryToString( mempchValue ); + using var mem__pchValue = Helpers.TakeMemory(); + var returnValue = _GetQueryUGCTagDisplayName( Self, handle, index, indexTag, mem__pchValue, (1024 * 32) ); + pchValue = Helpers.MemoryToString( mem__pchValue ); return returnValue; } @@ -137,9 +139,9 @@ namespace Steamworks #endregion internal bool GetQueryUGCPreviewURL( UGCQueryHandle_t handle, uint index, out string pchURL ) { - using var mempchURL = Helpers.TakeMemory(); - var returnValue = _GetQueryUGCPreviewURL( Self, handle, index, mempchURL, (1024 * 32) ); - pchURL = Helpers.MemoryToString( mempchURL ); + using var mem__pchURL = Helpers.TakeMemory(); + var returnValue = _GetQueryUGCPreviewURL( Self, handle, index, mem__pchURL, (1024 * 32) ); + pchURL = Helpers.MemoryToString( mem__pchURL ); return returnValue; } @@ -151,9 +153,9 @@ namespace Steamworks #endregion internal bool GetQueryUGCMetadata( UGCQueryHandle_t handle, uint index, out string pchMetadata ) { - using var mempchMetadata = Helpers.TakeMemory(); - var returnValue = _GetQueryUGCMetadata( Self, handle, index, mempchMetadata, (1024 * 32) ); - pchMetadata = Helpers.MemoryToString( mempchMetadata ); + using var mem__pchMetadata = Helpers.TakeMemory(); + var returnValue = _GetQueryUGCMetadata( Self, handle, index, mem__pchMetadata, (1024 * 32) ); + pchMetadata = Helpers.MemoryToString( mem__pchMetadata ); return returnValue; } @@ -200,11 +202,11 @@ namespace Steamworks #endregion internal bool GetQueryUGCAdditionalPreview( UGCQueryHandle_t handle, uint index, uint previewIndex, out string pchURLOrVideoID, out string pchOriginalFileName, ref ItemPreviewType pPreviewType ) { - using var mempchURLOrVideoID = Helpers.TakeMemory(); - using var mempchOriginalFileName = Helpers.TakeMemory(); - var returnValue = _GetQueryUGCAdditionalPreview( Self, handle, index, previewIndex, mempchURLOrVideoID, (1024 * 32), mempchOriginalFileName, (1024 * 32), ref pPreviewType ); - pchURLOrVideoID = Helpers.MemoryToString( mempchURLOrVideoID ); - pchOriginalFileName = Helpers.MemoryToString( mempchOriginalFileName ); + using var mem__pchURLOrVideoID = Helpers.TakeMemory(); + using var mem__pchOriginalFileName = Helpers.TakeMemory(); + var returnValue = _GetQueryUGCAdditionalPreview( Self, handle, index, previewIndex, mem__pchURLOrVideoID, (1024 * 32), mem__pchOriginalFileName, (1024 * 32), ref pPreviewType ); + pchURLOrVideoID = Helpers.MemoryToString( mem__pchURLOrVideoID ); + pchOriginalFileName = Helpers.MemoryToString( mem__pchOriginalFileName ); return returnValue; } @@ -227,25 +229,53 @@ namespace Steamworks #endregion internal bool GetQueryUGCKeyValueTag( UGCQueryHandle_t handle, uint index, uint keyValueTagIndex, out string pchKey, out string pchValue ) { - using var mempchKey = Helpers.TakeMemory(); - using var mempchValue = Helpers.TakeMemory(); - var returnValue = _GetQueryUGCKeyValueTag( Self, handle, index, keyValueTagIndex, mempchKey, (1024 * 32), mempchValue, (1024 * 32) ); - pchKey = Helpers.MemoryToString( mempchKey ); - pchValue = Helpers.MemoryToString( mempchValue ); + using var mem__pchKey = Helpers.TakeMemory(); + using var mem__pchValue = Helpers.TakeMemory(); + var returnValue = _GetQueryUGCKeyValueTag( Self, handle, index, keyValueTagIndex, mem__pchKey, (1024 * 32), mem__pchValue, (1024 * 32) ); + pchKey = Helpers.MemoryToString( mem__pchKey ); + pchValue = Helpers.MemoryToString( mem__pchValue ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_GetQueryFirstUGCKeyValueTag", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetQueryUGCKeyValueTag( IntPtr self, UGCQueryHandle_t handle, uint index, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, IntPtr pchValue, uint cchValueSize ); + private static extern bool _GetQueryUGCKeyValueTag( IntPtr self, UGCQueryHandle_t handle, uint index, IntPtr pchKey, IntPtr pchValue, uint cchValueSize ); #endregion - internal bool GetQueryUGCKeyValueTag( UGCQueryHandle_t handle, uint index, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, out string pchValue ) + internal bool GetQueryUGCKeyValueTag( UGCQueryHandle_t handle, uint index, string pchKey, out string pchValue ) { - using var mempchValue = Helpers.TakeMemory(); - var returnValue = _GetQueryUGCKeyValueTag( Self, handle, index, pchKey, mempchValue, (1024 * 32) ); - pchValue = Helpers.MemoryToString( mempchValue ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + using var mem__pchValue = Helpers.TakeMemory(); + var returnValue = _GetQueryUGCKeyValueTag( Self, handle, index, str__pchKey.Pointer, mem__pchValue, (1024 * 32) ); + pchValue = Helpers.MemoryToString( mem__pchValue ); + return returnValue; + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_GetNumSupportedGameVersions", CallingConvention = Platform.CC)] + private static extern uint _GetNumSupportedGameVersions( IntPtr self, UGCQueryHandle_t handle, uint index ); + + #endregion + internal uint GetNumSupportedGameVersions( UGCQueryHandle_t handle, uint index ) + { + var returnValue = _GetNumSupportedGameVersions( Self, handle, index ); + return returnValue; + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_GetSupportedGameVersionData", CallingConvention = Platform.CC)] + [return: MarshalAs( UnmanagedType.I1 )] + private static extern bool _GetSupportedGameVersionData( IntPtr self, UGCQueryHandle_t handle, uint index, uint versionIndex, IntPtr pchGameBranchMin, IntPtr pchGameBranchMax, uint cchGameBranchSize ); + + #endregion + internal bool GetSupportedGameVersionData( UGCQueryHandle_t handle, uint index, uint versionIndex, out string pchGameBranchMin, out string pchGameBranchMax ) + { + using var mem__pchGameBranchMin = Helpers.TakeMemory(); + using var mem__pchGameBranchMax = Helpers.TakeMemory(); + var returnValue = _GetSupportedGameVersionData( Self, handle, index, versionIndex, mem__pchGameBranchMin, mem__pchGameBranchMax, (1024 * 32) ); + pchGameBranchMin = Helpers.MemoryToString( mem__pchGameBranchMin ); + pchGameBranchMax = Helpers.MemoryToString( mem__pchGameBranchMax ); return returnValue; } @@ -275,12 +305,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_AddRequiredTag", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _AddRequiredTag( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pTagName ); + private static extern bool _AddRequiredTag( IntPtr self, UGCQueryHandle_t handle, IntPtr pTagName ); #endregion - internal bool AddRequiredTag( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pTagName ) + internal bool AddRequiredTag( UGCQueryHandle_t handle, string pTagName ) { - var returnValue = _AddRequiredTag( Self, handle, pTagName ); + using var str__pTagName = new Utf8StringToNative( pTagName ); + var returnValue = _AddRequiredTag( Self, handle, str__pTagName.Pointer ); return returnValue; } @@ -299,12 +330,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_AddExcludedTag", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _AddExcludedTag( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pTagName ); + private static extern bool _AddExcludedTag( IntPtr self, UGCQueryHandle_t handle, IntPtr pTagName ); #endregion - internal bool AddExcludedTag( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pTagName ) + internal bool AddExcludedTag( UGCQueryHandle_t handle, string pTagName ) { - var returnValue = _AddExcludedTag( Self, handle, pTagName ); + using var str__pTagName = new Utf8StringToNative( pTagName ); + var returnValue = _AddExcludedTag( Self, handle, str__pTagName.Pointer ); return returnValue; } @@ -407,12 +439,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetLanguage", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetLanguage( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLanguage ); + private static extern bool _SetLanguage( IntPtr self, UGCQueryHandle_t handle, IntPtr pchLanguage ); #endregion - internal bool SetLanguage( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLanguage ) + internal bool SetLanguage( UGCQueryHandle_t handle, string pchLanguage ) { - var returnValue = _SetLanguage( Self, handle, pchLanguage ); + using var str__pchLanguage = new Utf8StringToNative( pchLanguage ); + var returnValue = _SetLanguage( Self, handle, str__pchLanguage.Pointer ); return returnValue; } @@ -429,14 +462,27 @@ namespace Steamworks } #region FunctionMeta - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetCloudFileNameFilter", CallingConvention = Platform.CC)] + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetAdminQuery", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetCloudFileNameFilter( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pMatchCloudFileName ); + private static extern bool _SetAdminQuery( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bAdminQuery ); #endregion - internal bool SetCloudFileNameFilter( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pMatchCloudFileName ) + internal bool SetAdminQuery( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bAdminQuery ) { - var returnValue = _SetCloudFileNameFilter( Self, handle, pMatchCloudFileName ); + var returnValue = _SetAdminQuery( Self, handle, bAdminQuery ); + return returnValue; + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetCloudFileNameFilter", CallingConvention = Platform.CC)] + [return: MarshalAs( UnmanagedType.I1 )] + private static extern bool _SetCloudFileNameFilter( IntPtr self, UGCQueryHandle_t handle, IntPtr pMatchCloudFileName ); + + #endregion + internal bool SetCloudFileNameFilter( UGCQueryHandle_t handle, string pMatchCloudFileName ) + { + using var str__pMatchCloudFileName = new Utf8StringToNative( pMatchCloudFileName ); + var returnValue = _SetCloudFileNameFilter( Self, handle, str__pMatchCloudFileName.Pointer ); return returnValue; } @@ -455,12 +501,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetSearchText", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetSearchText( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pSearchText ); + private static extern bool _SetSearchText( IntPtr self, UGCQueryHandle_t handle, IntPtr pSearchText ); #endregion - internal bool SetSearchText( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pSearchText ) + internal bool SetSearchText( UGCQueryHandle_t handle, string pSearchText ) { - var returnValue = _SetSearchText( Self, handle, pSearchText ); + using var str__pSearchText = new Utf8StringToNative( pSearchText ); + var returnValue = _SetSearchText( Self, handle, str__pSearchText.Pointer ); return returnValue; } @@ -503,12 +550,14 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_AddRequiredKeyValueTag", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _AddRequiredKeyValueTag( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pValue ); + private static extern bool _AddRequiredKeyValueTag( IntPtr self, UGCQueryHandle_t handle, IntPtr pKey, IntPtr pValue ); #endregion - internal bool AddRequiredKeyValueTag( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pValue ) + internal bool AddRequiredKeyValueTag( UGCQueryHandle_t handle, string pKey, string pValue ) { - var returnValue = _AddRequiredKeyValueTag( Self, handle, pKey, pValue ); + using var str__pKey = new Utf8StringToNative( pKey ); + using var str__pValue = new Utf8StringToNative( pValue ); + var returnValue = _AddRequiredKeyValueTag( Self, handle, str__pKey.Pointer, str__pValue.Pointer ); return returnValue; } @@ -537,48 +586,52 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetItemTitle", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetItemTitle( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchTitle ); + private static extern bool _SetItemTitle( IntPtr self, UGCUpdateHandle_t handle, IntPtr pchTitle ); #endregion - internal bool SetItemTitle( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchTitle ) + internal bool SetItemTitle( UGCUpdateHandle_t handle, string pchTitle ) { - var returnValue = _SetItemTitle( Self, handle, pchTitle ); + using var str__pchTitle = new Utf8StringToNative( pchTitle ); + var returnValue = _SetItemTitle( Self, handle, str__pchTitle.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetItemDescription", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetItemDescription( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchDescription ); + private static extern bool _SetItemDescription( IntPtr self, UGCUpdateHandle_t handle, IntPtr pchDescription ); #endregion - internal bool SetItemDescription( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchDescription ) + internal bool SetItemDescription( UGCUpdateHandle_t handle, string pchDescription ) { - var returnValue = _SetItemDescription( Self, handle, pchDescription ); + using var str__pchDescription = new Utf8StringToNative( pchDescription ); + var returnValue = _SetItemDescription( Self, handle, str__pchDescription.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetItemUpdateLanguage", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetItemUpdateLanguage( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLanguage ); + private static extern bool _SetItemUpdateLanguage( IntPtr self, UGCUpdateHandle_t handle, IntPtr pchLanguage ); #endregion - internal bool SetItemUpdateLanguage( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLanguage ) + internal bool SetItemUpdateLanguage( UGCUpdateHandle_t handle, string pchLanguage ) { - var returnValue = _SetItemUpdateLanguage( Self, handle, pchLanguage ); + using var str__pchLanguage = new Utf8StringToNative( pchLanguage ); + var returnValue = _SetItemUpdateLanguage( Self, handle, str__pchLanguage.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetItemMetadata", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetItemMetadata( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchMetaData ); + private static extern bool _SetItemMetadata( IntPtr self, UGCUpdateHandle_t handle, IntPtr pchMetaData ); #endregion - internal bool SetItemMetadata( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchMetaData ) + internal bool SetItemMetadata( UGCUpdateHandle_t handle, string pchMetaData ) { - var returnValue = _SetItemMetadata( Self, handle, pchMetaData ); + using var str__pchMetaData = new Utf8StringToNative( pchMetaData ); + var returnValue = _SetItemMetadata( Self, handle, str__pchMetaData.Pointer ); return returnValue; } @@ -597,36 +650,38 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetItemTags", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetItemTags( IntPtr self, UGCUpdateHandle_t updateHandle, ref SteamParamStringArray_t pTags ); + private static extern bool _SetItemTags( IntPtr self, UGCUpdateHandle_t updateHandle, ref SteamParamStringArray_t pTags, [MarshalAs( UnmanagedType.U1 )] bool bAllowAdminTags ); #endregion - internal bool SetItemTags( UGCUpdateHandle_t updateHandle, ref SteamParamStringArray_t pTags ) + internal bool SetItemTags( UGCUpdateHandle_t updateHandle, ref SteamParamStringArray_t pTags, [MarshalAs( UnmanagedType.U1 )] bool bAllowAdminTags ) { - var returnValue = _SetItemTags( Self, updateHandle, ref pTags ); + var returnValue = _SetItemTags( Self, updateHandle, ref pTags, bAllowAdminTags ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetItemContent", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetItemContent( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszContentFolder ); + private static extern bool _SetItemContent( IntPtr self, UGCUpdateHandle_t handle, IntPtr pszContentFolder ); #endregion - internal bool SetItemContent( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszContentFolder ) + internal bool SetItemContent( UGCUpdateHandle_t handle, string pszContentFolder ) { - var returnValue = _SetItemContent( Self, handle, pszContentFolder ); + using var str__pszContentFolder = new Utf8StringToNative( pszContentFolder ); + var returnValue = _SetItemContent( Self, handle, str__pszContentFolder.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetItemPreview", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetItemPreview( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszPreviewFile ); + private static extern bool _SetItemPreview( IntPtr self, UGCUpdateHandle_t handle, IntPtr pszPreviewFile ); #endregion - internal bool SetItemPreview( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszPreviewFile ) + internal bool SetItemPreview( UGCUpdateHandle_t handle, string pszPreviewFile ) { - var returnValue = _SetItemPreview( Self, handle, pszPreviewFile ); + using var str__pszPreviewFile = new Utf8StringToNative( pszPreviewFile ); + var returnValue = _SetItemPreview( Self, handle, str__pszPreviewFile.Pointer ); return returnValue; } @@ -657,72 +712,79 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_RemoveItemKeyValueTags", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _RemoveItemKeyValueTags( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ); + private static extern bool _RemoveItemKeyValueTags( IntPtr self, UGCUpdateHandle_t handle, IntPtr pchKey ); #endregion - internal bool RemoveItemKeyValueTags( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ) + internal bool RemoveItemKeyValueTags( UGCUpdateHandle_t handle, string pchKey ) { - var returnValue = _RemoveItemKeyValueTags( Self, handle, pchKey ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + var returnValue = _RemoveItemKeyValueTags( Self, handle, str__pchKey.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_AddItemKeyValueTag", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _AddItemKeyValueTag( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ); + private static extern bool _AddItemKeyValueTag( IntPtr self, UGCUpdateHandle_t handle, IntPtr pchKey, IntPtr pchValue ); #endregion - internal bool AddItemKeyValueTag( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchValue ) + internal bool AddItemKeyValueTag( UGCUpdateHandle_t handle, string pchKey, string pchValue ) { - var returnValue = _AddItemKeyValueTag( Self, handle, pchKey, pchValue ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + using var str__pchValue = new Utf8StringToNative( pchValue ); + var returnValue = _AddItemKeyValueTag( Self, handle, str__pchKey.Pointer, str__pchValue.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_AddItemPreviewFile", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _AddItemPreviewFile( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszPreviewFile, ItemPreviewType type ); + private static extern bool _AddItemPreviewFile( IntPtr self, UGCUpdateHandle_t handle, IntPtr pszPreviewFile, ItemPreviewType type ); #endregion - internal bool AddItemPreviewFile( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszPreviewFile, ItemPreviewType type ) + internal bool AddItemPreviewFile( UGCUpdateHandle_t handle, string pszPreviewFile, ItemPreviewType type ) { - var returnValue = _AddItemPreviewFile( Self, handle, pszPreviewFile, type ); + using var str__pszPreviewFile = new Utf8StringToNative( pszPreviewFile ); + var returnValue = _AddItemPreviewFile( Self, handle, str__pszPreviewFile.Pointer, type ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_AddItemPreviewVideo", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _AddItemPreviewVideo( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszVideoID ); + private static extern bool _AddItemPreviewVideo( IntPtr self, UGCUpdateHandle_t handle, IntPtr pszVideoID ); #endregion - internal bool AddItemPreviewVideo( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszVideoID ) + internal bool AddItemPreviewVideo( UGCUpdateHandle_t handle, string pszVideoID ) { - var returnValue = _AddItemPreviewVideo( Self, handle, pszVideoID ); + using var str__pszVideoID = new Utf8StringToNative( pszVideoID ); + var returnValue = _AddItemPreviewVideo( Self, handle, str__pszVideoID.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_UpdateItemPreviewFile", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _UpdateItemPreviewFile( IntPtr self, UGCUpdateHandle_t handle, uint index, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszPreviewFile ); + private static extern bool _UpdateItemPreviewFile( IntPtr self, UGCUpdateHandle_t handle, uint index, IntPtr pszPreviewFile ); #endregion - internal bool UpdateItemPreviewFile( UGCUpdateHandle_t handle, uint index, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszPreviewFile ) + internal bool UpdateItemPreviewFile( UGCUpdateHandle_t handle, uint index, string pszPreviewFile ) { - var returnValue = _UpdateItemPreviewFile( Self, handle, index, pszPreviewFile ); + using var str__pszPreviewFile = new Utf8StringToNative( pszPreviewFile ); + var returnValue = _UpdateItemPreviewFile( Self, handle, index, str__pszPreviewFile.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_UpdateItemPreviewVideo", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _UpdateItemPreviewVideo( IntPtr self, UGCUpdateHandle_t handle, uint index, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszVideoID ); + private static extern bool _UpdateItemPreviewVideo( IntPtr self, UGCUpdateHandle_t handle, uint index, IntPtr pszVideoID ); #endregion - internal bool UpdateItemPreviewVideo( UGCUpdateHandle_t handle, uint index, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszVideoID ) + internal bool UpdateItemPreviewVideo( UGCUpdateHandle_t handle, uint index, string pszVideoID ) { - var returnValue = _UpdateItemPreviewVideo( Self, handle, index, pszVideoID ); + using var str__pszVideoID = new Utf8StringToNative( pszVideoID ); + var returnValue = _UpdateItemPreviewVideo( Self, handle, index, str__pszVideoID.Pointer ); return returnValue; } @@ -763,13 +825,28 @@ namespace Steamworks } #region FunctionMeta - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SubmitItemUpdate", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _SubmitItemUpdate( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchChangeNote ); + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SetRequiredGameVersions", CallingConvention = Platform.CC)] + [return: MarshalAs( UnmanagedType.I1 )] + private static extern bool _SetRequiredGameVersions( IntPtr self, UGCUpdateHandle_t handle, IntPtr pszGameBranchMin, IntPtr pszGameBranchMax ); #endregion - internal CallResult SubmitItemUpdate( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchChangeNote ) + internal bool SetRequiredGameVersions( UGCUpdateHandle_t handle, string pszGameBranchMin, string pszGameBranchMax ) { - var returnValue = _SubmitItemUpdate( Self, handle, pchChangeNote ); + using var str__pszGameBranchMin = new Utf8StringToNative( pszGameBranchMin ); + using var str__pszGameBranchMax = new Utf8StringToNative( pszGameBranchMax ); + var returnValue = _SetRequiredGameVersions( Self, handle, str__pszGameBranchMin.Pointer, str__pszGameBranchMax.Pointer ); + return returnValue; + } + + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_SubmitItemUpdate", CallingConvention = Platform.CC)] + private static extern SteamAPICall_t _SubmitItemUpdate( IntPtr self, UGCUpdateHandle_t handle, IntPtr pchChangeNote ); + + #endregion + internal CallResult SubmitItemUpdate( UGCUpdateHandle_t handle, string pchChangeNote ) + { + using var str__pchChangeNote = new Utf8StringToNative( pchChangeNote ); + var returnValue = _SubmitItemUpdate( Self, handle, str__pchChangeNote.Pointer ); return new CallResult( returnValue, IsServer ); } @@ -891,9 +968,9 @@ namespace Steamworks #endregion internal bool GetItemInstallInfo( PublishedFileId nPublishedFileID, ref ulong punSizeOnDisk, out string pchFolder, ref uint punTimeStamp ) { - using var mempchFolder = Helpers.TakeMemory(); - var returnValue = _GetItemInstallInfo( Self, nPublishedFileID, ref punSizeOnDisk, mempchFolder, (1024 * 32), ref punTimeStamp ); - pchFolder = Helpers.MemoryToString( mempchFolder ); + using var mem__pchFolder = Helpers.TakeMemory(); + var returnValue = _GetItemInstallInfo( Self, nPublishedFileID, ref punSizeOnDisk, mem__pchFolder, (1024 * 32), ref punTimeStamp ); + pchFolder = Helpers.MemoryToString( mem__pchFolder ); return returnValue; } @@ -924,12 +1001,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_BInitWorkshopForGameServer", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _BInitWorkshopForGameServer( IntPtr self, DepotId_t unWorkshopDepotID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszFolder ); + private static extern bool _BInitWorkshopForGameServer( IntPtr self, DepotId_t unWorkshopDepotID, IntPtr pszFolder ); #endregion - internal bool BInitWorkshopForGameServer( DepotId_t unWorkshopDepotID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszFolder ) + internal bool BInitWorkshopForGameServer( DepotId_t unWorkshopDepotID, string pszFolder ) { - var returnValue = _BInitWorkshopForGameServer( Self, unWorkshopDepotID, pszFolder ); + using var str__pszFolder = new Utf8StringToNative( pszFolder ); + var returnValue = _BInitWorkshopForGameServer( Self, unWorkshopDepotID, str__pszFolder.Pointer ); return returnValue; } @@ -1065,5 +1143,16 @@ namespace Steamworks return new CallResult( returnValue, IsServer ); } + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUGC_GetUserContentDescriptorPreferences", CallingConvention = Platform.CC)] + private static extern uint _GetUserContentDescriptorPreferences( IntPtr self, [In,Out] UGCContentDescriptorID[] pvecDescriptors, uint cMaxEntries ); + + #endregion + internal uint GetUserContentDescriptorPreferences( [In,Out] UGCContentDescriptorID[] pvecDescriptors, uint cMaxEntries ) + { + var returnValue = _GetUserContentDescriptorPreferences( Self, pvecDescriptors, cMaxEntries ); + return returnValue; + } + } } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs index 18147edf6..5325c6114 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamUser : SteamInterface + internal unsafe partial class ISteamUser : SteamInterface { + public const string Version = "SteamUser023"; internal ISteamUser( bool IsGameServer ) { @@ -77,12 +78,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUser_TrackAppUsageEvent", CallingConvention = Platform.CC)] - private static extern void _TrackAppUsageEvent( IntPtr self, GameId gameID, int eAppUsageEvent, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchExtraInfo ); + private static extern void _TrackAppUsageEvent( IntPtr self, GameId gameID, int eAppUsageEvent, IntPtr pchExtraInfo ); #endregion - internal void TrackAppUsageEvent( GameId gameID, int eAppUsageEvent, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchExtraInfo ) + internal void TrackAppUsageEvent( GameId gameID, int eAppUsageEvent, string pchExtraInfo ) { - _TrackAppUsageEvent( Self, gameID, eAppUsageEvent, pchExtraInfo ); + using var str__pchExtraInfo = new Utf8StringToNative( pchExtraInfo ); + _TrackAppUsageEvent( Self, gameID, eAppUsageEvent, str__pchExtraInfo.Pointer ); } #region FunctionMeta @@ -93,9 +95,9 @@ namespace Steamworks #endregion internal bool GetUserDataFolder( out string pchBuffer ) { - using var mempchBuffer = Helpers.TakeMemory(); - var returnValue = _GetUserDataFolder( Self, mempchBuffer, (1024 * 32) ); - pchBuffer = Helpers.MemoryToString( mempchBuffer ); + using var mem__pchBuffer = Helpers.TakeMemory(); + var returnValue = _GetUserDataFolder( Self, mem__pchBuffer, (1024 * 32) ); + pchBuffer = Helpers.MemoryToString( mem__pchBuffer ); return returnValue; } @@ -176,12 +178,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUser_GetAuthTicketForWebApi", CallingConvention = Platform.CC)] - private static extern HAuthTicket _GetAuthTicketForWebApi( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchIdentity ); + private static extern HAuthTicket _GetAuthTicketForWebApi( IntPtr self, IntPtr pchIdentity ); #endregion - internal HAuthTicket GetAuthTicketForWebApi( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchIdentity ) + internal HAuthTicket GetAuthTicketForWebApi( string pchIdentity ) { - var returnValue = _GetAuthTicketForWebApi( Self, pchIdentity ); + using var str__pchIdentity = new Utf8StringToNative( pchIdentity ); + var returnValue = _GetAuthTicketForWebApi( Self, str__pchIdentity.Pointer ); return returnValue; } @@ -296,12 +299,13 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUser_RequestStoreAuthURL", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _RequestStoreAuthURL( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchRedirectURL ); + private static extern SteamAPICall_t _RequestStoreAuthURL( IntPtr self, IntPtr pchRedirectURL ); #endregion - internal CallResult RequestStoreAuthURL( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchRedirectURL ) + internal CallResult RequestStoreAuthURL( string pchRedirectURL ) { - var returnValue = _RequestStoreAuthURL( Self, pchRedirectURL ); + using var str__pchRedirectURL = new Utf8StringToNative( pchRedirectURL ); + var returnValue = _RequestStoreAuthURL( Self, str__pchRedirectURL.Pointer ); return new CallResult( returnValue, IsServer ); } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs index ab98ca638..9dc4bfd7f 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs @@ -7,136 +7,134 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamUserStats : SteamInterface + internal unsafe partial class ISteamUserStats : SteamInterface { + public const string Version = "STEAMUSERSTATS_INTERFACE_VERSION013"; internal ISteamUserStats( bool IsGameServer ) { SetupInterface( IsGameServer ); } - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamUserStats_v012", CallingConvention = Platform.CC)] - internal static extern IntPtr SteamAPI_SteamUserStats_v012(); - public override IntPtr GetUserInterfacePointer() => SteamAPI_SteamUserStats_v012(); + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamUserStats_v013", CallingConvention = Platform.CC)] + internal static extern IntPtr SteamAPI_SteamUserStats_v013(); + public override IntPtr GetUserInterfacePointer() => SteamAPI_SteamUserStats_v013(); - #region FunctionMeta - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_RequestCurrentStats", CallingConvention = Platform.CC)] - [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _RequestCurrentStats( IntPtr self ); - - #endregion - internal bool RequestCurrentStats() - { - var returnValue = _RequestCurrentStats( Self ); - return returnValue; - } - #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetStatInt32", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetStat( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref int pData ); + private static extern bool _GetStat( IntPtr self, IntPtr pchName, ref int pData ); #endregion - internal bool GetStat( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref int pData ) + internal bool GetStat( string pchName, ref int pData ) { - var returnValue = _GetStat( Self, pchName, ref pData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetStat( Self, str__pchName.Pointer, ref pData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetStatFloat", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetStat( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pData ); + private static extern bool _GetStat( IntPtr self, IntPtr pchName, ref float pData ); #endregion - internal bool GetStat( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pData ) + internal bool GetStat( string pchName, ref float pData ) { - var returnValue = _GetStat( Self, pchName, ref pData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetStat( Self, str__pchName.Pointer, ref pData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_SetStatInt32", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetStat( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, int nData ); + private static extern bool _SetStat( IntPtr self, IntPtr pchName, int nData ); #endregion - internal bool SetStat( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, int nData ) + internal bool SetStat( string pchName, int nData ) { - var returnValue = _SetStat( Self, pchName, nData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _SetStat( Self, str__pchName.Pointer, nData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_SetStatFloat", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetStat( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, float fData ); + private static extern bool _SetStat( IntPtr self, IntPtr pchName, float fData ); #endregion - internal bool SetStat( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, float fData ) + internal bool SetStat( string pchName, float fData ) { - var returnValue = _SetStat( Self, pchName, fData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _SetStat( Self, str__pchName.Pointer, fData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_UpdateAvgRateStat", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _UpdateAvgRateStat( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, float flCountThisSession, double dSessionLength ); + private static extern bool _UpdateAvgRateStat( IntPtr self, IntPtr pchName, float flCountThisSession, double dSessionLength ); #endregion - internal bool UpdateAvgRateStat( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, float flCountThisSession, double dSessionLength ) + internal bool UpdateAvgRateStat( string pchName, float flCountThisSession, double dSessionLength ) { - var returnValue = _UpdateAvgRateStat( Self, pchName, flCountThisSession, dSessionLength ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _UpdateAvgRateStat( Self, str__pchName.Pointer, flCountThisSession, dSessionLength ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetAchievement", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetAchievement( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); + private static extern bool _GetAchievement( IntPtr self, IntPtr pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); #endregion - internal bool GetAchievement( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) + internal bool GetAchievement( string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) { - var returnValue = _GetAchievement( Self, pchName, ref pbAchieved ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetAchievement( Self, str__pchName.Pointer, ref pbAchieved ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_SetAchievement", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _SetAchievement( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ); + private static extern bool _SetAchievement( IntPtr self, IntPtr pchName ); #endregion - internal bool SetAchievement( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ) + internal bool SetAchievement( string pchName ) { - var returnValue = _SetAchievement( Self, pchName ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _SetAchievement( Self, str__pchName.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_ClearAchievement", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _ClearAchievement( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ); + private static extern bool _ClearAchievement( IntPtr self, IntPtr pchName ); #endregion - internal bool ClearAchievement( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ) + internal bool ClearAchievement( string pchName ) { - var returnValue = _ClearAchievement( Self, pchName ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _ClearAchievement( Self, str__pchName.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetAchievementAndUnlockTime", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetAchievementAndUnlockTime( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ); + private static extern bool _GetAchievementAndUnlockTime( IntPtr self, IntPtr pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ); #endregion - internal bool GetAchievementAndUnlockTime( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ) + internal bool GetAchievementAndUnlockTime( string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ) { - var returnValue = _GetAchievementAndUnlockTime( Self, pchName, ref pbAchieved, ref punUnlockTime ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetAchievementAndUnlockTime( Self, str__pchName.Pointer, ref pbAchieved, ref punUnlockTime ); return returnValue; } @@ -154,35 +152,39 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetAchievementIcon", CallingConvention = Platform.CC)] - private static extern int _GetAchievementIcon( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ); + private static extern int _GetAchievementIcon( IntPtr self, IntPtr pchName ); #endregion - internal int GetAchievementIcon( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName ) + internal int GetAchievementIcon( string pchName ) { - var returnValue = _GetAchievementIcon( Self, pchName ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetAchievementIcon( Self, str__pchName.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetAchievementDisplayAttribute", CallingConvention = Platform.CC)] - private static extern Utf8StringPointer _GetAchievementDisplayAttribute( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ); + private static extern Utf8StringPointer _GetAchievementDisplayAttribute( IntPtr self, IntPtr pchName, IntPtr pchKey ); #endregion - internal string GetAchievementDisplayAttribute( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchKey ) + internal string GetAchievementDisplayAttribute( string pchName, string pchKey ) { - var returnValue = _GetAchievementDisplayAttribute( Self, pchName, pchKey ); + using var str__pchName = new Utf8StringToNative( pchName ); + using var str__pchKey = new Utf8StringToNative( pchKey ); + var returnValue = _GetAchievementDisplayAttribute( Self, str__pchName.Pointer, str__pchKey.Pointer ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_IndicateAchievementProgress", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _IndicateAchievementProgress( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, uint nCurProgress, uint nMaxProgress ); + private static extern bool _IndicateAchievementProgress( IntPtr self, IntPtr pchName, uint nCurProgress, uint nMaxProgress ); #endregion - internal bool IndicateAchievementProgress( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, uint nCurProgress, uint nMaxProgress ) + internal bool IndicateAchievementProgress( string pchName, uint nCurProgress, uint nMaxProgress ) { - var returnValue = _IndicateAchievementProgress( Self, pchName, nCurProgress, nMaxProgress ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _IndicateAchievementProgress( Self, str__pchName.Pointer, nCurProgress, nMaxProgress ); return returnValue; } @@ -222,48 +224,52 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetUserStatInt32", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetUserStat( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref int pData ); + private static extern bool _GetUserStat( IntPtr self, SteamId steamIDUser, IntPtr pchName, ref int pData ); #endregion - internal bool GetUserStat( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref int pData ) + internal bool GetUserStat( SteamId steamIDUser, string pchName, ref int pData ) { - var returnValue = _GetUserStat( Self, steamIDUser, pchName, ref pData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetUserStat( Self, steamIDUser, str__pchName.Pointer, ref pData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetUserStatFloat", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetUserStat( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pData ); + private static extern bool _GetUserStat( IntPtr self, SteamId steamIDUser, IntPtr pchName, ref float pData ); #endregion - internal bool GetUserStat( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pData ) + internal bool GetUserStat( SteamId steamIDUser, string pchName, ref float pData ) { - var returnValue = _GetUserStat( Self, steamIDUser, pchName, ref pData ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetUserStat( Self, steamIDUser, str__pchName.Pointer, ref pData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetUserAchievement", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetUserAchievement( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); + private static extern bool _GetUserAchievement( IntPtr self, SteamId steamIDUser, IntPtr pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); #endregion - internal bool GetUserAchievement( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) + internal bool GetUserAchievement( SteamId steamIDUser, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) { - var returnValue = _GetUserAchievement( Self, steamIDUser, pchName, ref pbAchieved ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetUserAchievement( Self, steamIDUser, str__pchName.Pointer, ref pbAchieved ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetUserAchievementAndUnlockTime", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetUserAchievementAndUnlockTime( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ); + private static extern bool _GetUserAchievementAndUnlockTime( IntPtr self, SteamId steamIDUser, IntPtr pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ); #endregion - internal bool GetUserAchievementAndUnlockTime( SteamId steamIDUser, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ) + internal bool GetUserAchievementAndUnlockTime( SteamId steamIDUser, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ) { - var returnValue = _GetUserAchievementAndUnlockTime( Self, steamIDUser, pchName, ref pbAchieved, ref punUnlockTime ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetUserAchievementAndUnlockTime( Self, steamIDUser, str__pchName.Pointer, ref pbAchieved, ref punUnlockTime ); return returnValue; } @@ -281,23 +287,25 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_FindOrCreateLeaderboard", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _FindOrCreateLeaderboard( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLeaderboardName, LeaderboardSort eLeaderboardSortMethod, LeaderboardDisplay eLeaderboardDisplayType ); + private static extern SteamAPICall_t _FindOrCreateLeaderboard( IntPtr self, IntPtr pchLeaderboardName, LeaderboardSort eLeaderboardSortMethod, LeaderboardDisplay eLeaderboardDisplayType ); #endregion - internal CallResult FindOrCreateLeaderboard( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLeaderboardName, LeaderboardSort eLeaderboardSortMethod, LeaderboardDisplay eLeaderboardDisplayType ) + internal CallResult FindOrCreateLeaderboard( string pchLeaderboardName, LeaderboardSort eLeaderboardSortMethod, LeaderboardDisplay eLeaderboardDisplayType ) { - var returnValue = _FindOrCreateLeaderboard( Self, pchLeaderboardName, eLeaderboardSortMethod, eLeaderboardDisplayType ); + using var str__pchLeaderboardName = new Utf8StringToNative( pchLeaderboardName ); + var returnValue = _FindOrCreateLeaderboard( Self, str__pchLeaderboardName.Pointer, eLeaderboardSortMethod, eLeaderboardDisplayType ); return new CallResult( returnValue, IsServer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_FindLeaderboard", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _FindLeaderboard( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLeaderboardName ); + private static extern SteamAPICall_t _FindLeaderboard( IntPtr self, IntPtr pchLeaderboardName ); #endregion - internal CallResult FindLeaderboard( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchLeaderboardName ) + internal CallResult FindLeaderboard( string pchLeaderboardName ) { - var returnValue = _FindLeaderboard( Self, pchLeaderboardName ); + using var str__pchLeaderboardName = new Utf8StringToNative( pchLeaderboardName ); + var returnValue = _FindLeaderboard( Self, str__pchLeaderboardName.Pointer ); return new CallResult( returnValue, IsServer ); } @@ -430,9 +438,9 @@ namespace Steamworks #endregion internal int GetMostAchievedAchievementInfo( out string pchName, ref float pflPercent, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) { - using var mempchName = Helpers.TakeMemory(); - var returnValue = _GetMostAchievedAchievementInfo( Self, mempchName, (1024 * 32), ref pflPercent, ref pbAchieved ); - pchName = Helpers.MemoryToString( mempchName ); + using var mem__pchName = Helpers.TakeMemory(); + var returnValue = _GetMostAchievedAchievementInfo( Self, mem__pchName, (1024 * 32), ref pflPercent, ref pbAchieved ); + pchName = Helpers.MemoryToString( mem__pchName ); return returnValue; } @@ -443,21 +451,22 @@ namespace Steamworks #endregion internal int GetNextMostAchievedAchievementInfo( int iIteratorPrevious, out string pchName, ref float pflPercent, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) { - using var mempchName = Helpers.TakeMemory(); - var returnValue = _GetNextMostAchievedAchievementInfo( Self, iIteratorPrevious, mempchName, (1024 * 32), ref pflPercent, ref pbAchieved ); - pchName = Helpers.MemoryToString( mempchName ); + using var mem__pchName = Helpers.TakeMemory(); + var returnValue = _GetNextMostAchievedAchievementInfo( Self, iIteratorPrevious, mem__pchName, (1024 * 32), ref pflPercent, ref pbAchieved ); + pchName = Helpers.MemoryToString( mem__pchName ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetAchievementAchievedPercent", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetAchievementAchievedPercent( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pflPercent ); + private static extern bool _GetAchievementAchievedPercent( IntPtr self, IntPtr pchName, ref float pflPercent ); #endregion - internal bool GetAchievementAchievedPercent( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pflPercent ) + internal bool GetAchievementAchievedPercent( string pchName, ref float pflPercent ) { - var returnValue = _GetAchievementAchievedPercent( Self, pchName, ref pflPercent ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetAchievementAchievedPercent( Self, str__pchName.Pointer, ref pflPercent ); return returnValue; } @@ -475,70 +484,76 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetGlobalStatInt64", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetGlobalStat( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchStatName, ref long pData ); + private static extern bool _GetGlobalStat( IntPtr self, IntPtr pchStatName, ref long pData ); #endregion - internal bool GetGlobalStat( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchStatName, ref long pData ) + internal bool GetGlobalStat( string pchStatName, ref long pData ) { - var returnValue = _GetGlobalStat( Self, pchStatName, ref pData ); + using var str__pchStatName = new Utf8StringToNative( pchStatName ); + var returnValue = _GetGlobalStat( Self, str__pchStatName.Pointer, ref pData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetGlobalStatDouble", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetGlobalStat( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchStatName, ref double pData ); + private static extern bool _GetGlobalStat( IntPtr self, IntPtr pchStatName, ref double pData ); #endregion - internal bool GetGlobalStat( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchStatName, ref double pData ) + internal bool GetGlobalStat( string pchStatName, ref double pData ) { - var returnValue = _GetGlobalStat( Self, pchStatName, ref pData ); + using var str__pchStatName = new Utf8StringToNative( pchStatName ); + var returnValue = _GetGlobalStat( Self, str__pchStatName.Pointer, ref pData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetGlobalStatHistoryInt64", CallingConvention = Platform.CC)] - private static extern int _GetGlobalStatHistory( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchStatName, [In,Out] long[] pData, uint cubData ); + private static extern int _GetGlobalStatHistory( IntPtr self, IntPtr pchStatName, [In,Out] long[] pData, uint cubData ); #endregion - internal int GetGlobalStatHistory( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchStatName, [In,Out] long[] pData, uint cubData ) + internal int GetGlobalStatHistory( string pchStatName, [In,Out] long[] pData, uint cubData ) { - var returnValue = _GetGlobalStatHistory( Self, pchStatName, pData, cubData ); + using var str__pchStatName = new Utf8StringToNative( pchStatName ); + var returnValue = _GetGlobalStatHistory( Self, str__pchStatName.Pointer, pData, cubData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetGlobalStatHistoryDouble", CallingConvention = Platform.CC)] - private static extern int _GetGlobalStatHistory( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchStatName, [In,Out] double[] pData, uint cubData ); + private static extern int _GetGlobalStatHistory( IntPtr self, IntPtr pchStatName, [In,Out] double[] pData, uint cubData ); #endregion - internal int GetGlobalStatHistory( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchStatName, [In,Out] double[] pData, uint cubData ) + internal int GetGlobalStatHistory( string pchStatName, [In,Out] double[] pData, uint cubData ) { - var returnValue = _GetGlobalStatHistory( Self, pchStatName, pData, cubData ); + using var str__pchStatName = new Utf8StringToNative( pchStatName ); + var returnValue = _GetGlobalStatHistory( Self, str__pchStatName.Pointer, pData, cubData ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetAchievementProgressLimitsInt32", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetAchievementProgressLimits( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref int pnMinProgress, ref int pnMaxProgress ); + private static extern bool _GetAchievementProgressLimits( IntPtr self, IntPtr pchName, ref int pnMinProgress, ref int pnMaxProgress ); #endregion - internal bool GetAchievementProgressLimits( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref int pnMinProgress, ref int pnMaxProgress ) + internal bool GetAchievementProgressLimits( string pchName, ref int pnMinProgress, ref int pnMaxProgress ) { - var returnValue = _GetAchievementProgressLimits( Self, pchName, ref pnMinProgress, ref pnMaxProgress ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetAchievementProgressLimits( Self, str__pchName.Pointer, ref pnMinProgress, ref pnMaxProgress ); return returnValue; } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetAchievementProgressLimitsFloat", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _GetAchievementProgressLimits( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pfMinProgress, ref float pfMaxProgress ); + private static extern bool _GetAchievementProgressLimits( IntPtr self, IntPtr pchName, ref float pfMinProgress, ref float pfMaxProgress ); #endregion - internal bool GetAchievementProgressLimits( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchName, ref float pfMinProgress, ref float pfMaxProgress ) + internal bool GetAchievementProgressLimits( string pchName, ref float pfMinProgress, ref float pfMaxProgress ) { - var returnValue = _GetAchievementProgressLimits( Self, pchName, ref pfMinProgress, ref pfMaxProgress ); + using var str__pchName = new Utf8StringToNative( pchName ); + var returnValue = _GetAchievementProgressLimits( Self, str__pchName.Pointer, ref pfMinProgress, ref pfMaxProgress ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUtils.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUtils.cs index f0a4cf544..472b7f32d 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUtils.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamUtils.cs @@ -7,8 +7,9 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamUtils : SteamInterface + internal unsafe partial class ISteamUtils : SteamInterface { + public const string Version = "SteamUtils010"; internal ISteamUtils( bool IsGameServer ) { @@ -216,24 +217,27 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUtils_CheckFileSignature", CallingConvention = Platform.CC)] - private static extern SteamAPICall_t _CheckFileSignature( IntPtr self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string szFileName ); + private static extern SteamAPICall_t _CheckFileSignature( IntPtr self, IntPtr szFileName ); #endregion - internal CallResult CheckFileSignature( [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string szFileName ) + internal CallResult CheckFileSignature( string szFileName ) { - var returnValue = _CheckFileSignature( Self, szFileName ); + using var str__szFileName = new Utf8StringToNative( szFileName ); + var returnValue = _CheckFileSignature( Self, str__szFileName.Pointer ); return new CallResult( returnValue, IsServer ); } #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUtils_ShowGamepadTextInput", CallingConvention = Platform.CC)] [return: MarshalAs( UnmanagedType.I1 )] - private static extern bool _ShowGamepadTextInput( IntPtr self, GamepadTextInputMode eInputMode, GamepadTextInputLineMode eLineInputMode, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchDescription, uint unCharMax, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchExistingText ); + private static extern bool _ShowGamepadTextInput( IntPtr self, GamepadTextInputMode eInputMode, GamepadTextInputLineMode eLineInputMode, IntPtr pchDescription, uint unCharMax, IntPtr pchExistingText ); #endregion - internal bool ShowGamepadTextInput( GamepadTextInputMode eInputMode, GamepadTextInputLineMode eLineInputMode, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchDescription, uint unCharMax, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchExistingText ) + internal bool ShowGamepadTextInput( GamepadTextInputMode eInputMode, GamepadTextInputLineMode eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText ) { - var returnValue = _ShowGamepadTextInput( Self, eInputMode, eLineInputMode, pchDescription, unCharMax, pchExistingText ); + using var str__pchDescription = new Utf8StringToNative( pchDescription ); + using var str__pchExistingText = new Utf8StringToNative( pchExistingText ); + var returnValue = _ShowGamepadTextInput( Self, eInputMode, eLineInputMode, str__pchDescription.Pointer, unCharMax, str__pchExistingText.Pointer ); return returnValue; } @@ -256,9 +260,9 @@ namespace Steamworks #endregion internal bool GetEnteredGamepadTextInput( out string pchText ) { - using var mempchText = Helpers.TakeMemory(); - var returnValue = _GetEnteredGamepadTextInput( Self, mempchText, (1024 * 32) ); - pchText = Helpers.MemoryToString( mempchText ); + using var mem__pchText = Helpers.TakeMemory(); + var returnValue = _GetEnteredGamepadTextInput( Self, mem__pchText, (1024 * 32) ); + pchText = Helpers.MemoryToString( mem__pchText ); return returnValue; } @@ -365,14 +369,15 @@ namespace Steamworks #region FunctionMeta [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUtils_FilterText", CallingConvention = Platform.CC)] - private static extern int _FilterText( IntPtr self, TextFilteringContext eContext, SteamId sourceSteamID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchInputMessage, IntPtr pchOutFilteredText, uint nByteSizeOutFilteredText ); + private static extern int _FilterText( IntPtr self, TextFilteringContext eContext, SteamId sourceSteamID, IntPtr pchInputMessage, IntPtr pchOutFilteredText, uint nByteSizeOutFilteredText ); #endregion - internal int FilterText( TextFilteringContext eContext, SteamId sourceSteamID, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pchInputMessage, out string pchOutFilteredText ) + internal int FilterText( TextFilteringContext eContext, SteamId sourceSteamID, string pchInputMessage, out string pchOutFilteredText ) { - using var mempchOutFilteredText = Helpers.TakeMemory(); - var returnValue = _FilterText( Self, eContext, sourceSteamID, pchInputMessage, mempchOutFilteredText, (1024 * 32) ); - pchOutFilteredText = Helpers.MemoryToString( mempchOutFilteredText ); + using var str__pchInputMessage = new Utf8StringToNative( pchInputMessage ); + using var mem__pchOutFilteredText = Helpers.TakeMemory(); + var returnValue = _FilterText( Self, eContext, sourceSteamID, str__pchInputMessage.Pointer, mem__pchOutFilteredText, (1024 * 32) ); + pchOutFilteredText = Helpers.MemoryToString( mem__pchOutFilteredText ); return returnValue; } @@ -433,5 +438,17 @@ namespace Steamworks return returnValue; } + #region FunctionMeta + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_ISteamUtils_DismissGamepadTextInput", CallingConvention = Platform.CC)] + [return: MarshalAs( UnmanagedType.I1 )] + private static extern bool _DismissGamepadTextInput( IntPtr self ); + + #endregion + internal bool DismissGamepadTextInput() + { + var returnValue = _DismissGamepadTextInput( Self ); + return returnValue; + } + } } diff --git a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs index bd4d029a8..b40b85930 100644 --- a/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs +++ b/Libraries/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs @@ -7,17 +7,18 @@ using Steamworks.Data; namespace Steamworks { - internal unsafe class ISteamVideo : SteamInterface + internal unsafe partial class ISteamVideo : SteamInterface { + public const string Version = "STEAMVIDEO_INTERFACE_V007"; internal ISteamVideo( bool IsGameServer ) { SetupInterface( IsGameServer ); } - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamVideo_v002", CallingConvention = Platform.CC)] - internal static extern IntPtr SteamAPI_SteamVideo_v002(); - public override IntPtr GetUserInterfacePointer() => SteamAPI_SteamVideo_v002(); + [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamVideo_v007", CallingConvention = Platform.CC)] + internal static extern IntPtr SteamAPI_SteamVideo_v007(); + public override IntPtr GetUserInterfacePointer() => SteamAPI_SteamVideo_v007(); #region FunctionMeta @@ -58,11 +59,12 @@ namespace Steamworks private static extern bool _GetOPFStringForApp( IntPtr self, AppId unVideoAppID, IntPtr pchBuffer, ref int pnBufferSize ); #endregion - internal bool GetOPFStringForApp( AppId unVideoAppID, out string pchBuffer, ref int pnBufferSize ) + internal bool GetOPFStringForApp( AppId unVideoAppID, out string pchBuffer ) { - using var mempchBuffer = Helpers.TakeMemory(); - var returnValue = _GetOPFStringForApp( Self, unVideoAppID, mempchBuffer, ref pnBufferSize ); - pchBuffer = Helpers.MemoryToString( mempchBuffer ); + using var mem__pchBuffer = Helpers.TakeMemory(); + int szpnBufferSize = (1024 * 32); + var returnValue = _GetOPFStringForApp( Self, unVideoAppID, mem__pchBuffer, ref szpnBufferSize ); + pchBuffer = Helpers.MemoryToString( mem__pchBuffer ); return returnValue; } diff --git a/Libraries/Facepunch.Steamworks/Generated/SteamCallbacks.cs b/Libraries/Facepunch.Steamworks/Generated/SteamCallbacks.cs index 883114778..e674544b8 100644 --- a/Libraries/Facepunch.Steamworks/Generated/SteamCallbacks.cs +++ b/Libraries/Facepunch.Steamworks/Generated/SteamCallbacks.cs @@ -144,7 +144,7 @@ namespace Steamworks.Data [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] internal struct GameWebCallback_t : ICallbackData { - internal string URLUTF8() => System.Text.Encoding.UTF8.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); + internal string URLUTF8() => Steamworks.Utility.Utf8NoBom.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] // byte[] m_szURL internal byte[] URL; // m_szURL char [256] @@ -158,7 +158,7 @@ namespace Steamworks.Data [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] internal struct StoreAuthURLResponse_t : ICallbackData { - internal string URLUTF8() => System.Text.Encoding.UTF8.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); + internal string URLUTF8() => Steamworks.Utility.Utf8NoBom.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] // byte[] m_szURL internal byte[] URL; // m_szURL char [512] @@ -242,6 +242,7 @@ namespace Steamworks.Data [MarshalAs(UnmanagedType.I1)] internal bool UserInitiated; // m_bUserInitiated bool internal AppId AppID; // m_nAppID AppId_t + internal uint DwOverlayPID; // m_dwOverlayPID uint32 #region SteamCallback public static int _datasize = System.Runtime.InteropServices.Marshal.SizeOf( typeof(GameOverlayActivated_t) ); @@ -253,10 +254,10 @@ namespace Steamworks.Data [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] internal struct GameServerChangeRequested_t : ICallbackData { - internal string ServerUTF8() => System.Text.Encoding.UTF8.GetString( Server, 0, System.Array.IndexOf( Server, 0 ) ); + internal string ServerUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Server, 0, System.Array.IndexOf( Server, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] // byte[] m_rgchServer internal byte[] Server; // m_rgchServer char [64] - internal string PasswordUTF8() => System.Text.Encoding.UTF8.GetString( Password, 0, System.Array.IndexOf( Password, 0 ) ); + internal string PasswordUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Password, 0, System.Array.IndexOf( Password, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] // byte[] m_rgchPassword internal byte[] Password; // m_rgchPassword char [64] @@ -326,7 +327,7 @@ namespace Steamworks.Data internal struct GameRichPresenceJoinRequested_t : ICallbackData { internal ulong SteamIDFriend; // m_steamIDFriend CSteamID - internal string ConnectUTF8() => System.Text.Encoding.UTF8.GetString( Connect, 0, System.Array.IndexOf( Connect, 0 ) ); + internal string ConnectUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Connect, 0, System.Array.IndexOf( Connect, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] // byte[] m_rgchConnect internal byte[] Connect; // m_rgchConnect char [256] @@ -495,7 +496,7 @@ namespace Steamworks.Data [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] internal struct OverlayBrowserProtocolNavigation_t : ICallbackData { - internal string RgchURIUTF8() => System.Text.Encoding.UTF8.GetString( RgchURI, 0, System.Array.IndexOf( RgchURI, 0 ) ); + internal string RgchURIUTF8() => Steamworks.Utility.Utf8NoBom.GetString( RgchURI, 0, System.Array.IndexOf( RgchURI, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] // byte[] rgchURI internal byte[] RgchURI; // rgchURI char [1024] @@ -533,6 +534,8 @@ namespace Steamworks.Data internal bool HasProfileBackground; // m_bHasProfileBackground bool [MarshalAs(UnmanagedType.I1)] internal bool HasMiniProfileBackground; // m_bHasMiniProfileBackground bool + [MarshalAs(UnmanagedType.I1)] + internal bool FromCache; // m_bFromCache bool #region SteamCallback public static int _datasize = System.Runtime.InteropServices.Marshal.SizeOf( typeof(EquippedProfileItems_t) ); @@ -946,7 +949,7 @@ namespace Steamworks.Data internal Result Result; // m_eResult EResult internal ulong BeaconID; // m_ulBeaconID PartyBeaconID_t internal ulong SteamIDBeaconOwner; // m_SteamIDBeaconOwner CSteamID - internal string ConnectStringUTF8() => System.Text.Encoding.UTF8.GetString( ConnectString, 0, System.Array.IndexOf( ConnectString, 0 ) ); + internal string ConnectStringUTF8() => Steamworks.Utility.Utf8NoBom.GetString( ConnectString, 0, System.Array.IndexOf( ConnectString, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] // byte[] m_rgchConnectString internal byte[] ConnectString; // m_rgchConnectString char [256] @@ -1022,7 +1025,7 @@ namespace Steamworks.Data { internal Result Result; // m_eResult EResult internal ulong File; // m_hFile UGCHandle_t - internal string FilenameUTF8() => System.Text.Encoding.UTF8.GetString( Filename, 0, System.Array.IndexOf( Filename, 0 ) ); + internal string FilenameUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Filename, 0, System.Array.IndexOf( Filename, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)] // byte[] m_rgchFilename internal byte[] Filename; // m_rgchFilename char [260] @@ -1143,7 +1146,7 @@ namespace Steamworks.Data internal ulong File; // m_hFile UGCHandle_t internal AppId AppID; // m_nAppID AppId_t internal int SizeInBytes; // m_nSizeInBytes int32 - internal string PchFileNameUTF8() => System.Text.Encoding.UTF8.GetString( PchFileName, 0, System.Array.IndexOf( PchFileName, 0 ) ); + internal string PchFileNameUTF8() => Steamworks.Utility.Utf8NoBom.GetString( PchFileName, 0, System.Array.IndexOf( PchFileName, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)] // byte[] m_pchFileName internal byte[] PchFileName; // m_pchFileName char [260] internal ulong SteamIDOwner; // m_ulSteamIDOwner uint64 @@ -1162,10 +1165,10 @@ namespace Steamworks.Data internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t internal AppId CreatorAppID; // m_nCreatorAppID AppId_t internal AppId ConsumerAppID; // m_nConsumerAppID AppId_t - internal string TitleUTF8() => System.Text.Encoding.UTF8.GetString( Title, 0, System.Array.IndexOf( Title, 0 ) ); + internal string TitleUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Title, 0, System.Array.IndexOf( Title, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 129)] // byte[] m_rgchTitle internal byte[] Title; // m_rgchTitle char [129] - internal string DescriptionUTF8() => System.Text.Encoding.UTF8.GetString( Description, 0, System.Array.IndexOf( Description, 0 ) ); + internal string DescriptionUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Description, 0, System.Array.IndexOf( Description, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8000)] // byte[] m_rgchDescription internal byte[] Description; // m_rgchDescription char [8000] internal ulong File; // m_hFile UGCHandle_t @@ -1176,17 +1179,17 @@ namespace Steamworks.Data internal RemoteStoragePublishedFileVisibility Visibility; // m_eVisibility ERemoteStoragePublishedFileVisibility [MarshalAs(UnmanagedType.I1)] internal bool Banned; // m_bBanned bool - internal string TagsUTF8() => System.Text.Encoding.UTF8.GetString( Tags, 0, System.Array.IndexOf( Tags, 0 ) ); + internal string TagsUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Tags, 0, System.Array.IndexOf( Tags, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1025)] // byte[] m_rgchTags internal byte[] Tags; // m_rgchTags char [1025] [MarshalAs(UnmanagedType.I1)] internal bool TagsTruncated; // m_bTagsTruncated bool - internal string PchFileNameUTF8() => System.Text.Encoding.UTF8.GetString( PchFileName, 0, System.Array.IndexOf( PchFileName, 0 ) ); + internal string PchFileNameUTF8() => Steamworks.Utility.Utf8NoBom.GetString( PchFileName, 0, System.Array.IndexOf( PchFileName, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)] // byte[] m_pchFileName internal byte[] PchFileName; // m_pchFileName char [260] internal int FileSize; // m_nFileSize int32 internal int PreviewFileSize; // m_nPreviewFileSize int32 - internal string URLUTF8() => System.Text.Encoding.UTF8.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); + internal string URLUTF8() => Steamworks.Utility.Utf8NoBom.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] // byte[] m_rgchURL internal byte[] URL; // m_rgchURL char [256] internal WorkshopFileType FileType; // m_eFileType EWorkshopFileType @@ -1451,7 +1454,7 @@ namespace Steamworks.Data internal ulong GameID; // m_nGameID uint64 [MarshalAs(UnmanagedType.I1)] internal bool GroupAchievement; // m_bGroupAchievement bool - internal string AchievementNameUTF8() => System.Text.Encoding.UTF8.GetString( AchievementName, 0, System.Array.IndexOf( AchievementName, 0 ) ); + internal string AchievementNameUTF8() => Steamworks.Utility.Utf8NoBom.GetString( AchievementName, 0, System.Array.IndexOf( AchievementName, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] // byte[] m_rgchAchievementName internal byte[] AchievementName; // m_rgchAchievementName char [128] internal uint CurProgress; // m_nCurProgress uint32 @@ -1537,7 +1540,7 @@ namespace Steamworks.Data internal struct UserAchievementIconFetched_t : ICallbackData { internal GameId GameID; // m_nGameID CGameID - internal string AchievementNameUTF8() => System.Text.Encoding.UTF8.GetString( AchievementName, 0, System.Array.IndexOf( AchievementName, 0 ) ); + internal string AchievementNameUTF8() => Steamworks.Utility.Utf8NoBom.GetString( AchievementName, 0, System.Array.IndexOf( AchievementName, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] // byte[] m_rgchAchievementName internal byte[] AchievementName; // m_rgchAchievementName char [128] [MarshalAs(UnmanagedType.I1)] @@ -1619,7 +1622,7 @@ namespace Steamworks.Data internal Result Result; // m_eResult EResult internal uint AppID; // m_nAppID uint32 internal uint CchKeyLength; // m_cchKeyLength uint32 - internal string KeyUTF8() => System.Text.Encoding.UTF8.GetString( Key, 0, System.Array.IndexOf( Key, 0 ) ); + internal string KeyUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Key, 0, System.Array.IndexOf( Key, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 240)] // byte[] m_rgchKey internal byte[] Key; // m_rgchKey char [240] @@ -2010,7 +2013,7 @@ namespace Steamworks.Data internal uint TotalMatchingResults; // m_unTotalMatchingResults uint32 [MarshalAs(UnmanagedType.I1)] internal bool CachedData; // m_bCachedData bool - internal string NextCursorUTF8() => System.Text.Encoding.UTF8.GetString( NextCursor, 0, System.Array.IndexOf( NextCursor, 0 ) ); + internal string NextCursorUTF8() => Steamworks.Utility.Utf8NoBom.GetString( NextCursor, 0, System.Array.IndexOf( NextCursor, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] // byte[] m_rgchNextCursor internal byte[] NextCursor; // m_rgchNextCursor char [256] @@ -2070,6 +2073,8 @@ namespace Steamworks.Data { internal AppId AppID; // m_unAppID AppId_t internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t + internal ulong LegacyContent; // m_hLegacyContent UGCHandle_t + internal ulong ManifestID; // m_unManifestID uint64 #region SteamCallback public static int _datasize = System.Runtime.InteropServices.Marshal.SizeOf( typeof(ItemInstalled_t) ); @@ -2282,32 +2287,6 @@ namespace Steamworks.Data #endregion } - [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] - internal struct SteamAppInstalled_t : ICallbackData - { - internal AppId AppID; // m_nAppID AppId_t - internal int InstallFolderIndex; // m_iInstallFolderIndex int - - #region SteamCallback - public static int _datasize = System.Runtime.InteropServices.Marshal.SizeOf( typeof(SteamAppInstalled_t) ); - public int DataSize => _datasize; - public CallbackType CallbackType => CallbackType.SteamAppInstalled; - #endregion - } - - [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] - internal struct SteamAppUninstalled_t : ICallbackData - { - internal AppId AppID; // m_nAppID AppId_t - internal int InstallFolderIndex; // m_iInstallFolderIndex int - - #region SteamCallback - public static int _datasize = System.Runtime.InteropServices.Marshal.SizeOf( typeof(SteamAppUninstalled_t) ); - public int DataSize => _datasize; - public CallbackType CallbackType => CallbackType.SteamAppUninstalled; - #endregion - } - [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] internal struct HTML_BrowserReady_t : ICallbackData { @@ -2721,7 +2700,7 @@ namespace Steamworks.Data internal struct SteamInventoryRequestPricesResult_t : ICallbackData { internal Result Result; // m_result EResult - internal string CurrencyUTF8() => System.Text.Encoding.UTF8.GetString( Currency, 0, System.Array.IndexOf( Currency, 0 ) ); + internal string CurrencyUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Currency, 0, System.Array.IndexOf( Currency, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] // byte[] m_rgchCurrency internal byte[] Currency; // m_rgchCurrency char [4] @@ -2732,12 +2711,44 @@ namespace Steamworks.Data #endregion } + [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] + internal struct SteamTimelineGamePhaseRecordingExists_t : ICallbackData + { + internal string PhaseIDUTF8() => Steamworks.Utility.Utf8NoBom.GetString( PhaseID, 0, System.Array.IndexOf( PhaseID, 0 ) ); + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] // byte[] m_rgchPhaseID + internal byte[] PhaseID; // m_rgchPhaseID char [64] + internal ulong RecordingMS; // m_ulRecordingMS uint64 + internal ulong LongestClipMS; // m_ulLongestClipMS uint64 + internal uint ClipCount; // m_unClipCount uint32 + internal uint ScreenshotCount; // m_unScreenshotCount uint32 + + #region SteamCallback + public static int _datasize = System.Runtime.InteropServices.Marshal.SizeOf( typeof(SteamTimelineGamePhaseRecordingExists_t) ); + public int DataSize => _datasize; + public CallbackType CallbackType => CallbackType.SteamTimelineGamePhaseRecordingExists; + #endregion + } + + [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] + internal struct SteamTimelineEventRecordingExists_t : ICallbackData + { + internal ulong EventID; // m_ulEventID uint64 + [MarshalAs(UnmanagedType.I1)] + internal bool RecordingExists; // m_bRecordingExists bool + + #region SteamCallback + public static int _datasize = System.Runtime.InteropServices.Marshal.SizeOf( typeof(SteamTimelineEventRecordingExists_t) ); + public int DataSize => _datasize; + public CallbackType CallbackType => CallbackType.SteamTimelineEventRecordingExists; + #endregion + } + [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] internal struct GetVideoURLResult_t : ICallbackData { internal Result Result; // m_eResult EResult internal AppId VideoAppID; // m_unVideoAppID AppId_t - internal string URLUTF8() => System.Text.Encoding.UTF8.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); + internal string URLUTF8() => Steamworks.Utility.Utf8NoBom.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] // byte[] m_rgchURL internal byte[] URL; // m_rgchURL char [256] @@ -2761,6 +2772,31 @@ namespace Steamworks.Data #endregion } + [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] + internal struct BroadcastUploadStart_t : ICallbackData + { + [MarshalAs(UnmanagedType.I1)] + internal bool IsRTMP; // m_bIsRTMP bool + + #region SteamCallback + public static int _datasize = System.Runtime.InteropServices.Marshal.SizeOf( typeof(BroadcastUploadStart_t) ); + public int DataSize => _datasize; + public CallbackType CallbackType => CallbackType.BroadcastUploadStart; + #endregion + } + + [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] + internal struct BroadcastUploadStop_t : ICallbackData + { + internal BroadcastUploadResult Result; // m_eResult EBroadcastUploadResult + + #region SteamCallback + public static int _datasize = System.Runtime.InteropServices.Marshal.SizeOf( typeof(BroadcastUploadStop_t) ); + public int DataSize => _datasize; + public CallbackType CallbackType => CallbackType.BroadcastUploadStop; + #endregion + } + [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] internal struct SteamParentalSettingsChanged_t : ICallbackData { @@ -2799,7 +2835,7 @@ namespace Steamworks.Data [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] internal struct SteamRemotePlayTogetherGuestInvite_t : ICallbackData { - internal string ConnectURLUTF8() => System.Text.Encoding.UTF8.GetString( ConnectURL, 0, System.Array.IndexOf( ConnectURL, 0 ) ); + internal string ConnectURLUTF8() => Steamworks.Utility.Utf8NoBom.GetString( ConnectURL, 0, System.Array.IndexOf( ConnectURL, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] // byte[] m_szConnectURL internal byte[] ConnectURL; // m_szConnectURL char [1024] @@ -2852,7 +2888,7 @@ namespace Steamworks.Data internal struct SteamNetAuthenticationStatus_t : ICallbackData { internal SteamNetworkingAvailability Avail; // m_eAvail ESteamNetworkingAvailability - internal string DebugMsgUTF8() => System.Text.Encoding.UTF8.GetString( DebugMsg, 0, System.Array.IndexOf( DebugMsg, 0 ) ); + internal string DebugMsgUTF8() => Steamworks.Utility.Utf8NoBom.GetString( DebugMsg, 0, System.Array.IndexOf( DebugMsg, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] // byte[] m_debugMsg internal byte[] DebugMsg; // m_debugMsg char [256] @@ -2870,7 +2906,7 @@ namespace Steamworks.Data internal int PingMeasurementInProgress; // m_bPingMeasurementInProgress int internal SteamNetworkingAvailability AvailNetworkConfig; // m_eAvailNetworkConfig ESteamNetworkingAvailability internal SteamNetworkingAvailability AvailAnyRelay; // m_eAvailAnyRelay ESteamNetworkingAvailability - internal string DebugMsgUTF8() => System.Text.Encoding.UTF8.GetString( DebugMsg, 0, System.Array.IndexOf( DebugMsg, 0 ) ); + internal string DebugMsgUTF8() => Steamworks.Utility.Utf8NoBom.GetString( DebugMsg, 0, System.Array.IndexOf( DebugMsg, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] // byte[] m_debugMsg internal byte[] DebugMsg; // m_debugMsg char [256] @@ -2899,7 +2935,7 @@ namespace Steamworks.Data { internal ulong SteamID; // m_SteamID CSteamID internal DenyReason DenyReason; // m_eDenyReason EDenyReason - internal string OptionalTextUTF8() => System.Text.Encoding.UTF8.GetString( OptionalText, 0, System.Array.IndexOf( OptionalText, 0 ) ); + internal string OptionalTextUTF8() => Steamworks.Utility.Utf8NoBom.GetString( OptionalText, 0, System.Array.IndexOf( OptionalText, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] // byte[] m_rgchOptionalText internal byte[] OptionalText; // m_rgchOptionalText char [128] @@ -2927,7 +2963,7 @@ namespace Steamworks.Data internal struct GSClientAchievementStatus_t : ICallbackData { internal ulong SteamID; // m_SteamID uint64 - internal string PchAchievementUTF8() => System.Text.Encoding.UTF8.GetString( PchAchievement, 0, System.Array.IndexOf( PchAchievement, 0 ) ); + internal string PchAchievementUTF8() => Steamworks.Utility.Utf8NoBom.GetString( PchAchievement, 0, System.Array.IndexOf( PchAchievement, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] // byte[] m_pchAchievement internal byte[] PchAchievement; // m_pchAchievement char [128] [MarshalAs(UnmanagedType.I1)] diff --git a/Libraries/Facepunch.Steamworks/Generated/SteamConstants.cs b/Libraries/Facepunch.Steamworks/Generated/SteamConstants.cs index fcdd12f1c..d3e073bae 100644 --- a/Libraries/Facepunch.Steamworks/Generated/SteamConstants.cs +++ b/Libraries/Facepunch.Steamworks/Generated/SteamConstants.cs @@ -11,16 +11,20 @@ namespace Steamworks.Data internal static readonly AppId k_uAppIdInvalid = 0x0; internal static readonly DepotId_t k_uDepotIdInvalid = 0x0; internal static readonly SteamAPICall_t k_uAPICallInvalid = 0x0; + internal static readonly AccountID_t k_uAccountIdInvalid = 0; internal static readonly PartyBeaconID_t k_ulPartyBeaconIdInvalid = 0; internal static readonly HAuthTicket k_HAuthTicketInvalid = 0; internal static readonly uint k_unSteamAccountIDMask = 0xFFFFFFFF; internal static readonly uint k_unSteamAccountInstanceMask = 0x000FFFFF; internal static readonly uint k_unSteamUserDefaultInstance = 1; internal static readonly int k_cchGameExtraInfoMax = 64; + internal static readonly int k_cchMaxSteamErrMsg = 1024; internal static readonly int k_cchMaxFriendsGroupName = 64; internal static readonly int k_cFriendsGroupLimit = 100; internal static readonly FriendsGroupID_t k_FriendsGroupID_Invalid = - 1; internal static readonly int k_cEnumerateFollowersMax = 50; + internal static readonly ushort k_usFriendGameInfoQueryPort_NotInitialized = 0xFFFF; + internal static readonly ushort k_usFriendGameInfoQueryPort_Error = 0xFFFE; internal static readonly uint k_cubChatMetadataMax = 8192; internal static readonly int k_cbMaxGameServerGameDir = 32; internal static readonly int k_cbMaxGameServerMapName = 32; @@ -58,6 +62,10 @@ namespace Steamworks.Data internal static readonly InventoryItemId k_SteamItemInstanceIDInvalid = ~default(ulong); internal static readonly SteamInventoryResult_t k_SteamInventoryResultInvalid = - 1; internal static readonly SteamInventoryUpdateHandle_t k_SteamInventoryUpdateHandleInvalid = 0xffffffffffffffff; + internal static readonly uint k_unMaxTimelinePriority = 1000; + internal static readonly uint k_unTimelinePriority_KeepCurrentValue = 1000000; + internal static readonly float k_flMaxTimelineEventDuration = 600.0f; + internal static readonly uint k_cchMaxPhaseIDLength = 64; internal static readonly Connection k_HSteamNetConnection_Invalid = 0; internal static readonly Socket k_HSteamListenSocket_Invalid = 0; internal static readonly HSteamNetPollGroup k_HSteamNetPollGroup_Invalid = 0; diff --git a/Libraries/Facepunch.Steamworks/Generated/SteamEnums.cs b/Libraries/Facepunch.Steamworks/Generated/SteamEnums.cs index 0dc3329ac..f1df9ef88 100644 --- a/Libraries/Facepunch.Steamworks/Generated/SteamEnums.cs +++ b/Libraries/Facepunch.Steamworks/Generated/SteamEnums.cs @@ -160,6 +160,9 @@ namespace Steamworks ChargerRequired = 125, CachedCredentialInvalid = 126, K_EResultPhoneNumberIsVOIP = 127, + NotSupported = 128, + FamilySizeLimitExceeded = 129, + OfflineAppCacheInvalid = 130, } // @@ -421,6 +424,19 @@ namespace Steamworks OnlineHighPri = 3, } + // + // EBetaBranchFlags + // + internal enum BetaBranchFlags : int + { + None = 0, + Default = 1, + Available = 2, + Private = 4, + Selected = 8, + Installed = 16, + } + // // EGameSearchErrorCode_t // @@ -800,7 +816,8 @@ namespace Steamworks SteamworksAccessInvite = 13, SteamVideo = 14, GameManagedItem = 15, - Max = 16, + Clip = 16, + Max = 17, } // @@ -1460,7 +1477,11 @@ namespace Steamworks SteamDeck_Reserved18 = 403, SteamDeck_Reserved19 = 404, SteamDeck_Reserved20 = 405, - Count = 406, + Horipad_M1 = 406, + Horipad_M2 = 407, + Horipad_L4 = 408, + Horipad_R4 = 409, + Count = 410, MaximumPossibleValue = 32767, } @@ -1997,7 +2018,11 @@ namespace Steamworks PS5_RightGrip = 383, PS5_LeftFn = 384, PS5_RightFn = 385, - Count = 386, + Horipad_M1 = 386, + Horipad_M2 = 387, + Horipad_L4 = 388, + Horipad_R4 = 389, + Count = 390, MaximumPossibleValue = 32767, } @@ -2113,6 +2138,7 @@ namespace Steamworks NeedsUpdate = 8, Downloading = 16, DownloadPending = 32, + DisabledLocally = 64, } // @@ -2145,6 +2171,7 @@ namespace Steamworks Sketchfab = 2, EnvironmentMap_HorizontalCross = 3, EnvironmentMap_LatLong = 4, + Clip = 5, ReservedMax = 255, } @@ -2170,6 +2197,30 @@ namespace Steamworks Consumed = 512, } + // + // ETimelineGameMode + // + public enum TimelineGameMode : int + { + Invalid = 0, + Playing = 1, + Staging = 2, + Menus = 3, + LoadingScreen = 4, + Max = 5, + } + + // + // ETimelineEventClipPriority + // + public enum TimelineEventClipPriority : int + { + Invalid = 0, + None = 1, + Standard = 2, + Featured = 3, + } + // // EParentalFeature // @@ -2189,8 +2240,9 @@ namespace Steamworks Library = 11, Test = 12, SiteLicense = 13, - KioskMode = 14, - Max = 15, + KioskMode_Deprecated = 14, + BlockAlways = 15, + Max = 16, } // @@ -2203,6 +2255,7 @@ namespace Steamworks Tablet = 2, Computer = 3, TV = 4, + VRHeadset = 5, } // @@ -2231,7 +2284,6 @@ namespace Steamworks SteamID = 16, XboxPairwiseID = 17, SonyPSN = 18, - GoogleStadia = 19, IPAddress = 1, GenericString = 2, GenericBytes = 3, @@ -2337,11 +2389,16 @@ namespace Steamworks TimeoutInitial = 24, TimeoutConnected = 25, SendBufferSize = 9, + RecvBufferSize = 47, + RecvBufferMessages = 48, + RecvMaxMessageSize = 49, + RecvMaxSegmentsPerPacket = 50, ConnectionUserData = 40, SendRateMin = 10, SendRateMax = 11, NagleTime = 12, IP_AllowWithoutAuth = 23, + IPLocalHost_AllowWithoutAuth = 52, MTU_PacketSize = 32, MTU_DataSize = 33, Unencrypted = 34, @@ -2349,10 +2406,17 @@ namespace Steamworks LocalVirtualPort = 38, DualWifi_Enable = 39, EnableDiagnosticsUI = 46, + SendTimeSincePreviousPacket = 59, FakePacketLoss_Send = 2, FakePacketLoss_Recv = 3, FakePacketLag_Send = 4, FakePacketLag_Recv = 5, + FakePacketJitter_Send_Avg = 53, + FakePacketJitter_Send_Max = 54, + FakePacketJitter_Send_Pct = 55, + FakePacketJitter_Recv_Avg = 56, + FakePacketJitter_Recv_Max = 57, + FakePacketJitter_Recv_Pct = 58, FakePacketReorder_Send = 6, FakePacketReorder_Recv = 7, FakePacketReorder_Time = 8, @@ -2364,6 +2428,7 @@ namespace Steamworks FakeRateLimit_Send_Burst = 43, FakeRateLimit_Recv_Rate = 44, FakeRateLimit_Recv_Burst = 45, + OutOfOrderCorrectionWindowMicroseconds = 51, Callback_ConnectionStatusChanged = 201, Callback_AuthStatusChanged = 202, Callback_RelayNetworkStatusChanged = 203, @@ -2384,15 +2449,17 @@ namespace Steamworks SDRClient_MinPingsBeforePingAccurate = 21, SDRClient_SingleSocket = 22, SDRClient_ForceRelayCluster = 29, - SDRClient_DebugTicketAddress = 30, + SDRClient_DevTicket = 30, SDRClient_ForceProxyAddr = 31, SDRClient_FakeClusterPing = 36, + SDRClient_LimitPingProbesToNearestN = 60, LogLevel_AckRTT = 13, LogLevel_PacketDecode = 14, LogLevel_Message = 15, LogLevel_PacketGaps = 16, LogLevel_P2PRendezvous = 17, LogLevel_SDRRelayPings = 18, + ECN = 999, DELETED_EnumerateDevVars = 35, } @@ -2424,6 +2491,17 @@ namespace Steamworks Everything = 8, } + // + // ESteamAPIInitResult + // + internal enum SteamAPIInitResult : int + { + OK = 0, + FailedGeneric = 1, + NoSteamClient = 2, + VersionMismatch = 3, + } + // // EServerMode // diff --git a/Libraries/Facepunch.Steamworks/Generated/SteamStructFunctions.cs b/Libraries/Facepunch.Steamworks/Generated/SteamStructFunctions.cs index e7f5294bc..c2af43c46 100644 --- a/Libraries/Facepunch.Steamworks/Generated/SteamStructFunctions.cs +++ b/Libraries/Facepunch.Steamworks/Generated/SteamStructFunctions.cs @@ -15,7 +15,7 @@ namespace Steamworks.Data internal static extern Utf8StringPointer InternalGetName( ref gameserveritem_t self ); [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_gameserveritem_t_SetName", CallingConvention = Platform.CC)] - internal static extern void InternalSetName( ref gameserveritem_t self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pName ); + internal static extern void InternalSetName( ref gameserveritem_t self, IntPtr pName ); } @@ -103,7 +103,7 @@ namespace Steamworks.Data internal static extern void InternalSetPtr( ref NetKeyValue self, NetConfig eVal, IntPtr data ); [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingConfigValue_t_SetString", CallingConvention = Platform.CC)] - internal static extern void InternalSetString( ref NetKeyValue self, NetConfig eVal, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string data ); + internal static extern void InternalSetString( ref NetKeyValue self, NetConfig eVal, IntPtr data ); } @@ -130,7 +130,7 @@ namespace Steamworks.Data [return: MarshalAs( UnmanagedType.I1 )] [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIdentity_SetXboxPairwiseID", CallingConvention = Platform.CC)] - internal static extern bool InternalSetXboxPairwiseID( ref NetIdentity self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszString ); + internal static extern bool InternalSetXboxPairwiseID( ref NetIdentity self, IntPtr pszString ); [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIdentity_GetXboxPairwiseID", CallingConvention = Platform.CC)] internal static extern Utf8StringPointer InternalGetXboxPairwiseID( ref NetIdentity self ); @@ -141,12 +141,6 @@ namespace Steamworks.Data [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIdentity_GetPSNID", CallingConvention = Platform.CC)] internal static extern ulong InternalGetPSNID( ref NetIdentity self ); - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIdentity_SetStadiaID", CallingConvention = Platform.CC)] - internal static extern void InternalSetStadiaID( ref NetIdentity self, ulong id ); - - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIdentity_GetStadiaID", CallingConvention = Platform.CC)] - internal static extern ulong InternalGetStadiaID( ref NetIdentity self ); - [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIdentity_SetIPAddr", CallingConvention = Platform.CC)] internal static extern void InternalSetIPAddr( ref NetIdentity self, ref NetAddress addr ); @@ -175,7 +169,7 @@ namespace Steamworks.Data [return: MarshalAs( UnmanagedType.I1 )] [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIdentity_SetGenericString", CallingConvention = Platform.CC)] - internal static extern bool InternalSetGenericString( ref NetIdentity self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszString ); + internal static extern bool InternalSetGenericString( ref NetIdentity self, IntPtr pszString ); [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIdentity_GetGenericString", CallingConvention = Platform.CC)] internal static extern Utf8StringPointer InternalGetGenericString( ref NetIdentity self ); @@ -196,7 +190,7 @@ namespace Steamworks.Data [return: MarshalAs( UnmanagedType.I1 )] [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIdentity_ParseString", CallingConvention = Platform.CC)] - internal static extern bool InternalParseString( ref NetIdentity self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszStr ); + internal static extern bool InternalParseString( ref NetIdentity self, IntPtr pszStr ); } @@ -234,7 +228,7 @@ namespace Steamworks.Data [return: MarshalAs( UnmanagedType.I1 )] [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIPAddr_ParseString", CallingConvention = Platform.CC)] - internal static extern bool InternalParseString( ref NetAddress self, [MarshalAs( UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof( Utf8StringToNative ) )] string pszStr ); + internal static extern bool InternalParseString( ref NetAddress self, IntPtr pszStr ); [return: MarshalAs( UnmanagedType.I1 )] [DllImport( Platform.LibraryName, EntryPoint = "SteamAPI_SteamNetworkingIPAddr_IsEqualTo", CallingConvention = Platform.CC)] diff --git a/Libraries/Facepunch.Steamworks/Generated/SteamStructs.cs b/Libraries/Facepunch.Steamworks/Generated/SteamStructs.cs index 8724de68a..f4314023d 100644 --- a/Libraries/Facepunch.Steamworks/Generated/SteamStructs.cs +++ b/Libraries/Facepunch.Steamworks/Generated/SteamStructs.cs @@ -35,13 +35,13 @@ namespace Steamworks.Data internal bool HadSuccessfulResponse; // m_bHadSuccessfulResponse bool [MarshalAs(UnmanagedType.I1)] internal bool DoNotRefresh; // m_bDoNotRefresh bool - internal string GameDirUTF8() => System.Text.Encoding.UTF8.GetString( GameDir, 0, System.Array.IndexOf( GameDir, 0 ) ); + internal string GameDirUTF8() => Steamworks.Utility.Utf8NoBom.GetString( GameDir, 0, System.Array.IndexOf( GameDir, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] // byte[] m_szGameDir internal byte[] GameDir; // m_szGameDir char [32] - internal string MapUTF8() => System.Text.Encoding.UTF8.GetString( Map, 0, System.Array.IndexOf( Map, 0 ) ); + internal string MapUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Map, 0, System.Array.IndexOf( Map, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] // byte[] m_szMap internal byte[] Map; // m_szMap char [32] - internal string GameDescriptionUTF8() => System.Text.Encoding.UTF8.GetString( GameDescription, 0, System.Array.IndexOf( GameDescription, 0 ) ); + internal string GameDescriptionUTF8() => Steamworks.Utility.Utf8NoBom.GetString( GameDescription, 0, System.Array.IndexOf( GameDescription, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] // byte[] m_szGameDescription internal byte[] GameDescription; // m_szGameDescription char [64] internal uint AppID; // m_nAppID uint32 @@ -54,10 +54,10 @@ namespace Steamworks.Data internal bool Secure; // m_bSecure bool internal uint TimeLastPlayed; // m_ulTimeLastPlayed uint32 internal int ServerVersion; // m_nServerVersion int - internal string ServerNameUTF8() => System.Text.Encoding.UTF8.GetString( ServerName, 0, System.Array.IndexOf( ServerName, 0 ) ); + internal string ServerNameUTF8() => Steamworks.Utility.Utf8NoBom.GetString( ServerName, 0, System.Array.IndexOf( ServerName, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] // byte[] m_szServerName internal byte[] ServerName; // m_szServerName char [64] - internal string GameTagsUTF8() => System.Text.Encoding.UTF8.GetString( GameTags, 0, System.Array.IndexOf( GameTags, 0 ) ); + internal string GameTagsUTF8() => Steamworks.Utility.Utf8NoBom.GetString( GameTags, 0, System.Array.IndexOf( GameTags, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] // byte[] m_szGameTags internal byte[] GameTags; // m_szGameTags char [128] internal ulong SteamID; // m_steamID CSteamID @@ -105,30 +105,6 @@ namespace Steamworks.Data } - [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] - internal struct InputMotionDataV2_t - { - internal float DriftCorrectedQuatX; // driftCorrectedQuatX float - internal float DriftCorrectedQuatY; // driftCorrectedQuatY float - internal float DriftCorrectedQuatZ; // driftCorrectedQuatZ float - internal float DriftCorrectedQuatW; // driftCorrectedQuatW float - internal float SensorFusionQuatX; // sensorFusionQuatX float - internal float SensorFusionQuatY; // sensorFusionQuatY float - internal float SensorFusionQuatZ; // sensorFusionQuatZ float - internal float SensorFusionQuatW; // sensorFusionQuatW float - internal float DeferredSensorFusionQuatX; // deferredSensorFusionQuatX float - internal float DeferredSensorFusionQuatY; // deferredSensorFusionQuatY float - internal float DeferredSensorFusionQuatZ; // deferredSensorFusionQuatZ float - internal float DeferredSensorFusionQuatW; // deferredSensorFusionQuatW float - internal float GravityX; // gravityX float - internal float GravityY; // gravityY float - internal float GravityZ; // gravityZ float - internal float DegreesPerSecondX; // degreesPerSecondX float - internal float DegreesPerSecondY; // degreesPerSecondY float - internal float DegreesPerSecondZ; // degreesPerSecondZ float - - } - [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPlatformPackSize )] internal struct SteamInputActionEvent_t { @@ -146,10 +122,10 @@ namespace Steamworks.Data internal WorkshopFileType FileType; // m_eFileType EWorkshopFileType internal AppId CreatorAppID; // m_nCreatorAppID AppId_t internal AppId ConsumerAppID; // m_nConsumerAppID AppId_t - internal string TitleUTF8() => System.Text.Encoding.UTF8.GetString( Title, 0, System.Array.IndexOf( Title, 0 ) ); + internal string TitleUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Title, 0, System.Array.IndexOf( Title, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 129)] // byte[] m_rgchTitle internal byte[] Title; // m_rgchTitle char [129] - internal string DescriptionUTF8() => System.Text.Encoding.UTF8.GetString( Description, 0, System.Array.IndexOf( Description, 0 ) ); + internal string DescriptionUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Description, 0, System.Array.IndexOf( Description, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8000)] // byte[] m_rgchDescription internal byte[] Description; // m_rgchDescription char [8000] internal ulong SteamIDOwner; // m_ulSteamIDOwner uint64 @@ -163,23 +139,24 @@ namespace Steamworks.Data internal bool AcceptedForUse; // m_bAcceptedForUse bool [MarshalAs(UnmanagedType.I1)] internal bool TagsTruncated; // m_bTagsTruncated bool - internal string TagsUTF8() => System.Text.Encoding.UTF8.GetString( Tags, 0, System.Array.IndexOf( Tags, 0 ) ); + internal string TagsUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Tags, 0, System.Array.IndexOf( Tags, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1025)] // byte[] m_rgchTags internal byte[] Tags; // m_rgchTags char [1025] internal ulong File; // m_hFile UGCHandle_t internal ulong PreviewFile; // m_hPreviewFile UGCHandle_t - internal string PchFileNameUTF8() => System.Text.Encoding.UTF8.GetString( PchFileName, 0, System.Array.IndexOf( PchFileName, 0 ) ); + internal string PchFileNameUTF8() => Steamworks.Utility.Utf8NoBom.GetString( PchFileName, 0, System.Array.IndexOf( PchFileName, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)] // byte[] m_pchFileName internal byte[] PchFileName; // m_pchFileName char [260] internal int FileSize; // m_nFileSize int32 internal int PreviewFileSize; // m_nPreviewFileSize int32 - internal string URLUTF8() => System.Text.Encoding.UTF8.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); + internal string URLUTF8() => Steamworks.Utility.Utf8NoBom.GetString( URL, 0, System.Array.IndexOf( URL, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] // byte[] m_rgchURL internal byte[] URL; // m_rgchURL char [256] internal uint VotesUp; // m_unVotesUp uint32 internal uint VotesDown; // m_unVotesDown uint32 internal float Score; // m_flScore float internal uint NumChildren; // m_unNumChildren uint32 + internal ulong TotalFilesSize; // m_ulTotalFilesSize uint64 } @@ -197,7 +174,7 @@ namespace Steamworks.Data internal partial struct SteamDatagramHostedAddress { internal int CbSize; // m_cbSize int - internal string DataUTF8() => System.Text.Encoding.UTF8.GetString( Data, 0, System.Array.IndexOf( Data, 0 ) ); + internal string DataUTF8() => Steamworks.Utility.Utf8NoBom.GetString( Data, 0, System.Array.IndexOf( Data, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] // byte[] m_data internal byte[] Data; // m_data char [128] @@ -211,7 +188,7 @@ namespace Steamworks.Data internal AppId AppID; // m_nAppID AppId_t internal uint Time; // m_rtime RTime32 internal int CbAppData; // m_cbAppData int - internal string AppDataUTF8() => System.Text.Encoding.UTF8.GetString( AppData, 0, System.Array.IndexOf( AppData, 0 ) ); + internal string AppDataUTF8() => Steamworks.Utility.Utf8NoBom.GetString( AppData, 0, System.Array.IndexOf( AppData, 0 ) ); [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2048)] // byte[] m_appData internal byte[] AppData; // m_appData char [2048] diff --git a/Libraries/Facepunch.Steamworks/Generated/SteamTypes.cs b/Libraries/Facepunch.Steamworks/Generated/SteamTypes.cs index 5f5085f04..9aaaa645f 100644 --- a/Libraries/Facepunch.Steamworks/Generated/SteamTypes.cs +++ b/Libraries/Facepunch.Steamworks/Generated/SteamTypes.cs @@ -598,6 +598,22 @@ namespace Steamworks.Data public int CompareTo( SteamInventoryUpdateHandle_t other ) => Value.CompareTo( other.Value ); } + public struct TimelineEventHandle : IEquatable, IComparable + { + // Name: TimelineEventHandle_t, Type: unsigned long long + public ulong Value; + + public static implicit operator TimelineEventHandle( ulong value ) => new TimelineEventHandle(){ Value = value }; + public static implicit operator ulong( TimelineEventHandle value ) => value.Value; + public override string ToString() => Value.ToString(); + public override int GetHashCode() => Value.GetHashCode(); + public override bool Equals( object p ) => this.Equals( (TimelineEventHandle) p ); + public bool Equals( TimelineEventHandle p ) => p.Value == Value; + public static bool operator ==( TimelineEventHandle a, TimelineEventHandle b ) => a.Equals( b ); + public static bool operator !=( TimelineEventHandle a, TimelineEventHandle b ) => !a.Equals( b ); + public int CompareTo( TimelineEventHandle other ) => Value.CompareTo( other.Value ); + } + internal struct RemotePlaySessionID_t : IEquatable, IComparable { // Name: RemotePlaySessionID_t, Type: unsigned int diff --git a/Libraries/Facepunch.Steamworks/Interfaces/ISteamMatchmakingServers.cs b/Libraries/Facepunch.Steamworks/Interfaces/ISteamMatchmakingServers.cs new file mode 100644 index 000000000..070ee12ef --- /dev/null +++ b/Libraries/Facepunch.Steamworks/Interfaces/ISteamMatchmakingServers.cs @@ -0,0 +1,42 @@ +using Steamworks.Data; +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Steamworks +{ + internal partial class ISteamMatchmakingServers + { + // Cached offset of gameserveritem_t.m_bHadSuccessfulResponse + private static int hasSuccessfulResponseOffset; + + /// + /// Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap + /// + /// + /// + /// + internal bool HasServerResponded( HServerListRequest hRequest, int iServer ) + { + IntPtr returnValue = _GetServerDetails( Self, hRequest, iServer ); + + // Return false if steam returned null + if ( returnValue == IntPtr.Zero ) return false; + + // Cache the offset of m_bHadSuccessfulResponse + if ( hasSuccessfulResponseOffset == 0 ) + { + hasSuccessfulResponseOffset = Marshal.OffsetOf( nameof( gameserveritem_t.HadSuccessfulResponse ) ).ToInt32(); + + if ( hasSuccessfulResponseOffset == 0 ) + { + throw new Exception( "Failed to get offset of gameserveritem_t.HadSuccessfulResponse" ); + } + } + + // Read byte m_bHadSuccessfulResponse + return Marshal.ReadByte( IntPtr.Add( returnValue, hasSuccessfulResponseOffset ) ) == 1; + } + } +} diff --git a/Libraries/Facepunch.Steamworks/Networking/Connection.cs b/Libraries/Facepunch.Steamworks/Networking/Connection.cs index d1069a693..f64e298ce 100644 --- a/Libraries/Facepunch.Steamworks/Networking/Connection.cs +++ b/Libraries/Facepunch.Steamworks/Networking/Connection.cs @@ -124,7 +124,7 @@ namespace Steamworks.Data /// public unsafe Result SendMessage( string str, SendType sendType = SendType.Reliable, ushort laneIndex = 0 ) { - var bytes = System.Text.Encoding.UTF8.GetBytes( str ); + var bytes = Utility.Utf8NoBom.GetBytes( str ); return SendMessage( bytes, sendType, laneIndex ); } diff --git a/Libraries/Facepunch.Steamworks/Networking/ConnectionManager.cs b/Libraries/Facepunch.Steamworks/Networking/ConnectionManager.cs index 3116fa804..f996ac53d 100644 --- a/Libraries/Facepunch.Steamworks/Networking/ConnectionManager.cs +++ b/Libraries/Facepunch.Steamworks/Networking/ConnectionManager.cs @@ -249,7 +249,7 @@ namespace Steamworks /// public void SendMessages( Connection[] connections, int connectionCount, string str, SendType sendType = SendType.Reliable, Result[]? results = null ) { - var bytes = System.Text.Encoding.UTF8.GetBytes( str ); + var bytes = Utility.Utf8NoBom.GetBytes( str ); SendMessages( connections, connectionCount, bytes, sendType, results ); } diff --git a/Libraries/Facepunch.Steamworks/ServerList/Base.cs b/Libraries/Facepunch.Steamworks/ServerList/Base.cs index eaf66449a..40057b9fe 100644 --- a/Libraries/Facepunch.Steamworks/ServerList/Base.cs +++ b/Libraries/Facepunch.Steamworks/ServerList/Base.cs @@ -46,6 +46,7 @@ namespace Steamworks.ServerList /// public List Unresponsive = new List(); + public List Unqueried = new List(); public Base() { @@ -139,7 +140,7 @@ namespace Steamworks.ServerList } } - public void Dispose() + public virtual void Dispose() { ReleaseQuery(); } @@ -167,12 +168,18 @@ namespace Steamworks.ServerList watchList.RemoveAll( x => { if (Internal is null) { return true; } - - var info = Internal.GetServerDetails( request, x ); - if ( info.HadSuccessfulResponse ) + + // First check if the server has responded without allocating server info + bool hasResponded = Internal.HasServerResponded( request, x ); + if ( hasResponded ) { - OnServer( ServerInfo.From( info ), info.HadSuccessfulResponse ); - return true; + // Now get all server info + var info = Internal.GetServerDetails( request, x ); + if ( info.HadSuccessfulResponse ) + { + OnServer( ServerInfo.From( info ), info.HadSuccessfulResponse ); + return true; + } } return false; @@ -185,8 +192,10 @@ namespace Steamworks.ServerList { if (Internal is null) { return true; } - var info = Internal.GetServerDetails( request, x ); - OnServer( ServerInfo.From( info ), info.HadSuccessfulResponse ); + var details = Internal.GetServerDetails( request, x ); + var info = ServerInfo.From( details ); + info.Ping = int.MaxValue; + Unqueried.Add( info ); return true; } ); } @@ -206,4 +215,4 @@ namespace Steamworks.ServerList } } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/ServerList/Favourites.cs b/Libraries/Facepunch.Steamworks/ServerList/Favourites.cs index e71394570..22d4c426b 100644 --- a/Libraries/Facepunch.Steamworks/ServerList/Favourites.cs +++ b/Libraries/Facepunch.Steamworks/ServerList/Favourites.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; namespace Steamworks.ServerList { @@ -11,8 +7,8 @@ namespace Steamworks.ServerList internal override void LaunchQuery() { if (Internal is null) { return; } - var filters = GetFilters(); - request = Internal.RequestFavoritesServerList( AppId.Value, ref filters, (uint)filters.Length, IntPtr.Zero ); + using var filters = new ServerFilterMarshaler( GetFilters() ); + request = Internal.RequestFavoritesServerList( AppId.Value, filters.Pointer, (uint)filters.Count, IntPtr.Zero ); } } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/ServerList/Friends.cs b/Libraries/Facepunch.Steamworks/ServerList/Friends.cs index 60d72e31c..6365d3b87 100644 --- a/Libraries/Facepunch.Steamworks/ServerList/Friends.cs +++ b/Libraries/Facepunch.Steamworks/ServerList/Friends.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; namespace Steamworks.ServerList { @@ -11,8 +7,8 @@ namespace Steamworks.ServerList internal override void LaunchQuery() { if (Internal is null) { return; } - var filters = GetFilters(); - request = Internal.RequestFriendsServerList( AppId.Value, ref filters, (uint)filters.Length, IntPtr.Zero ); + using var filters = new ServerFilterMarshaler( GetFilters() ); + request = Internal.RequestFriendsServerList( AppId.Value, filters.Pointer, (uint)filters.Count, IntPtr.Zero ); } } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/ServerList/History.cs b/Libraries/Facepunch.Steamworks/ServerList/History.cs index 3d059767e..d73ccf8b3 100644 --- a/Libraries/Facepunch.Steamworks/ServerList/History.cs +++ b/Libraries/Facepunch.Steamworks/ServerList/History.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; namespace Steamworks.ServerList { @@ -11,8 +7,8 @@ namespace Steamworks.ServerList internal override void LaunchQuery() { if (Internal is null) { return; } - var filters = GetFilters(); - request = Internal.RequestHistoryServerList( AppId.Value, ref filters, (uint)filters.Length, IntPtr.Zero ); + using var filters = new ServerFilterMarshaler( GetFilters() ); + request = Internal.RequestHistoryServerList( AppId.Value, filters.Pointer, (uint)filters.Count, IntPtr.Zero ); } } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/ServerList/Internet.cs b/Libraries/Facepunch.Steamworks/ServerList/Internet.cs index c493b26fa..c138d3977 100644 --- a/Libraries/Facepunch.Steamworks/ServerList/Internet.cs +++ b/Libraries/Facepunch.Steamworks/ServerList/Internet.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; namespace Steamworks.ServerList { @@ -10,9 +6,9 @@ namespace Steamworks.ServerList { internal override void LaunchQuery() { - if (Internal is null) { return; } - var filters = GetFilters(); - request = Internal.RequestInternetServerList( AppId.Value, filters, (uint)filters.Length, IntPtr.Zero ); + if ( Internal is null ) { return; } + using var filters = new ServerFilterMarshaler( GetFilters() ); + request = Internal.RequestInternetServerList( AppId.Value, filters.Pointer, (uint)filters.Count, IntPtr.Zero ); } } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/ServerList/IpList.cs b/Libraries/Facepunch.Steamworks/ServerList/IpList.cs index c76e88cf7..aa7412bca 100644 --- a/Libraries/Facepunch.Steamworks/ServerList/IpList.cs +++ b/Libraries/Facepunch.Steamworks/ServerList/IpList.cs @@ -1,9 +1,5 @@ -using Steamworks.Data; -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Runtime.InteropServices; -using System.Text; using System.Threading.Tasks; namespace Steamworks.ServerList @@ -30,15 +26,17 @@ namespace Steamworks.ServerList var ips = Ips.ToArray(); - while ( true ) + wantsCancel = false; + + while ( !wantsCancel ) { - var sublist = ips.Skip( pointer ).Take( blockSize ); - if ( sublist.Count() == 0 ) + var sublist = ips.Skip( pointer ).Take( blockSize ).ToList(); + if ( sublist.Count == 0 ) break; using ( var list = new ServerList.Internet() ) { - list.AddFilter( "or", sublist.Count().ToString() ); + list.AddFilter( "or", sublist.Count.ToString() ); foreach ( var server in sublist ) { @@ -47,9 +45,6 @@ namespace Steamworks.ServerList await list.RunQueryAsync( timeoutSeconds ); - if ( wantsCancel ) - return false; - Responsive.AddRange( list.Responsive ); Responsive = Responsive.Distinct().ToList(); Unresponsive.AddRange( list.Unresponsive ); @@ -64,9 +59,17 @@ namespace Steamworks.ServerList return true; } + // note: Cancel doesn't get called in Dispose because request is always null for this class public override void Cancel() { wantsCancel = true; } + + public override void Dispose() + { + base.Dispose(); + + wantsCancel = true; + } } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/ServerList/LocalNetwork.cs b/Libraries/Facepunch.Steamworks/ServerList/LocalNetwork.cs index ed5d476c8..3c3dfbd6f 100644 --- a/Libraries/Facepunch.Steamworks/ServerList/LocalNetwork.cs +++ b/Libraries/Facepunch.Steamworks/ServerList/LocalNetwork.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; namespace Steamworks.ServerList { @@ -14,4 +10,4 @@ namespace Steamworks.ServerList request = Internal.RequestLANServerList( AppId.Value, IntPtr.Zero ); } } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/ServerList/ServerFilterMarshaler.cs b/Libraries/Facepunch.Steamworks/ServerList/ServerFilterMarshaler.cs new file mode 100644 index 000000000..c0baf6d6c --- /dev/null +++ b/Libraries/Facepunch.Steamworks/ServerList/ServerFilterMarshaler.cs @@ -0,0 +1,58 @@ +using System; +using System.Runtime.InteropServices; +using Steamworks.Data; + +namespace Steamworks.ServerList; + +internal struct ServerFilterMarshaler : IDisposable +{ + private static readonly int SizeOfPointer = Marshal.SizeOf(); + private static readonly int SizeOfKeyValuePair = Marshal.SizeOf(); + + private IntPtr _arrayPtr; + private IntPtr _itemsPtr; + + public int Count { get; private set; } + public IntPtr Pointer => _arrayPtr; + + public ServerFilterMarshaler( MatchMakingKeyValuePair[] filters ) + { + if ( filters == null || filters.Length == 0 ) + { + Count = 0; + _arrayPtr = IntPtr.Zero; + _itemsPtr = IntPtr.Zero; + return; + } + + Count = filters.Length; + _arrayPtr = Marshal.AllocHGlobal( SizeOfPointer * filters.Length ); + _itemsPtr = Marshal.AllocHGlobal( SizeOfKeyValuePair * filters.Length ); + + var arrayDst = _arrayPtr; + var itemDst = _itemsPtr; + foreach ( var filter in filters ) + { + Marshal.WriteIntPtr( arrayDst, itemDst ); + arrayDst += SizeOfPointer; + + Marshal.StructureToPtr( filter, itemDst, false ); + itemDst += SizeOfKeyValuePair; + } + } + + public void Dispose() + { + if ( _arrayPtr != IntPtr.Zero ) + { + Marshal.FreeHGlobal( _arrayPtr ); + _arrayPtr = IntPtr.Zero; + } + + if ( _itemsPtr != IntPtr.Zero ) + { + Marshal.FreeHGlobal( _itemsPtr ); + _itemsPtr = IntPtr.Zero; + } + } +} diff --git a/Libraries/Facepunch.Steamworks/SteamApps.cs b/Libraries/Facepunch.Steamworks/SteamApps.cs index 80359e884..002a724ba 100644 --- a/Libraries/Facepunch.Steamworks/SteamApps.cs +++ b/Libraries/Facepunch.Steamworks/SteamApps.cs @@ -20,6 +20,8 @@ namespace Steamworks SetInterface( server, new ISteamApps( server ) ); if ( Interface is null || Interface.Self == IntPtr.Zero ) return false; + InstallEvents(); + return true; } diff --git a/Libraries/Facepunch.Steamworks/SteamClient.cs b/Libraries/Facepunch.Steamworks/SteamClient.cs index f0db1417c..1e8537e38 100644 --- a/Libraries/Facepunch.Steamworks/SteamClient.cs +++ b/Libraries/Facepunch.Steamworks/SteamClient.cs @@ -23,9 +23,32 @@ namespace Steamworks System.Environment.SetEnvironmentVariable( "SteamAppId", appid.ToString() ); System.Environment.SetEnvironmentVariable( "SteamGameId", appid.ToString() ); - if ( !SteamAPI.Init() ) + var interfaceVersions = Helpers.BuildVersionString( + ISteamApps.Version, + ISteamFriends.Version, + ISteamInput.Version, + ISteamInventory.Version, + ISteamMatchmaking.Version, + ISteamMatchmakingServers.Version, + ISteamMusic.Version, + ISteamNetworking.Version, + ISteamNetworkingSockets.Version, + ISteamNetworkingUtils.Version, + ISteamParentalSettings.Version, + ISteamParties.Version, + ISteamRemoteStorage.Version, + ISteamScreenshots.Version, + ISteamUGC.Version, + ISteamUser.Version, + ISteamUserStats.Version, + ISteamUtils.Version, + ISteamVideo.Version, + ISteamRemotePlay.Version, + ISteamTimeline.Version ); + var result = SteamAPI.Init( interfaceVersions, out var error ); + if ( result != SteamAPIInitResult.OK ) { - throw new System.Exception( "SteamApi_Init returned false. Steam isn't running, couldn't find Steam, App ID is ureleased, Don't own App ID." ); + throw new System.Exception( $"SteamApi_Init failed with {result} - error: {error}" ); } AppId = appid; @@ -33,12 +56,12 @@ namespace Steamworks initialized = true; // - // Dispatch is responsible for pumping the - // event loop. + // Dispatch is responsible for pumping the event loop. // Dispatch.Init(); Dispatch.ClientPipe = SteamAPI.GetHSteamPipe(); + // Note: don't forget to add the interface version to SteamAPI.Init above!!! AddInterface(); AddInterface(); AddInterface(); @@ -59,6 +82,8 @@ namespace Steamworks AddInterface(); AddInterface(); AddInterface(); + AddInterface(); + // Note: don't forget to add the interface version to SteamAPI.Init above!!! initialized = openInterfaces.Count > 0; diff --git a/Libraries/Facepunch.Steamworks/SteamNetworkingUtils.cs b/Libraries/Facepunch.Steamworks/SteamNetworkingUtils.cs index 4de408956..15927df32 100644 --- a/Libraries/Facepunch.Steamworks/SteamNetworkingUtils.cs +++ b/Libraries/Facepunch.Steamworks/SteamNetworkingUtils.cs @@ -457,7 +457,7 @@ namespace Steamworks internal unsafe static bool SetConfigString( NetConfig type, string value ) { - var bytes = Encoding.UTF8.GetBytes( value ); + var bytes = Utility.Utf8NoBom.GetBytes( value ); fixed ( byte* ptr = bytes ) { @@ -500,7 +500,7 @@ namespace Steamworks internal unsafe static bool SetConnectionConfig( uint con, NetConfig type, string value ) { - var bytes = Encoding.UTF8.GetBytes( value ); + var bytes = Utility.Utf8NoBom.GetBytes( value ); fixed ( byte* ptr = bytes ) { diff --git a/Libraries/Facepunch.Steamworks/SteamServer.cs b/Libraries/Facepunch.Steamworks/SteamServer.cs index e4543dd1e..c9b4b2866 100644 --- a/Libraries/Facepunch.Steamworks/SteamServer.cs +++ b/Libraries/Facepunch.Steamworks/SteamServer.cs @@ -83,14 +83,24 @@ namespace Steamworks // // Get other interfaces // - if ( !SteamInternal.GameServer_Init( ipaddress, 0, init.GamePort, init.QueryPort, (int)init.Mode, init.VersionString ) ) + var interfaceVersions = Helpers.BuildVersionString( + ISteamGameServer.Version, + ISteamUtils.Version, + ISteamNetworking.Version, + ISteamGameServerStats.Version, + ISteamInventory.Version, + ISteamUGC.Version, + ISteamApps.Version, + ISteamNetworkingUtils.Version, + ISteamNetworkingSockets.Version ); + var result = SteamInternal.GameServer_Init( ipaddress, init.GamePort, init.QueryPort, (int)init.Mode, init.VersionString, interfaceVersions, out var error ); + if ( result != SteamAPIInitResult.OK ) { - throw new System.Exception( $"InitGameServer returned false ({ipaddress},{0},{init.GamePort},{init.QueryPort},{init.Mode},\"{init.VersionString}\")" ); + throw new System.Exception( $"InitGameServer({ipaddress},{init.GamePort},{init.QueryPort},{init.Mode},\"{init.VersionString}\") returned false - error: {error}" ); } // - // Dispatch is responsible for pumping the - // event loop. + // Dispatch is responsible for pumping the event loop. // Dispatch.Init(); Dispatch.ServerPipe = SteamGameServer.GetHSteamPipe(); diff --git a/Libraries/Facepunch.Steamworks/SteamTimeline.cs b/Libraries/Facepunch.Steamworks/SteamTimeline.cs new file mode 100644 index 000000000..f7a30b895 --- /dev/null +++ b/Libraries/Facepunch.Steamworks/SteamTimeline.cs @@ -0,0 +1,221 @@ +using System; +using System.Threading.Tasks; +using Steamworks.Data; + +namespace Steamworks; + +public class SteamTimeline : SteamClientClass +{ + internal static ISteamTimeline? Internal => Interface as ISteamTimeline; + + internal override bool InitializeInterface( bool server ) + { + SetInterface( server, new ISteamTimeline( server ) ); + if ( Interface is null ) return false; + if ( Interface.Self == IntPtr.Zero ) return false; + + InstallEvents(); + return true; + } + + internal static void InstallEvents() + { + } + + /// + /// Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a + /// new state description replaces any previous description. + /// + public static void SetTimelineTooltip( string description, float timeOffsetSeconds ) + { + if ( Internal is null ) { return; } + Internal.SetTimelineTooltip( description, timeOffsetSeconds ); + } + + /// + /// Clears the previous set game state in the timeline. + /// + public static void ClearTimelineTooltip( float timeOffsetSeconds ) + { + if ( Internal is null ) { return; } + Internal.ClearTimelineTooltip( timeOffsetSeconds ); + } + + /// + /// Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.) + /// + public static TimelineEventHandle AddInstantaneousTimelineEvent( string title, string description, string icon, + uint priority, float startOffsetSeconds, TimelineEventClipPriority possibleClip ) + { + if ( Internal is null ) { return default; } + return Internal.AddInstantaneousTimelineEvent( title, description, icon, priority, startOffsetSeconds, + possibleClip ); + } + + /// + /// Use this to mark an event on the Timeline that takes some amount of time to complete. + /// + public static TimelineEventHandle AddRangeTimelineEvent( string title, string description, string icon, + uint priority, float startOffsetSeconds, float durationSeconds, TimelineEventClipPriority possibleClip ) + { + if ( Internal is null ) { return default; } + return Internal.AddRangeTimelineEvent( title, description, icon, priority, startOffsetSeconds, durationSeconds, + possibleClip ); + } + + /// + /// Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call + /// to . If the game wants to cancel an event in progress, they can do that with a call to . + /// + public static TimelineEventHandle StartRangeTimelineEvent( string title, string description, string icon, + uint priority, + float startOffsetSeconds, TimelineEventClipPriority possibleClip ) + { + if ( Internal is null ) { return default; } + return Internal.StartRangeTimelineEvent( title, description, icon, priority, startOffsetSeconds, possibleClip ); + } + + /// + /// Use this to update the details of an event that was started with . + /// + public static void UpdateRangeTimelineEvent( TimelineEventHandle handle, string title, string description, + string icon, uint priority, TimelineEventClipPriority possibleClip ) + { + if ( Internal is null ) { return; } + Internal.UpdateRangeTimelineEvent( handle, title, description, icon, priority, possibleClip ); + } + + /// + /// Use this to identify the end of an event that was started with . + /// + public static void EndRangeTimelineEvent( TimelineEventHandle handle, float endOffsetSeconds ) + { + if ( Internal is null ) { return; } + Internal.EndRangeTimelineEvent( handle, endOffsetSeconds ); + } + + /// + /// Use this to remove a Timeline event that was previously added. + /// + public static void RemoveTimelineEvent( TimelineEventHandle handle ) + { + if ( Internal is null ) { return; } + Internal.RemoveTimelineEvent( handle ); + } + + /// + /// Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control + /// that will call . + /// + public static async Task DoesEventRecordingExist( TimelineEventHandle handle ) + { + if ( Internal is null ) { return false; } + var result = await Internal.DoesEventRecordingExist( handle ); + return result?.RecordingExists ?? false; + } + + /// + /// Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game + /// to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user + /// would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases + /// should be used to mark sections of gameplay that the user might be interested in watching. + /// + public static void StartGamePhase() + { + if ( Internal is null ) { return; } + Internal.StartGamePhase(); + } + + /// + /// Use this to end a game phase that was started with . + /// + public static void EndGamePhase() + { + if ( Internal is null ) { return; } + Internal.EndGamePhase(); + } + + /// + /// The phase ID is used to let the game identify which phase it is referring to in calls to or + /// . It may also be used to associated multiple phases with each other. + /// + /// A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc. + public static void SetGamePhaseId( string phaseId ) + { + if ( Internal is null ) { return; } + Internal.SetGamePhaseID( phaseId ); + } + + /// + /// Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call . + /// + public static async Task DoesGamePhaseRecordingExist( string phaseId ) + { + if ( Internal is null ) { return null; } + var result = await Internal.DoesGamePhaseRecordingExist( phaseId ); + if ( !result.HasValue ) + { + return null; + } + + var info = result.Value; + return new GamePhaseRecordingInfo + { + PhaseId = info.PhaseIDUTF8(), + RecordingMs = info.RecordingMS, + LongestClipMs = info.LongestClipMS, + ClipCount = info.ClipCount, + ScreenshotCount = info.ScreenshotCount, + }; + } + + /// + /// Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon + /// in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group, + /// with different names and icons for each boss defeated during the phase, all of which will be shown to the user. + /// + public static void AddGamePhaseTag( string tagName, string icon, string tagGroup, uint priority ) + { + if ( Internal is null ) { return; } + Internal.AddGamePhaseTag( tagName, icon, tagGroup, priority ); + } + + /// + /// Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata + /// that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character + /// name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user. + /// + public static void SetGamePhaseAttribute( string attributeGroup, string attributeValue, uint priority ) + { + if ( Internal is null ) { return; } + Internal.SetGamePhaseAttribute( attributeGroup, attributeValue, priority ); + } + + /// + /// Changes the color of the timeline bar. See for how to use each value. + /// + public static void SetTimelineGameMode( TimelineGameMode gameMode ) + { + if ( Internal is null ) { return; } + Internal.SetTimelineGameMode( gameMode ); + } + + /// + /// Opens the Steam overlay to the section of the timeline represented by the game phase. + /// + public static void OpenOverlayToGamePhase( string phaseId ) + { + if ( Internal is null ) { return; } + Internal.OpenOverlayToGamePhase( phaseId ); + } + + /// + /// Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not + /// valid for future runs of the game. + /// + public static void OpenOverlayToTimelineEvent( TimelineEventHandle handle ) + { + if ( Internal is null ) { return; } + Internal.OpenOverlayToTimelineEvent( handle ); + } +} diff --git a/Libraries/Facepunch.Steamworks/SteamUser.cs b/Libraries/Facepunch.Steamworks/SteamUser.cs index a0afe522a..0a9fc758b 100644 --- a/Libraries/Facepunch.Steamworks/SteamUser.cs +++ b/Libraries/Facepunch.Steamworks/SteamUser.cs @@ -43,7 +43,7 @@ namespace Steamworks Dispatch.Install( x => OnMicroTxnAuthorizationResponse?.Invoke( x.AppID, x.OrderID, x.Authorized != 0 ) ); Dispatch.Install( x => OnGameWebCallback?.Invoke( x.URLUTF8() ) ); Dispatch.Install( x => OnGetAuthSessionTicketResponse?.Invoke( x ) ); - Dispatch.Install( x => OnGetAuthTicketForWebApiResponse?.Invoke( x ) ); + Dispatch.Install( x => OnGetTicketForWebApiResponse?.Invoke( x ) ); Dispatch.Install( x => OnDurationControl?.Invoke( new DurationControl { _inner = x } ) ); } @@ -90,7 +90,7 @@ namespace Steamworks public static event Action? OnValidateAuthTicketResponse; /// - /// Used internally for . + /// Used internally for . /// internal static event Action? OnGetAuthSessionTicketResponse; @@ -99,6 +99,11 @@ namespace Steamworks /// internal static event Action? OnGetAuthTicketForWebApiResponse; + /// + /// Used internally for . + /// + internal static event Action? OnGetTicketForWebApiResponse; + ///
/// Invoked when a user has responded to a microtransaction authorization request. /// ( appid, orderid, user authorized ) @@ -332,49 +337,6 @@ namespace Steamworks } } - public static async Task GetAuthTicketForWebApi( string identity ) - { - if ( Internal is null ) { return null; } - - HAuthTicket handle = default; - AuthTicketForWebApi? ticket = null; - Result result = Result.Pending; - - Action responseHandler = response => - { - if ( response.Ticket == handle ) { return; } - - result = response.Result == Result.Pending - ? Result.Fail - : response.Result; - ticket = result == Result.OK - ? new AuthTicketForWebApi( - response.GubTicket.Take( response.Ticket ).ToArray(), - response.AuthTicket ) - : null; - }; - - OnGetAuthTicketForWebApiResponse += responseHandler; - try - { - handle = Internal.GetAuthTicketForWebApi( identity ); - - if ( handle == 0 ) { return null; } - - var timeout = DateTime.Now + TimeSpan.FromSeconds( 60f ); - while ( result == Result.Pending && DateTime.Now < timeout ) - { - await Task.Delay( 10 ); - } - } - finally - { - OnGetAuthTicketForWebApiResponse -= responseHandler; - } - - return ticket; - } - /// /// Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you. /// This waits for a positive response from the backend before returning the ticket. This means @@ -424,6 +386,74 @@ namespace Steamworks } } + /// + /// Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you. + /// + private static unsafe AuthTicket? GetAuthTicketForWebApi( string identity ) + { + if ( Internal is null ) { return null; } + uint ticket = Internal.GetAuthTicketForWebApi( identity ); + + if ( ticket == 0 ) + return null; + + return new AuthTicket() + { + Handle = ticket + }; + } + + /// + /// Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you. + /// This waits for a positive response from the backend before returning the ticket. This means + /// the ticket is definitely ready to go as soon as it returns. Will return if the callback + /// times out or returns negatively. + /// + public static async Task GetAuthTicketForWebApiAsync( string identity, double timeoutSeconds = 10.0f ) + { + if ( Internal is null ) { return null; } + var result = Result.Pending; + AuthTicket? ticket = null; + var stopwatch = Stopwatch.StartNew(); + + void f( GetTicketForWebApiResponse_t t ) + { + if ( ticket is null || t.AuthTicket != ticket.Handle ) return; + result = t.Result; + ticket.Data = t.GubTicket; + } + + OnGetTicketForWebApiResponse += f; + + try + { + ticket = GetAuthTicketForWebApi( identity ); + if ( ticket == null ) + return null; + + while ( result == Result.Pending ) + { + await Task.Delay( 10 ); + + if ( stopwatch.Elapsed.TotalSeconds > timeoutSeconds ) + { + ticket.Cancel(); + return null; + } + } + + if ( result == Result.OK ) + return ticket; + + ticket.Cancel(); + return null; + } + finally + { + OnGetTicketForWebApiResponse -= f; + } + } + public static unsafe BeginAuthResult BeginAuthSession( byte[] ticketData, SteamId steamid ) { fixed ( byte* ptr = ticketData ) diff --git a/Libraries/Facepunch.Steamworks/SteamUserStats.cs b/Libraries/Facepunch.Steamworks/SteamUserStats.cs index b4a4aa4e7..4cc07038a 100644 --- a/Libraries/Facepunch.Steamworks/SteamUserStats.cs +++ b/Libraries/Facepunch.Steamworks/SteamUserStats.cs @@ -137,14 +137,13 @@ namespace Steamworks } /// - /// Asynchronously request the user's current stats and achievements from the server. - /// You must always call this first to get the initial status of stats and achievements. - /// Only after the resulting callback comes back can you start calling the rest of the stats - /// and achievement functions for the current user. + /// This call is no longer required as it is managed by the Steam client. The game stats and achievements + /// will be synchronized with Steam before the game process begins. /// + [Obsolete( "No longer required. Automatically handled by the Steam client.", false )] public static bool RequestCurrentStats() { - return Internal != null && Internal.RequestCurrentStats(); + return true; } /// diff --git a/Libraries/Facepunch.Steamworks/Structs/Friend.cs b/Libraries/Facepunch.Steamworks/Structs/Friend.cs index abf2593c7..1f9628b6a 100644 --- a/Libraries/Facepunch.Steamworks/Structs/Friend.cs +++ b/Libraries/Facepunch.Steamworks/Structs/Friend.cs @@ -40,7 +40,7 @@ namespace Steamworks /// /// Return true if this user is playing the game we're running /// - public bool IsPlayingThisGame => GameInfo?.GameID == SteamClient.AppId; + public bool IsPlayingThisGame => GameInfo?.GameID is { Type: GameIdType.App } && GameInfo.Value.GameID.AppId == SteamClient.AppId; /// /// Returns true if this friend is online @@ -75,7 +75,26 @@ namespace Steamworks public Relationship Relationship => SteamFriends.Internal?.GetFriendRelationship( Id ) ?? Relationship.None; public FriendState State => SteamFriends.Internal?.GetFriendPersonaState( Id ) ?? FriendState.Offline; + + /// + /// Returns the player's current Steam name. + /// + /// Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client. + /// + /// public string? Name => SteamFriends.Internal?.GetFriendPersonaName( Id ); + + /// + /// Returns the nickname that was set for this Steam player, if any. + /// + /// Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client. + /// + /// + public string? Nickname => SteamFriends.Internal?.GetPlayerNickname( Id ); + + /// + /// Returns the player's Steam name history. + /// public IEnumerable NameHistory { get @@ -114,10 +133,10 @@ namespace Steamworks public struct FriendGameInfo { - public ulong GameID; // m_gameID class CGameID - public uint GameIP; // m_unGameIP uint32 - public ulong SteamIDLobby; // m_steamIDLobby class CSteamID + internal uint GameIP; // m_unGameIP uint32 + internal ulong SteamIDLobby; // m_steamIDLobby class CSteamID + public GameId GameID; public int ConnectionPort; public int QueryPort; diff --git a/Libraries/Facepunch.Steamworks/Structs/GameId.cs b/Libraries/Facepunch.Steamworks/Structs/GameId.cs index e5940c715..02b4f7d68 100644 --- a/Libraries/Facepunch.Steamworks/Structs/GameId.cs +++ b/Libraries/Facepunch.Steamworks/Structs/GameId.cs @@ -1,25 +1,18 @@ using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; - namespace Steamworks.Data { - public struct GameId + public enum GameIdType : byte + { + App = 0, + GameMod = 1, + Shortcut = 2, + P2P = 3, + } + + public struct GameId : IEquatable { - // TODO - Be able to access these vars - /* - - enum EGameIDType - { - k_EGameIDTypeApp = 0, - k_EGameIDTypeGameMod = 1, - k_EGameIDTypeShortcut = 2, - k_EGameIDTypeP2P = 3, - }; - # ifdef VALVE_BIG_ENDIAN unsigned int m_nModID : 32; unsigned int m_nType : 8; @@ -30,8 +23,31 @@ namespace Steamworks.Data unsigned int m_nModID : 32; #endif */ + + // 0xAAAAAAAA_BBCCCCCC + // A = m_nModID + // B = m_nType + // C = m_nAppID public ulong Value; + public GameIdType Type + { + get => (GameIdType)(byte)( Value >> 24 ); + set => Value = ( Value & 0xFFFFFFFF_00FFFFFF ) | ( (ulong)(byte)value << 24 ); + } + + public uint AppId + { + get => (uint)( Value & 0x00000000_00FFFFFF ); + set => Value = ( Value & 0xFFFFFFFF_FF000000 ) | (value & 0x00000000_00FFFFFF); + } + + public uint ModId + { + get => (uint)( Value >> 32 ); + set => Value = ( Value & 0x00000000_FFFFFFFF ) | ( (ulong)value << 32 ); + } + public static implicit operator GameId( ulong value ) { return new GameId { Value = value }; @@ -41,5 +57,30 @@ namespace Steamworks.Data { return value.Value; } + + public bool Equals(GameId other) + { + return Value == other.Value; + } + + public override bool Equals(object obj) + { + return obj is GameId other && Equals(other); + } + + public override int GetHashCode() + { + return Value.GetHashCode(); + } + + public static bool operator ==(GameId left, GameId right) + { + return left.Equals(right); + } + + public static bool operator !=(GameId left, GameId right) + { + return !left.Equals(right); + } } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/Structs/GamePhaseRecordingInfo.cs b/Libraries/Facepunch.Steamworks/Structs/GamePhaseRecordingInfo.cs new file mode 100644 index 000000000..e44a14bbe --- /dev/null +++ b/Libraries/Facepunch.Steamworks/Structs/GamePhaseRecordingInfo.cs @@ -0,0 +1,10 @@ +namespace Steamworks; + +public struct GamePhaseRecordingInfo +{ + public string PhaseId; + public ulong RecordingMs; + public ulong LongestClipMs; + public uint ClipCount; + public uint ScreenshotCount; +} diff --git a/Libraries/Facepunch.Steamworks/Structs/InventoryDef.cs b/Libraries/Facepunch.Steamworks/Structs/InventoryDef.cs index 25afbd570..0ae3ae3ce 100644 --- a/Libraries/Facepunch.Steamworks/Structs/InventoryDef.cs +++ b/Libraries/Facepunch.Steamworks/Structs/InventoryDef.cs @@ -100,7 +100,7 @@ namespace Steamworks uint _ = (uint)Helpers.MemoryBufferSize; - if ( SteamInventory.Internal is null || !SteamInventory.Internal.GetItemDefinitionProperty( Id, name, out var vl, ref _ ) ) + if ( SteamInventory.Internal is null || !SteamInventory.Internal.GetItemDefinitionProperty( Id, name, out var vl ) ) return null; if (name == null) //return keys string diff --git a/Libraries/Facepunch.Steamworks/Structs/InventoryItem.cs b/Libraries/Facepunch.Steamworks/Structs/InventoryItem.cs index aeee9a5e3..fc9846401 100644 --- a/Libraries/Facepunch.Steamworks/Structs/InventoryItem.cs +++ b/Libraries/Facepunch.Steamworks/Structs/InventoryItem.cs @@ -100,18 +100,14 @@ namespace Steamworks internal static Dictionary? GetProperties( SteamInventoryResult_t result, int index ) { - var strlen = (uint) Helpers.MemoryBufferSize; - - if ( SteamInventory.Internal is null || !SteamInventory.Internal.GetResultItemProperty( result, (uint)index, null, out var propNames, ref strlen ) ) + if ( SteamInventory.Internal is null || !SteamInventory.Internal.GetResultItemProperty( result, (uint)index, null, out var propNames ) ) return null; var props = new Dictionary(); foreach ( var propertyName in propNames.Split( ',' ) ) { - strlen = (uint)Helpers.MemoryBufferSize; - - if ( SteamInventory.Internal.GetResultItemProperty( result, (uint)index, propertyName, out var strVal, ref strlen ) ) + if ( SteamInventory.Internal.GetResultItemProperty( result, (uint)index, propertyName, out var strVal ) ) { props.Add( propertyName, strVal ); } @@ -179,4 +175,4 @@ namespace Steamworks public override int GetHashCode() => _id.GetHashCode(); public bool Equals( InventoryItem p ) => p._id == _id; } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/Structs/Lobby.cs b/Libraries/Facepunch.Steamworks/Structs/Lobby.cs index c16a390ec..e9d0ad108 100644 --- a/Libraries/Facepunch.Steamworks/Structs/Lobby.cs +++ b/Libraries/Facepunch.Steamworks/Structs/Lobby.cs @@ -143,7 +143,7 @@ namespace Steamworks.Data public bool SendChatString( string message ) { //adding null terminator as it's used in Helpers.MemoryToString - var data = System.Text.Encoding.UTF8.GetBytes( message + '\0' ); + var data = Utility.Utf8NoBom.GetBytes( message + '\0' ); return SendChatBytes( data ); } diff --git a/Libraries/Facepunch.Steamworks/Structs/MatchMakingKeyValuePair.cs b/Libraries/Facepunch.Steamworks/Structs/MatchMakingKeyValuePair.cs index 401eb0568..033950acd 100644 --- a/Libraries/Facepunch.Steamworks/Structs/MatchMakingKeyValuePair.cs +++ b/Libraries/Facepunch.Steamworks/Structs/MatchMakingKeyValuePair.cs @@ -3,7 +3,7 @@ using System.Runtime.InteropServices; namespace Steamworks.Data { - [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPackSize )] + [StructLayout( LayoutKind.Sequential, Pack = Platform.StructPackSize, CharSet = CharSet.Ansi )] internal partial struct MatchMakingKeyValuePair { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] diff --git a/Libraries/Facepunch.Steamworks/Structs/UgcEditor.cs b/Libraries/Facepunch.Steamworks/Structs/UgcEditor.cs index 6a8403853..c32f459d9 100644 --- a/Libraries/Facepunch.Steamworks/Structs/UgcEditor.cs +++ b/Libraries/Facepunch.Steamworks/Structs/UgcEditor.cs @@ -209,7 +209,7 @@ namespace Steamworks.Ugc using ( var a = SteamParamStringArray.From( Tags.ToArray() ) ) { var val = a.Value; - SteamUGC.Internal.SetItemTags( handle, ref val ); + SteamUGC.Internal.SetItemTags( handle, ref val, false ); } } diff --git a/Libraries/Facepunch.Steamworks/Structs/UgcItem.cs b/Libraries/Facepunch.Steamworks/Structs/UgcItem.cs index b02a8d7ab..ebfb6b8ec 100644 --- a/Libraries/Facepunch.Steamworks/Structs/UgcItem.cs +++ b/Libraries/Facepunch.Steamworks/Structs/UgcItem.cs @@ -116,10 +116,10 @@ namespace Steamworks.Ugc /// The number of downvotes of this item /// public uint VotesDown => details.VotesDown; - /// - /// Dependencies/children of this item or collection, available only from WithChildren(true) queries - /// - public PublishedFileId[]? Children; + /// + /// Dependencies/children of this item or collection, available only from WithDependencies(true) queries + /// + public PublishedFileId[]? Children; /// /// Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries diff --git a/Libraries/Facepunch.Steamworks/Utility/Helpers.cs b/Libraries/Facepunch.Steamworks/Utility/Helpers.cs index 644d1a31f..72ade86d6 100644 --- a/Libraries/Facepunch.Steamworks/Utility/Helpers.cs +++ b/Libraries/Facepunch.Steamworks/Utility/Helpers.cs @@ -99,7 +99,19 @@ namespace Steamworks if ( len == 0 ) return string.Empty; - return UTF8Encoding.UTF8.GetString( (byte*)ptr, len ); + return Utility.Utf8NoBom.GetString( (byte*)ptr, len ); + } + + internal static string BuildVersionString( params string[] interfaceVersions ) + { + var sb = new StringBuilder(); + foreach ( var version in interfaceVersions ) + { + sb.Append( version ).Append( '\0' ); + } + + sb.Append( '\0' ); + return sb.ToString(); } } diff --git a/Libraries/Facepunch.Steamworks/Utility/SteamInterface.cs b/Libraries/Facepunch.Steamworks/Utility/SteamInterface.cs index c2c30b490..dcf6acc4d 100644 --- a/Libraries/Facepunch.Steamworks/Utility/SteamInterface.cs +++ b/Libraries/Facepunch.Steamworks/Utility/SteamInterface.cs @@ -143,4 +143,4 @@ namespace Steamworks } } -} \ No newline at end of file +} diff --git a/Libraries/Facepunch.Steamworks/Utility/Utf8String.cs b/Libraries/Facepunch.Steamworks/Utility/Utf8String.cs index 59d1517f9..3b02317ee 100644 --- a/Libraries/Facepunch.Steamworks/Utility/Utf8String.cs +++ b/Libraries/Facepunch.Steamworks/Utility/Utf8String.cs @@ -9,38 +9,39 @@ using System.Text; namespace Steamworks { - internal unsafe class Utf8StringToNative : ICustomMarshaler + internal struct Utf8StringToNative : IDisposable { - public IntPtr MarshalManagedToNative(object managedObj) + public IntPtr Pointer { get; private set; } + + public unsafe Utf8StringToNative( string? value ) { - if ( managedObj == null ) - return IntPtr.Zero; - - if ( managedObj is string str ) + if ( value == null ) { - fixed ( char* strPtr = str ) - { - int len = Encoding.UTF8.GetByteCount( str ); - var mem = Marshal.AllocHGlobal( len + 1 ); - - var wlen = System.Text.Encoding.UTF8.GetBytes( strPtr, str.Length, (byte*)mem, len + 1 ); - - ( (byte*)mem )[wlen] = 0; - - return mem; - } + Pointer = IntPtr.Zero; + return; } - return IntPtr.Zero; + fixed ( char* strPtr = value ) + { + var len = Utility.Utf8NoBom.GetByteCount( value ); + var mem = Marshal.AllocHGlobal( len + 1 ); + + var wlen = Utility.Utf8NoBom.GetBytes( strPtr, value.Length, (byte*)mem, len + 1 ); + + ( (byte*)mem )[wlen] = 0; + + Pointer = mem; + } } - public object MarshalNativeToManaged(IntPtr pNativeData) => throw new System.NotImplementedException(); - public void CleanUpNativeData(IntPtr pNativeData) => Marshal.FreeHGlobal( pNativeData ); - public void CleanUpManagedData(object managedObj) => throw new System.NotImplementedException(); - public int GetNativeDataSize() => -1; - - [Preserve] - public static ICustomMarshaler GetInstance(string cookie) => new Utf8StringToNative(); + public void Dispose() + { + if ( Pointer != IntPtr.Zero ) + { + Marshal.FreeHGlobal( Pointer ); + Pointer = IntPtr.Zero; + } + } } internal struct Utf8StringPointer @@ -71,7 +72,7 @@ namespace Steamworks dataLen++; } - return Encoding.UTF8.GetString(bytes, dataLen); + return Utility.Utf8NoBom.GetString( bytes, dataLen ); } } } diff --git a/Libraries/Facepunch.Steamworks/Utility/Utility.cs b/Libraries/Facepunch.Steamworks/Utility/Utility.cs index ad77d63d2..0fc1fea87 100644 --- a/Libraries/Facepunch.Steamworks/Utility/Utility.cs +++ b/Libraries/Facepunch.Steamworks/Utility/Utility.cs @@ -10,6 +10,8 @@ namespace Steamworks { public static partial class Utility { + public static readonly Encoding Utf8NoBom = new UTF8Encoding( false, false ); + static internal T? ToType( this IntPtr ptr ) { if ( ptr == IntPtr.Zero ) @@ -111,7 +113,7 @@ namespace Steamworks i++; } - return Encoding.UTF8.GetString( readBuffer, 0, i ); + return Utf8NoBom.GetString( readBuffer, 0, i ); } } } diff --git a/Libraries/Facepunch.Steamworks/libsteam_api64.dylib b/Libraries/Facepunch.Steamworks/libsteam_api64.dylib index 5237be0b29f03ea83a72332d19cbc9030556b680..a3df9273286d14bd339229559d4e1f177dcbb88b 100644 GIT binary patch literal 414656 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�P_}o&%8f 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�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

eK!jPOTWAaB<}T4a?Yr1HiGC0bxJg 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

`BGjO;44V~u%b*hwdH^ZTZV{Jt^d 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 literal 0 HcmV?d00001 diff --git a/Libraries/Facepunch.Steamworks/steam_api64.dll b/Libraries/Facepunch.Steamworks/steam_api64.dll index 2b42812096e86e8c1db29ad4dbbc14eef2069fdf..0224579a13a7760c538c7f456f4d43ce33b82bd7 100644 GIT binary patch literal 319584 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�MCxz1Gf7z1*xnpRZr5SYC}X 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 fL1NZg(H2I8K?w-MJ6ze+rc_=m(3iB}NM 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�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 literal 298856 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⩔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

  • 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 diff --git a/changelogs/combine_changelogs.bat b/changelogs/combine_changelogs.bat new file mode 100644 index 000000000..0b738bf93 --- /dev/null +++ b/changelogs/combine_changelogs.bat @@ -0,0 +1,56 @@ +@echo off +setlocal EnableDelayedExpansion +rem This file combines all the other .txt files in this directory into changelog.txt, +rem or another file name given as optional argument. + +rem Determine script's absolute directory and use that for paths +set "SCRIPT_DIR=%~dp0" +set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" +set "DEFAULT_TARGET_FILE=changelog.txt" + +rem A different target file can be provided as argument +if "%~1"=="" ( + set "TARGET_FILE=%SCRIPT_DIR%\%DEFAULT_TARGET_FILE%" +) else ( + set "TARGET_FILE=%SCRIPT_DIR%\%~1" +) + +if not exist "%TARGET_FILE%" ( + echo %TARGET_FILE% doesn't exist yet, creating it + type nul > "%TARGET_FILE%" +) + +echo. +echo Appending *.txt into %TARGET_FILE%: +for %%F in ("%SCRIPT_DIR%\*.txt") do ( + if exist "%%F" ( + rem Skip target file(s) that we're appending into + set "BASENAME=%%~nxF" + if /i "!BASENAME!"=="%DEFAULT_TARGET_FILE%" ( + echo - Skipping target file: %%~nxF + ) else ( + for %%T in ("%TARGET_FILE%") do ( + if /i "!BASENAME!"=="%%~nxT" ( + echo - Skipping target file: %%~nxF + ) else ( + echo + %%~nxF + rem Strip path and extension from the file name and append as heading + echo %%~nF>> "%TARGET_FILE%" + rem Append file content + type "%%F" >> "%TARGET_FILE%" + rem Add a newline after each file's content + echo.>> "%TARGET_FILE%" + ) + ) + ) + ) else ( + echo ERROR: %%F is missing or not a proper file, skipping! + ) +) + +echo. +rem Finished file name in upper case and without path as heading +for %%T in ("%TARGET_FILE%") do echo === %%~nxT: +echo. +rem Print the finished file itself +type "%TARGET_FILE%" diff --git a/changelogs/combine_changelogs.sh b/changelogs/combine_changelogs.sh new file mode 100644 index 000000000..9732d789e --- /dev/null +++ b/changelogs/combine_changelogs.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +## +# This file combines all the other .txt files in this directory into changelog.txt, +# or another file name given as optional argument. +# + + +# Determine script's absolute directory and use that for the paths, so the +# script can be executed from anywhere +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +DEFAULT_TARGET_FILE="changelog.txt" + +# A different target file can be provided as argument +if [ $# -eq 1 ]; then + TARGET_FILE="$SCRIPT_DIR/$1" +else + TARGET_FILE="$SCRIPT_DIR/$DEFAULT_TARGET_FILE" +fi + +if [ ! -f "$TARGET_FILE" ]; then + echo "$TARGET_FILE doesn't exist yet, creating it" + touch "$TARGET_FILE" +fi + + +echo "" +echo "Appending *.txt into $(basename "$TARGET_FILE"):" +for file in "$SCRIPT_DIR"/*.txt; do + if [ -f "$file" ]; then + # Skip target file(s) that we're appending into + if [[ "$(basename "$file")" = "$DEFAULT_TARGET_FILE" || + "$(basename "$file")" = "$(basename "$TARGET_FILE")" ]]; then + echo " - Skipping target file: $(basename "$file")" + continue + fi + echo " + $(basename "$file")" + + # Strip path and extension from the file name and append it as heading for the entry + echo "$(basename "${file%.*}")" >> "$TARGET_FILE" + # Append file content + cat "$file" >> "$TARGET_FILE" + # Add a newline after each file's content + echo "" >> "$TARGET_FILE" + else + echo "ERROR: $file is missing or not a proper file, skipping!" + fi +done +echo "" + +# Finished file name in upper case and without path as heading +echo "=== $(basename "$TARGET_FILE"):" +echo "" + +# Print the finished file itself +cat "$TARGET_FILE" From fd34473640a3f84b108299d55c36065eeda809c7 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 17 Jun 2025 16:39:59 +0300 Subject: [PATCH 3/3] Update bug-reports.yml --- .github/DISCUSSION_TEMPLATE/bug-reports.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/bug-reports.yml b/.github/DISCUSSION_TEMPLATE/bug-reports.yml index 387e3dc2e..fcd51cd55 100644 --- a/.github/DISCUSSION_TEMPLATE/bug-reports.yml +++ b/.github/DISCUSSION_TEMPLATE/bug-reports.yml @@ -73,9 +73,7 @@ body: label: Version description: Which version of the game did the bug happen in? You can see the current version number in the bottom left corner of your screen in the main menu. options: - - v1.8.8.1 (Calm Before the Storm Hotfix 2) - - v1.9.0.0 (Unstable) - + - v1.9.7.0 (Summer Update 2025) - Other validations: required: true
  • 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%0A`SYbd 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�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 literal 391056 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�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%0DVQ zelzbEXn;@oj9`T6@DJz0OyF3c&lo{?47dbp9n@%eS_jSju*Z$tf*;g)D7u7uCOl0? z0HdK_2ekxh>Bc7d%|=n&kD{K>iT-v!aiM_kqXHbO}=d2Fd59(845XFl)tHk|JuJ4 zes}K}_cQ(yQC;zOhTh$})1H%l?@*Sm%qrB|MzJ}NxX^eXBijN>pEgtdCnR)t)0KL4 z7a85c_;+LoOVjcT*8B@bEj6TLcC6JK3Tgg|ywijWOBX_T^nLFDsXS9z z<&4*oR#=*!o0rAL{JJd4@udZw%;2TITgLstZsFo?w(yII0ffKlf5yDK-QAOcL|gZK zxQk0&obKVy#_NCSdTIKaywqG2cN%|l!61YkkRnjpZFZ2ktj6fP8(oqMxalky|1yeB zH-AbDrST6u`#0hCsIPh^+_6<#Tl=FPHA;e33c3V5{^)FD*WLvvCwZ0xd8r|Q){J?w%>ZVrA)PQ$ZMHL;Ymrkf|&l6`(|0kxd! zdCRg%>O$frDXyiddHH#3a`O#3HS$A?nPwVm8^|B}N=E@5iAu0{6ddhTa*amgK)(n4 zg&1<+qn;9zPBCwzwCeS@SBS& zu8&C@M&CmEp5G@q969x5#@}xD56r>zpMEOKR_(U2AZo@t zGgQ+*FZ}uYXZ8J)%X+;%tU1SWzv}cAgr?dwd|~RmysY~l^%#07M(#VQe*CrjV$%Nc zNcGzTn&v+3GfpuuKQCf%-XP+3(8SR}AIM`0hu{9XcH5ZGzFL^^{J6l^&#(Vg`+n@j zRoh=z?~c8F_~?7y+a8MgPA(MtRs43dX4HZhALZVkZ}dy-=N@ul{o<+L{9{mZ+t4Y0 z6TWf(=M(!^y|p&=&fdP+sTl2C?lY`(c}0SH#I|Xs$o+i>*!JMQ}}m%c4jY9k-= zSv8=cHMjiP(D^5;pSv&qy-VNRcV*YhZ~r$sUnFL3P4mr`&7K>+$aP7|mmdzTSnSsp zuIO`ZX!6cqeOhjQHS4W$gLXdh&A}(bvewJ;ZmV`A3|?b+^BF;C{CNL#!{*2TK48{Y zE2e!?a`DMm6tgu^nQm{N|NYs&dwtulIn)2XuuuMREx7p8ieq+3*XL(iUiV(PzVwl3 zl%VwAt{5M_q5L3mTc15eLdKpk>XWCwIJ-V~)>}iP_I`D-V8^)`!2|Y2AFFxf#eSF1 zZk-l1@6xRIZs)Ix8hzy>7b<0{3GweapGtCj`^(X(2~Qe_W}9z5X;>+SjXgPMXYeZy zit3q;2X=~8C$Gkr{o43(nCz$BkEy+M-i5WrxA$HC(4oIm(6Yd_^A^8(A|UwEyxd&n z$QuC(-zW4ld%tkj>a)@M{OMJJ5yL<98!<;c<%8#IPyD*&{8tyFpD4?We{FHr$0gJI zdOf1SnIR!~=zVhs<|Tf(tohxNQ9srH_WGxne`*|fm z=9%d1jt6>YCoFg0e?I6~;QgyJw@+MQ`QoEr4rZm(FzfQol%n50s*V3~mwN8@w!|0S zbGh@O?9sQ!&dqx6@bEE1k5s;U>g&3dm6L1T;?Mnk>yFBoc76Gfx5vtsUe23$-O{T@ zOl$8G{{06}rzNYde))o!b$0a3!pomL@$S}zqoxMDY;aop(6dc*{8ru0d+BPB>wqI| ze{)l{q}=F}Q{f$Ax?R2FSy$ah>pC1Z`GxMzGWhz9-I(~c>ZcJkLeSdE@0aZpvp3hN zzJKwnsxRV8RPmoC*PJ=@ThfHb_t_89MA}cSjvDm7@WqHrWsz%ME2<8x_51Ipwo$oD zUMiXLXx*SSCkj^{UH$6*@7F}zZ@bKz4jdn9Igd?zs|Kd+y<$yq`Te`BsbatbI~{gCxqm`ysB*-}^Pvyd zJ^#y)_g)_~E0gA`>37y28ZWPYX!no5G@gro?HS#9=gTi&o435ztNq{kX3w71-p^0b zJzE}OJ^q4k%5$@(C|m#etlIs-)wSP-)S54jn%O_`+mE)SeE-WT)3K{>ELf`W>GG?VDF6g}$=y&C4@% zus;gO^`-9`I?ep7i*dKYlaly`Mo~pC&=r)BNu=G7?@9|{8_GuRu zhzmacKKi$TPUGK>I@EafJ(qbuE_>?H=KUu|24$QPjQwA`V)*X(jWOdl78CiG2d+y0 z?U&P!%viazX}tUTjL4e-vd zO!zD$IP&&4IS!_(eKLnj>wbJ;!I9L8W$)IVd-CEB0sB%jTef}v((!)TUz!aBZ-~Y{t3wHP4sh@qK)T`fp zADr^sJLog{5#QsEdyiTFd(MT2oOc|vyYR)+^RG-ON~m~xSJL=NA;aY+_wNti>DS)j zpj?x-{P)RUXRM5A+`kNi1tE3!^1&{$Q)P_~HG#Um=Vy(3^^HqAK2E)KA?^Ny^3mJ2 ze_fFJy!UtI`wgz{BgYOKu{68izSjd!mFU)AU;6FYV@G|z&2oJ3$$efwI{rPwninxB z|9t7+4Ug-WOnxcviwS$TPW~dqr|Ri7A9`J+NxP69Y<_9;*Z&wBY8iaB==E_kT35_i z6Y+THJ6G4tz4H60mkPdV`03;^hqG^%ex4(wfA`M|(QoA`cD?qB<{5oe+|%ueNA<_g zRO}1MOS2>%U%2OiraS#|Qs*BTeEz_5dv-)$e=X+f?F)}=NOSUib^OI0G`UBODfxWK z^n?djeK+NeFK5hq(ii|lr(+dC)--X@B2J)^ty59Oop9Xivs(7 zdfsnq_{rSIXOGP?7muAXmqGhwE`v|YT!vhexejr*a~tr!aFpR?`YGR!qf6F@>$*lmC2SHP-MmDOd1I!9SZHTI095m?lia z8h;L4r^1wWMJ$KQ0(_I6_5!SA;TjMJxlKj*DM(p9Xj=wN}V3O(ir?Dupx zJw{}m=3BezpY5jqTQ~jRyXk3Pu`Nv6T5QwP{DB5r&QP>x##ZjMC{yXk_Z*mq<`-%( z_w3w%0VCn1V!nT{TEgew3Jx?wy?}30j)#K-mq1-V9UN$PhP%B5^VgmY4*Uwr^VQ%$ zBh-_%-2Jf=UHcKqKgBWdamfrwW@f1Wf+9WT%>XEB)=5zs2#KE_P&7~K1w~CUrH$rd zlvYYNA(;_U{Utlf6Pq1{OMVGSmP+AbAjr)60BH(Cip)nsk=qBP?_lXWRQjf-i~KB* z%wr`?1XB1^b|`M*Gli22rG_ei8VXeiMYI+{5v|1%J`N;vBNTW>fA71C>c{r&xc2iJ!LmO&kXs)9NWRReVf zst&3FN`z{GYKKxh2D+hkrG^B)549WW6R3Sq2cgQKjzCpG9fzucIs-Kne!QUkp{78Q z`ygOAR18!SR60}+)M}`WP@AEif_f3^eJB|bj^94$%b=>DYM|<%8lXg|7ARo@XoONj zO@a!CN`lIP(nGC-+6eU&)HbM>q27dgALCiBIM3-nFaw{e}&joy#Tv(ED@4DL%7kA z2JZ5>4r>RQhC*hDw8I~B2fv0wrekZ4kms(Ub;m-cfjg`}rey-L2AM^50Bexc)zCU5 zHK()|iIr)r?P2$%Hg}np>I2p#^GS!bNt+R^QFiKsqp%(U6%{o;J$?Kd7EU^TW7Sdk zsY$a2KOsDPT5j$%+EIq^(a+@pqtN3K#^IX?NyOiD_MHh6qzg4N3mD7#QJcSXe6eUG z|6Sia938^oE_isfPq51@4!ySl;dYtW;<5R%#Ye8X%;q9YqIEVxTLz56H}NMJtp_1} z6IFAiv=I`IgMrI|vG7Oj%sjOEB#Vni+E)U@V4eo#;Tu?}6b_H45WXoMTY5=Pdm?S| zX0bSUoGdF@{5g_)9=8E$r5J5A(8wlN+LvjgC%^NX)79ODjmDm4!ALRvVkC?Ljt9Te z@pp|BKYh`^v1nzlE#B?|Nl=7uJ!!q134!D z*VFvoU*YIc|J}ch=+W-}*VBD5`a;`34DY&izr5p>S9iYl`WtV)_4a@5dgtBu-v8jk zk9Pm}$N&6f&!>C$?LY9@!OssJE;E-`9QopCWmWaDFOPq9;$%(jsnch^{^o3*<=puT z^%uWwXuR~@#erizy8*aC+P&4oxR+_(MjR#;_B9` zw^G%oZ$J0`0|t5w8a!m^u;C-rBS(39d5^x&XUzS+WBtaB@7e=7Ef8xBvw~8WVbM2Z zd1hAjik#fM{DMcY+sUwU)#^2C7cRot%%%U@{?T>oAKUPMI{p8r)R6>`Y>zLR<2r3B)r1K|5zS}8ZD6wCl_ctiSk#^u+aGzlIGa_(FvA`=*|8tUXmQ8!Br0Y zuVpl3v5|83a3=gm;m~+bhcJmcN@4eqX$HuDe?}*be2G#TU(*;f6W?0Un~pDAh{UVE zl4dSHAoLaHfp3L~ol`=Rz*T>l7V?{hFler%2Pgax8u5dV^D|&W=cuR* z(`>6}&hWg}LaIq=?|F`^CuQmIPbD%RvzcZ1yZRpV{grUKr_jc^o~4^g45y1q5=lzw zl$q_E7g1%CmED`aWJ>3+^5Kq7i1~pt#Dja)Vk((9v@h}B7Dvx?aCua4p>{UTmjoAN z>4KwUBLo@zsi0=(=z?kcDuvU{j1Kp8|Hf`+9J0b(zndFuN9JZE6Qi)~C5#M>O2yd> z+Jl8tYTeA~Adfa0+a==iBSYz=0hf(ok8MnTPFC6)#3Bg}2qtIy1*X|<4+ zrW4}hX8YmTEyD?uBQ^2S5ux+KG$!TZ`7f4{oEOUxB>v6CPr6Ic^?@xjy^-U%AderEh{K zNz(}DlQ<1Xk~D5kj5i=vwjbr`uIKrl)!jhK$9+IKungz`tO1gIv<^u5-2fyRs0bw4 zVhfODj%`4a4GJ&ty_*Uk$q-e*-aro^$w}2fDl$)4?UijVz^ahpzM+2*X_W^5wBy6k$lI*hq=nE8qV}UI|KVTbhJWzNsByci70elds z0#e!Z08Ry}firdI&cgy9C$x44(JP93LFc}0r~+q0>=Zl0_ka^ zmw}UjyMPY>KLJh#mH{6G9tTbV)&ZviF9W9mTYywC+krEIitQ*jKzCpePz?+Qjs=DS zrvSr%F+dG)5pXsz6F3K`2SxykfOCOQ0UrXs2#f^235*8r2F?Q>1jYcXfD3?UfC<0` zU?Q*?_%N^?s0F&c91^$!I24!z91AQ4P65i$fP?|%Kx&7v!A*$4w=-}N&;^(YbOY*v zbX`pmupjU#pgZtI-~iy8z`?-Xz+u2D;8@@pAT?CYz?r}{U?@<&19Sn00%cgd7z>mG zrvRORVL)eK4A2F*27eObOAO42Ls!H)R3xPg*!FM70?+t7U%+;0;GmC zjO@KY2iXIcl07ho?18Jv-UsxMJ#ZV@19y`7SkOb}zr>8&Ea{{GxB57ky6$zvvq{oxX#>FZu??5r%ey~TI1*TG=8HWjp8`wNyufyG{2%>21a=F z%aq*n)dQ>(vk?uUp4rp*gnl$0p&MkLEY@(@A~5PIyH6 zCP_ZZG+c1x?r2O-zbvGPesmWC{dAq_;dJG&l>qQkiZ?@|bETBNOpNF0mkN&2Pb<-r zE76e(4$yCfm$5e_z58b^~Y2;{4lzVWqO*e zgbLKZQkn3>xRd&3Di@^JK+i|`bJ*CD%7Y(9uhgGYnIQcF=&4-z!4$<5dIR*~7|ZhV zLFN<}l@Zd%K~Lqv4OXgHYh-M0(%84Iz_nR~9Ma%*!#W!DcSfav72_}Pq~RECK* zq9>Qp9K~p+S+6Z$_`EfWrJc$+%{8dZP&p?(l`AUiq^Izyyc6HjJM! zHs6#Us#BE9$#7|_TNDcAu7DE8QyIdzNadL766ZVZk0Ra?k9a+d5avVA>s2T#e|-Io z(?Rkb3ONaGc)bc?eB^b8yXSR=o9D6g*y;@NG)BrZPH_xOx|bnd2Y9{hUd}>U8gmdU zrI+~2>j}^A5XP_WdD-2)E&Up_AN1qt)UdL^`<-xBPI;Px8GSs>!L07`G;`kbG>5XX ztdqD-Y3Lpwr;n$>7IzHek}d8?mQy_LSVjkrJ5q{|$^egp$2~`?o5VBDW8R*GNOa`l zF=ks0u*DI^@|4FB#d6*j2X6}~4xaBkj!;(TdHOgVBp0N1Bp82t<`IvN=YTD~C`JqC zTLeoj4>yLH^KheB4sgERJ6x(oytLTDjbnMs!{ud`ha1My)IF@8c|f=B*h+~lta&K8 z)DBYG=Sq4?V*;aBCrQ0{&e{AVOKIVGLUqx`FKXk-583qe!)qdsCxqpLjThAB@bWj8 z(a+t)No9^`31<1g-9)mwZ%aGPF?l$=By%?pG5HC16C>4E3MUkKW{WGhTYki|vd8^~ zbaNlm&3wL;mpuO|ojl%H)}nBIxRfvChGaoDH!+Oy7_;fdaI_ZyQ`1*{pa)f&eLzz^WI0j?^|!ZZ>ue3EG%g_6uBGnnVZTF zl%A8!nTWz_%xjSS$TyImA@4$dhwMfMZZ1FYFUTU~OURMPzaz&YUqOyX-hvDwA3#y}J^|z~%<>Exfjk2#b3j9oV=&9JUgm;iZm0zFb;t?G z^N^E~lE$^jdyw_W+mJHHAkWnp=ChD8hqNy81k5srA#+JXkxMcE6?q}@1!OmJ8FCr& zS>y`j`N$`b4RQmLT6o zPC&knoQ!-9S&O_ES&w`a8AGl{E<#?9JQaC6vJ3ex@=D|d$eWS<$mPhtA$yT8B3B{b zL#{!-iTnWh4srnb59CkCr;suSH5xheHa$lpb4xP!v>E0YQs$y|LKb6gMk>tfBX+}F zjT}LGk3;T!5m`5Q$!yHByW8Mh)9cG4X_8j8I$iTAl11~}rArD8EpjU((iCOxFMTBQ} z_qvQc+~0Z>sNGrYgjvQ`x)A&kM`hSf3?)XvWM0O`+;-<_G$#1Fqdi*8tbmh17 zH|AhV-moU^>bU~xnaH?FbQc z(l+S13wcK>HB9#8wWk_FNV&}c?w@D6(j!s7@v-)=fu}J>*UQg=F+h|uu zuT|A{<-dEq$xc&!z1hw){d+!Re^*C#!*qY^878eG`_?6|C;d&>WkT!72+`H)@LXTu z*p)G6#Q81bbFt;lYeen1>$xF4W2omB^emYkqv)AA{afdk`&;Us{w@FA-!VI{_4WCb zI(MwD{nc{>y6oz?C%sNr&td$=}($<$#v)d^lY)7|I;(ZdX7i?tLF!F`P093IQ4J&FXJVdyVA4EdJa!kwdnDt z7h-k2V-+Jy; z{)=5{8+3l?`BGU?FLQtr&jdcY^MQIM$s1>VMgRB4LC=vcAie1eP*>e@rpLch7o}#p z?>EFOB{*pods?^I_Fw;&6)W!bHoLCr>+NvjG=daVfCP#6|iBzt%ulK&G-A5LECwKl*?n>@=a^a*wx#*hErj@Uj z&c0{(s69R(bx^9i+Ew}QUe_`i{?zNPsiZ>xa^-+yf8Zp;zLAvQzj(=0o1M9L@Ss2K z(zxCQLwjeOy7#f2&+gd!%H9{hWgh!e>9?1SIPsd>wg~Qh*TT2HT=L~3L(9fJ5?gYl zj-TtD#7SZ#f5h&sn_hq5w7JLKwPDb{LfUK?{C1y;VV7?8zl(l$Z1$I0kwwz*>OWpf z_UyrG#PQ5_?9E7aPd)45-d4T8{<`;L&D&r1#>UV7TI&A##c|6`jiJGz0d_J072tiY z;QS4go@BbV4i4&6{oDz0k)v~Iul{jqP)j*9OaD=Z2FsBIIuT!}!tC}Zcf$>FyCAn6 z*QyJ!ZDpWTRshL-ovam-@tO12SybtK%t=Z)OSs&7j{IQ#o2?T{xB2$)-S->9=2hyQ z`>vXGR_TzEAAebI-hK!1A@4hPBrYu7_Pz6lE&6GH?jL;axHm2@-8#{7^~>9E++Xhz z->$j6yYyN<$2)x2ZMfg?)VDwUwY2n`KYcN0pP}6U{D|$gys7lf+LubVerOBsKW%m$ zd~50Hul7AN>lJqD3O>I3UVGkNI;!#?-@Um6``xc4HW}Mfx*&At*t5RET>r&qqprNG zboGpy?MnLzUvK2+Z8pEB^rEJ-1D*fmyv+J1J9oZddFfX-%z0ti6YRp(`N=VDL+&fR z=8xBoe(CWoaqrM`7S6lBbV*D1@QC;mej5%hbT@F(HpO`y+y0Y~7=f|DA%gg_spt@s^E-!z$^ph#) ze6{hv*zv3W*t>?D^GNAU3-7<~hI82wta!qcSIqA%o%q9h|2^kVdrEpPJ9xuKOYays z<@t$!-tHjP*S>k_ibqRV|9Zg}TWw%qo;Ku{!yhZ{T{t$l-m+gNsQ#}_sW6qPMyKi~xJ)gacef7VsxBl|U(oMq$@4n6FrI@?6xbB>%O8YLm_@~`2 z{LchNl(E^xPnW(>8=P}r~N}nmcX7m}SKl&60 zGY-rgw$Z9*O5g2%>DuM*lU{uveg5td&zAnH|JNmE@fgDM$|0jZdA788%$Ko^_M&_Q zt+TFgd9L)Nqki|mvVZS|{pnBMubwY$yS1@8`ZfL~zCYo^rO%hPb}!mt^sl5>aNL9M zud}N3gokFlu=(?nezDb8owusAb=ij(PP%WSgH+e1;U717p>%_b?>O(x@mn9HihjQB zh-+RbZHv9Wa`f?pul~g82W|0U=?52#`!agf9)#a~Yq!f^EIs3kKXrZcZ|-+pxM23E zmr7OFmY@Fn&UNws%~73~y;RzK@t5EJv26$9v);s`*6%AlX~&w;N6jO>KmKvw&dGhH zPYr+IfeVhMJl?$h%stNNE4|~ZNB;OmnDDJQcH85g>MPyz(UNlx{e<}5{K^ae__eRJ z^QtfYx6$5|_eGCA{QKa`rDr|3LwWH8!qXMq>XIcdmtJ=C?%OZ^lJY-$S;>-nUoJiI z)L-Wu{1WN0;(*QH9C*3(-HnEg9yfdEgVf~mX&deIO6m8bt{+=;;^w%w$&GX7yiz)R zt6}4|?iqfNT2s+`+@-ISF5dU*WzqfFjjnTp1&{vymC{FsZv5~&pB_MY_}fkQ412Y7 z&o%dLb=mpUXTSE}^Zc+Ig~Ofai6aL-e#370T-o2L&93YnrOmGFe)u1@zAHQbpv|rf zS=#K%;#=0(`mXGsq0O!w`|IoWeOK1ssm-puv`(8{*|)JayR!4~*KGT)ym^T>yRvT& zZFXhiv%lN=t}MDqn_W3JqRp-hj@D*Z_I4xZFXg% zN}FBTyOTD%@=~SEuIyhyQ0M4Me1IzpRW*}t_myR!cMRknRs4qUIzu1w6=W>>1;YqKjmzkS}e?@HCH z&4W_)mu^OSggEAYTVySAYh)!-<_sqzMyaBHpW(Xn zdiszMeB++Ah5QJEl_(fzooy6+bg^Wx4uDJN1!hdyDd zp(|4FN!d#<`8$$(Bb|F(D(LUZr+M!Mo$O_O>0p>jQtTEzUvc1P4<+LvN%Irtz{C2Q z+;=Uw`4Z%U*N)uZ4ZZP>9WfJRRf)M465zTgdOC)Rv5n5>Ai83=mV0j2c<-IfJyh&J zv3q5jo6ap;h#Ovgac>p+s~tD`xbNzF{aESoL+%ft7kDJ;Z-8r?VIB*W&9Gv6H#~lEoPu6@9L0UFTd1fWuKnb3 zU*bKimo^P1fY%?<^^3P{{{{be&&Cb$NB+cavyZ#>P3PZa+&SB0N7Ca;%-1{DYyeoB;C7vpTKL6CN|w2mG$5 zeGDQ`KSilmPQ@x5a+*>%!d|Bmv6Z5 zq#--TAK{#aF^y5VUCgzvgG}eze7oP#LwE-U^%kja@;x?a zUfd}5RETQ?ejHoPw1>yY>r@pxoaZ5OTuDj8+$QE)F$ct4F}-%o?20ncS(JKhhFm)# z_1ckgtuy6Xm2LM_t_|a!cCV^J^tw{@Y`YhxT&uS2UYdH%*1Iz0TFBPx=9(P`JItZk z;>XRYdb34wS?V?0y`Ge7wYGc9xt0ubt*zI~HA&EMY|hgjrc6Gh>y`07R zgqkYpGu4U@xfan8`}jW2ljXWo#-uB(#@x?&uE}eA$+i8s<|&Kg<(iyDyJDR|yZgvB z)oZCDI``w8bSrw^QoUTZ&0|_sALccZj&grYs~wk{U*KF=JRCPi?^UD*ELAUdTB(U+ zICPS~daiv(mO9t$aLRR`zfQRplz-0OS@Gb3ZoBSE_Z~q}!p-yvcNlVky*u&>e#^CI zkglFcxhD3Dr|RpwA?4aWNP?zq(z7 z{az>cM7Q2a2Z?Jj?ulOdpWKr_Hw;IkCu!*QKjGuYuXm+}{X*+bzN&waT*Zbk0)AvB|z|TQ+-22{e zOzjIEcrm;T8_%z}_pNh(F#n&|`QMCm^HBOy;s#N(^GwR_ z*Kek}>rG$L?foG2zBgQQfAmgz&qX&}>G%JU=l;fHQ|&*KmhLa7-A@nS@xM#8pML+_ z_SE~{bUSll*@2gV#KR50_r6?Txghm^y8BO`nEQS#?Y`IjOHL^}@CwM~|8ZyMzJJy^ zx$nP~$NnB^_S55cJm-IV!NokrrKYT7XFE^r`}I@{|9HUQ`i0U`?tTH zYX6Be_n-VR^?rK%-uOQCe!BZ#|D1Y1-TvL{=r+m?U;6#^HpqSdxwQM~^?TXosrJ3) zov2Lm93&0;8l5Y$5gx}XPop&tf7 zF*#cdB@l#q=!9<5qXR*xhfe5*Ug!t44fi1k_0S0t9tnFlzk8t{WOLYJ2tqw{ zLKpNvA1D}rA||lK{SssXx}X>OU;v7kh%SK;B%m95p-;fyeq_-o`~pea5@ZnSL1FGh zc0(`pLs2n05QKW@gl;I7xJi2PyB`LiXnS-a1f9?gz0eOuJ75Qbkbo}eg?=a+%{>T0 z0=hur)Pw8;SpZNBAxJTg8`6zz)K(m3Fv|z=z{?$VgOYFA&@*zAf+5hI(G59N6c~$q zkbo}efnMl`;@xl)>Y)?5K*H6H?1g?{;gOxDMMx==QZJ+)6=Sy38MEY75OWCX1-a&w zvjpZY=p|jcMM578K+!nD2U32$yzJxm07$;t>Gyl=LI|Xu7vY|y zcRl7V=z%^M0I91*C75YbBwg$ch|!lY+WEruV%(7O7DP|VM}oAk=Xa-=p%?7>CS?tK z{g|b^%l1!Fu8WaDsE1DI1}WdY$bOIws*0clBpwoGN%Iiq1Oy3V7qSne-VGqxkjM^8 zF)|1xq-#C03nU$TkbN)!MYvhSC^ZQ65F*}^=LvpyK@ar707!ln?~N|hgOndh_bz_- zKp(Ijk1B>B)XQ(;(248@DJQ*hoir%k0yp_BaV^>x{|J|q(Gq@#pdOUiMT);6(yoMX zbzznRFC-0nk$oWLy(R7=YsaaRU+{Zgx7qrC!T5k&>sKQjRg(zqiCa z$#2Y3xB8IM=Js!eTT-sLC+R)F^`ZlC141D7r45$6Nnq}h>rUQ@J5sKs%=Y3|5BK_D z0E)R@d?5B90bO911!O-IO~4NbL8n0abR+x3Eo41u+K-faJRtHQ^dSUNhZ7>92l|A~ z(L>51f5l+eAt^^(m;8}5mpDr~F5!NVYm(+ceoMIsA^S(*FS3iYD%uuFUPxYca!ty& zJeS=%(9N}8u>uEb>k zb2ssjG9ztbQ915Gh%iW5>Ls3%=OJ{1T(5@&{z&`M$?tCH1NpdBRw7Ef7eaPI5A=hq zhYLaix}gu`qs&giCS^|2(0-0eTY*1znc%*pe^B(G7lNd%-R@C72MAw3*ZBBU6+sC| z`3xcJiDv@Y1)Y+fNXbvhODQ*fnB6iV{T69Q2jtq0*x|Q47mE(T4oJDM?GUaWbc^vb zgpTCBq@P`0(2?}%M86y4ncIt$K14sVYc%1UOc)^qognt5d`eiP&6YA0lsd*eiGQz1 z7>qM%QBPcCg1t+^hue}5@_dsvw}|T{a*zBRknnL|o*hB1CFD9t{R`q}55N0C%3sl; z*n<#saxa1Gf*$CD0r`!+9^9027UH+GbA93mVeTaEk_JVGfz)TxN76{@T8Q#f%=I87 zpj+5g$6NXty>d^&AkV*D_>Eh|#AN{bxhG{%KIAQddgz31k%Y4s*$?s|b1?*=9(`%w z>iI3<@04ql1u0YA{O*GRD4L3WNjGFYbV9d4o)qtoU4D0w2mMI-P`L#9r45j{3dB$9 ze?Nq{C#wN^pbuozw_*r_l38)a`$6)PZ3I*?1fd=} zp&NQ3f#3Z|`8eCIk4Sl529fp9CE+6t<#{OWggj%U{pjRgv4j~Z^`H+q07WzSP5wwf zK>9o-Vjhnh$OIJchTD{l5cQ!GbA1rG2k!7YSVEYP{h}v%yeE>pk`J;aZ>3LJ%^!kNg6|el*o+H~?nBiEte}4j;k# zKbdMbI2=xed*OBX4z~W;RHaY{=fLf-8h(XQznJP!SOQnU6Yw9{{8v-$4YhDQ+z#)6 ztj5>@DqtR50Z+oeVH3kr`@&Ih8Z3j?K$({MJ=DRU;SP8eeuAAXOC13x!Y%MBSOH7z z3bpVjSOzb_S1@vjrOIF~EQKC;3x=*^sr?}ae}y+;=(?6V5TbAyJO@9)UPCQ)EL;jt z!*{UjdX@^q1@Jh01>0~Wg(@Cy74 zI}S%5PKCSR9oS$~+=qp59lQv?z#f}fssYZ02jL?avpMd)Kwxw*qad0iX3f6YmhcH|WkHLp9bd;s`gg?MiSPq}T zuEmzBfs^5OcpI$kNhg>Ir@@Wz6nqZFJ6Ng_u7sE1M;JSras$W1weU221|!B0cbErV zupHikb$7JXe$WIL!GrJ-4Bv_J3(asjJP04bdOKTc9885Ja252zdk`3F(KoTw3|InJ z!Q=1+jM|0tfn(tkSPB1zt#{=*#Nm8+1m1^re`j%aJY@-vhil;}_y$JrW~pg#Jlq0n zV8h+1|1by6gxletpvGBhJT$;X@Em*xd;FgKhO6KO_!^2!EOiJ(;SzWjzK1b;Q1;*? zxE)>tV^2%%4oAY-a4)eR)_|H|sUS4L#qbDx48sqiOhFTz3lG76V3UI_RSL~;1H1)WloEfq z6#fpwgM5@;ss~G{qQmDSYfGpxB^~>jVdj57%YbC;ZxXo zB4rJ3h7Vz!j1>-Q%7>5*ENRSPj3xZc|7fI1z4!zk@ZEG6u8ZY*-1O zz{qKqs)hw{9lQwN!tNo;E?fbR!&k8F;g*^R5jYK&!SnDTsOgs44uVhzm%u78YG@Ck z6>fok*rt~90)K{;@D1!VgZRM(@HBh{<7QIU;9B?;if0ioxDcL%Z(*0&lo_}V-h|;t z5Jp%8_rhne%aJ^T;R09@X z+5j(AHn8v z>KdE^_rbqm>jdt?Jh%j&fnVXE<0uPo6}$u6w34TAKCFVTVPqS2Ar2QoFMI`CxAR