Unstable v0.1300.0.0 (February 19th 2021)
This commit is contained in:
@@ -13,6 +13,8 @@ using System.Globalization;
|
||||
using FarseerPhysics;
|
||||
using Barotrauma.Extensions;
|
||||
using Barotrauma.Steam;
|
||||
using System.Threading.Tasks;
|
||||
using Barotrauma.MapCreatures.Behavior;
|
||||
|
||||
namespace Barotrauma
|
||||
{
|
||||
@@ -69,6 +71,8 @@ namespace Barotrauma
|
||||
|
||||
private static readonly ChatManager chatManager = new ChatManager(true, 64);
|
||||
|
||||
public static Dictionary<Keys, string> Keybinds = new Dictionary<Keys, string>();
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
OpenAL.Alc.SetErrorReasonCallback((string msg) => NewMessage(msg, Color.Orange));
|
||||
@@ -145,6 +149,17 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsOpen && GUI.KeyboardDispatcher.Subscriber == null)
|
||||
{
|
||||
foreach (var (key, command) in Keybinds)
|
||||
{
|
||||
if (PlayerInput.KeyHit(key))
|
||||
{
|
||||
ExecuteCommand(command);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
activeQuestionText?.SetAsLastChild();
|
||||
|
||||
if (PlayerInput.KeyHit(Keys.F3))
|
||||
@@ -227,6 +242,13 @@ namespace Barotrauma
|
||||
case "fpscounter":
|
||||
case "dumptofile":
|
||||
case "findentityids":
|
||||
case "setfreecamspeed":
|
||||
case "togglevoicechatfilters":
|
||||
case "bindkey":
|
||||
case "savebinds":
|
||||
case "unbindkey":
|
||||
case "wikiimage_character":
|
||||
case "wikiimage_sub":
|
||||
return true;
|
||||
default:
|
||||
return client.HasConsoleCommandPermission(command);
|
||||
@@ -235,20 +257,23 @@ namespace Barotrauma
|
||||
|
||||
public static void DequeueMessages()
|
||||
{
|
||||
while (queuedMessages.Count > 0)
|
||||
lock (queuedMessages)
|
||||
{
|
||||
var newMsg = queuedMessages.Dequeue();
|
||||
if (listBox == null)
|
||||
while (queuedMessages.Count > 0)
|
||||
{
|
||||
//don't attempt to add to the listbox if it hasn't been created yet
|
||||
Messages.Add(newMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddMessage(newMsg);
|
||||
}
|
||||
var newMsg = queuedMessages.Dequeue();
|
||||
if (listBox == null)
|
||||
{
|
||||
//don't attempt to add to the listbox if it hasn't been created yet
|
||||
Messages.Add(newMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddMessage(newMsg);
|
||||
}
|
||||
|
||||
if (GameSettings.SaveDebugConsoleLogs) unsavedMessages.Add(newMsg);
|
||||
if (GameSettings.SaveDebugConsoleLogs) unsavedMessages.Add(newMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,7 +299,12 @@ namespace Barotrauma
|
||||
{
|
||||
var textContainer = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.0f), listBox.Content.RectTransform), style: "InnerFrame", color: Color.White)
|
||||
{
|
||||
CanBeFocused = false
|
||||
CanBeFocused = true,
|
||||
OnSecondaryClicked = (component, data) =>
|
||||
{
|
||||
GUIContextMenu.CreateContextMenu(new ContextMenuOption("editor.copytoclipboard", true, () => { Clipboard.SetText(msg.Text); }));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
var textBlock = new GUITextBlock(new RectTransform(new Point(listBox.Content.Rect.Width - 5, 0), textContainer.RectTransform, Anchor.TopLeft) { AbsoluteOffset = new Point(2, 2) },
|
||||
msg.Text, textAlignment: Alignment.TopLeft, font: GUI.SmallFont, wrap: true)
|
||||
@@ -455,7 +485,7 @@ namespace Barotrauma
|
||||
var subInfo = new SubmarineInfo(string.Join(" ", args));
|
||||
Submarine.MainSub = Submarine.Load(subInfo, true);
|
||||
}
|
||||
GameMain.SubEditorScreen.Select();
|
||||
GameMain.SubEditorScreen.Select(enableAutoSave: Screen.Selected != GameMain.GameScreen);
|
||||
}, isCheat: true));
|
||||
|
||||
commands.Add(new Command("editparticles|particleeditor", "editparticles/particleeditor: Switch to the Particle Editor to edit particle effects.", (string[] args) =>
|
||||
@@ -487,6 +517,24 @@ namespace Barotrauma
|
||||
GameMain.CharacterEditorScreen.Select();
|
||||
}));
|
||||
|
||||
commands.Add(new Command("quickstart", "Starts a singleplayer sandbox", (string[] args) =>
|
||||
{
|
||||
if (Screen.Selected != GameMain.MainMenuScreen)
|
||||
{
|
||||
ThrowError("This command can only be executed from the main menu.");
|
||||
return;
|
||||
}
|
||||
|
||||
string subName = args.Length > 0 ? args[0] : "";
|
||||
if (string.IsNullOrWhiteSpace(subName))
|
||||
{
|
||||
ThrowError("No submarine specified.");
|
||||
return;
|
||||
}
|
||||
|
||||
GameMain.MainMenuScreen.QuickStart(fixedSeed: false, subName);
|
||||
}, getValidArgs: () => new[] { SubmarineInfo.SavedSubmarines.Select(s => s.Name).Distinct().ToArray() }));
|
||||
|
||||
commands.Add(new Command("steamnetdebug", "steamnetdebug: Toggles Steamworks networking debug logging.", (string[] args) =>
|
||||
{
|
||||
SteamManager.NetworkingDebugLog = !SteamManager.NetworkingDebugLog;
|
||||
@@ -497,6 +545,102 @@ namespace Barotrauma
|
||||
{
|
||||
NewMessage("Ready checks can only be commenced in multiplayer.", Color.Red);
|
||||
}));
|
||||
|
||||
commands.Add(new Command("bindkey", "bindkey [key] [command]: Binds a key to a command.", (string[] args) =>
|
||||
{
|
||||
if (args.Length < 2)
|
||||
{
|
||||
ThrowError("No key or command specified.");
|
||||
return;
|
||||
}
|
||||
|
||||
string keyString = args[0];
|
||||
string command = args[1];
|
||||
|
||||
if (Enum.TryParse(typeof(Keys), keyString, ignoreCase: true, out object outKey) && outKey is Keys key)
|
||||
{
|
||||
if (Keybinds.ContainsKey(key))
|
||||
{
|
||||
Keybinds[key] = command;
|
||||
}
|
||||
else
|
||||
{
|
||||
Keybinds.Add(key, command);
|
||||
}
|
||||
NewMessage($"\"{command}\" bound to {key}.", GUI.Style.Green);
|
||||
|
||||
if (GameMain.Config.keyMapping.FirstOrDefault(bind => bind.Key != Keys.None && bind.Key == key) is { } existingBind)
|
||||
{
|
||||
AddWarning($"\"{key}\" has already been bound to {(InputType)GameMain.Config.keyMapping.IndexOf(existingBind)}. The keybind will perform both actions when pressed.");
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
ThrowError($"Invalid key {keyString}.");
|
||||
}, isCheat: false, getValidArgs: () => new[] { Enum.GetNames(typeof(Keys)), new[] { "\"\"" } }));
|
||||
|
||||
commands.Add(new Command("unbindkey", "unbindkey [key]: Unbinds a command.", (string[] args) =>
|
||||
{
|
||||
if (args.Length < 1)
|
||||
{
|
||||
ThrowError("No key specified.");
|
||||
return;
|
||||
}
|
||||
|
||||
string keyString = args[0];
|
||||
if (Enum.TryParse(typeof(Keys), keyString, ignoreCase: true, out object outKey) && outKey is Keys key)
|
||||
{
|
||||
if (Keybinds.ContainsKey(key))
|
||||
{
|
||||
Keybinds.Remove(key);
|
||||
}
|
||||
NewMessage("Keybind unbound.", GUI.Style.Green);
|
||||
return;
|
||||
}
|
||||
ThrowError($"Invalid key {keyString}.");
|
||||
}, isCheat: false, getValidArgs: () => new[] { Keybinds.Keys.Select(keys => keys.ToString()).Distinct().ToArray() }));
|
||||
|
||||
commands.Add(new Command("savebinds", "savebinds: Writes current keybinds into the config file.", (string[] args) =>
|
||||
{
|
||||
ShowQuestionPrompt($"Some keybinds may render the game unusable, are you sure you want to make these keybinds persistent? ({Keybinds.Count} keybind(s) assigned) Y/N",
|
||||
(option2) =>
|
||||
{
|
||||
if (option2.ToLower() != "y")
|
||||
{
|
||||
NewMessage("Aborted.", GUI.Style.Red);
|
||||
return;
|
||||
}
|
||||
|
||||
GameSettings.ConsoleKeybinds = new Dictionary<Keys, string>(Keybinds);
|
||||
GameMain.Config.SaveNewPlayerConfig();
|
||||
|
||||
NewMessage($"{Keybinds.Count} keybind(s) written to the config file.", GUI.Style.Green);
|
||||
});
|
||||
}, isCheat: false));
|
||||
|
||||
commands.Add(new Command("togglegrid", "Toggle visual snap grid in sub editor.", (string[] args) =>
|
||||
{
|
||||
SubEditorScreen.ShouldDrawGrid = !SubEditorScreen.ShouldDrawGrid;
|
||||
NewMessage(SubEditorScreen.ShouldDrawGrid ? "Enabled submarine grid." : "Disabled submarine grid.", GUI.Style.Green);
|
||||
}));
|
||||
|
||||
commands.Add(new Command("spreadsheetexport", "Export items in format recognized by the spreadsheet importer.", (string[] args) =>
|
||||
{
|
||||
SpreadsheetExport.Export();
|
||||
}));
|
||||
|
||||
commands.Add(new Command("wikiimage_character", "Save an image of the currently controlled character with a transparent background.", (string[] args) =>
|
||||
{
|
||||
if (Character.Controlled == null) { return; }
|
||||
WikiImage.Create(Character.Controlled);
|
||||
}));
|
||||
|
||||
commands.Add(new Command("wikiimage_sub", "Save an image of the main submarine with a transparent background.", (string[] args) =>
|
||||
{
|
||||
if (Submarine.MainSub == null) { return; }
|
||||
WikiImage.Create(Submarine.MainSub);
|
||||
}));
|
||||
|
||||
AssignRelayToServer("kick", false);
|
||||
AssignRelayToServer("kickid", false);
|
||||
@@ -510,11 +654,19 @@ namespace Barotrauma
|
||||
AssignRelayToServer("verboselogging", false);
|
||||
AssignRelayToServer("freecam", false);
|
||||
AssignRelayToServer("steamnetdebug", false);
|
||||
AssignRelayToServer("quickstart", false);
|
||||
AssignRelayToServer("togglegrid", false);
|
||||
AssignRelayToServer("bindkey", false);
|
||||
AssignRelayToServer("unbindkey", false);
|
||||
AssignRelayToServer("savebinds", false);
|
||||
AssignRelayToServer("spreadsheetexport", false);
|
||||
#if DEBUG
|
||||
AssignRelayToServer("crash", false);
|
||||
AssignRelayToServer("showballastflorasprite", false);
|
||||
AssignRelayToServer("simulatedlatency", false);
|
||||
AssignRelayToServer("simulatedloss", false);
|
||||
AssignRelayToServer("simulatedduplicateschance", false);
|
||||
AssignRelayToServer("storeinfo", false);
|
||||
#endif
|
||||
|
||||
commands.Add(new Command("clientlist", "", (string[] args) => { }));
|
||||
@@ -552,14 +704,15 @@ namespace Barotrauma
|
||||
AssignOnExecute("explosion", (string[] args) =>
|
||||
{
|
||||
Vector2 explosionPos = GameMain.GameScreen.Cam.ScreenToWorld(PlayerInput.MousePosition);
|
||||
float range = 500, force = 10, damage = 50, structureDamage = 10, itemDamage = 100, empStrength = 0.0f;
|
||||
float range = 500, force = 10, damage = 50, structureDamage = 10, itemDamage = 100, empStrength = 0.0f, ballastFloraStrength = 50f;
|
||||
if (args.Length > 0) float.TryParse(args[0], out range);
|
||||
if (args.Length > 1) float.TryParse(args[1], out force);
|
||||
if (args.Length > 2) float.TryParse(args[2], out damage);
|
||||
if (args.Length > 3) float.TryParse(args[3], out structureDamage);
|
||||
if (args.Length > 4) float.TryParse(args[4], out itemDamage);
|
||||
if (args.Length > 5) float.TryParse(args[5], out empStrength);
|
||||
new Explosion(range, force, damage, structureDamage, itemDamage, empStrength).Explode(explosionPos, null);
|
||||
if (args.Length > 6) float.TryParse(args[6], out ballastFloraStrength);
|
||||
new Explosion(range, force, damage, structureDamage, itemDamage, empStrength, ballastFloraStrength).Explode(explosionPos, null);
|
||||
});
|
||||
|
||||
AssignOnExecute("teleportcharacter|teleport", (string[] args) =>
|
||||
@@ -997,6 +1150,17 @@ namespace Barotrauma
|
||||
});
|
||||
AssignRelayToServer("debugdraw", false);
|
||||
|
||||
AssignOnExecute("togglevoicechatfilters", (string[] args) =>
|
||||
{
|
||||
if (args.None() || !bool.TryParse(args[0], out bool state))
|
||||
{
|
||||
state = !GameMain.Config.DisableVoiceChatFilters;
|
||||
}
|
||||
GameMain.Config.DisableVoiceChatFilters = state;
|
||||
NewMessage("Voice chat filters " + (GameMain.Config.DisableVoiceChatFilters ? "disabled" : "enabled"), Color.White);
|
||||
});
|
||||
AssignRelayToServer("togglevoicechatfilters", false);
|
||||
|
||||
commands.Add(new Command("fpscounter", "fpscounter: Toggle the FPS counter.", (string[] args) =>
|
||||
{
|
||||
GameMain.ShowFPS = !GameMain.ShowFPS;
|
||||
@@ -1382,6 +1546,16 @@ namespace Barotrauma
|
||||
File.WriteAllLines(filePath, debugLines);
|
||||
ToolBox.OpenFileWithShell(Path.GetFullPath(filePath));
|
||||
}));
|
||||
|
||||
commands.Add(new Command("setfreecamspeed", "setfreecamspeed [speed]: Set the camera movement speed when not controlling a character. Defaults to 1.", (string[] args) =>
|
||||
{
|
||||
if (args.Length > 0)
|
||||
{
|
||||
float.TryParse(args[0], NumberStyles.Number, CultureInfo.InvariantCulture, out float speed);
|
||||
Screen.Selected.Cam.FreeCamMoveSpeed = speed;
|
||||
}
|
||||
}));
|
||||
|
||||
#if DEBUG
|
||||
commands.Add(new Command("setplanthealth", "setplanthealth [value]: Sets the health of the selected plant in sub editor.", (string[] args) =>
|
||||
{
|
||||
@@ -1416,6 +1590,12 @@ namespace Barotrauma
|
||||
}
|
||||
}));
|
||||
|
||||
commands.Add(new Command("showballastflorasprite", "", (string[] args) =>
|
||||
{
|
||||
BallastFloraBehavior.AlwaysShowBallastFloraSprite = !BallastFloraBehavior.AlwaysShowBallastFloraSprite;
|
||||
NewMessage("ok", GUI.Style.Green);
|
||||
}));
|
||||
|
||||
commands.Add(new Command("printreceivertransfers", "", (string[] args) =>
|
||||
{
|
||||
GameMain.Client.PrintReceiverTransters();
|
||||
@@ -1831,15 +2011,22 @@ namespace Barotrauma
|
||||
ToolBox.OpenFileWithShell(Path.GetFullPath(filePath));
|
||||
}));
|
||||
#if DEBUG
|
||||
commands.Add(new Command("playovervc", "Plays a sound over voice chat.", (args) =>
|
||||
{
|
||||
VoipCapture.Instance?.SetOverrideSound(args.Length > 0 ? args[0] : null);
|
||||
}));
|
||||
|
||||
commands.Add(new Command("querylobbies", "Queries all SteamP2P lobbies", (args) =>
|
||||
{
|
||||
Steamworks.Data.LobbyQuery lobbyQuery = Steamworks.SteamMatchmaking.CreateLobbyQuery().FilterDistanceWorldwide();
|
||||
|
||||
Steamworks.Data.Lobby[] lobbies = lobbyQuery.RequestAsync().Result;
|
||||
foreach (var lobby in lobbies)
|
||||
{
|
||||
DebugConsole.NewMessage(lobby.GetData("name") + ", " + lobby.GetData("lobbyowner"));
|
||||
}
|
||||
TaskPool.Add("DebugQueryLobbies",
|
||||
SteamManager.LobbyQueryRequest(), (t) => {
|
||||
var lobbies = ((Task<List<Steamworks.Data.Lobby>>)t).Result;
|
||||
foreach (var lobby in lobbies)
|
||||
{
|
||||
NewMessage(lobby.GetData("name") + ", " + lobby.GetData("lobbyowner"), Color.Yellow);
|
||||
}
|
||||
NewMessage($"Retrieved a total of {lobbies.Count} lobbies", Color.Lime);
|
||||
});
|
||||
}));
|
||||
|
||||
commands.Add(new Command("checkduplicates", "Checks the given language for duplicate translation keys and writes to file.", (string[] args) =>
|
||||
@@ -2236,6 +2423,37 @@ namespace Barotrauma
|
||||
}
|
||||
);
|
||||
|
||||
#if DEBUG
|
||||
commands.Add(new Command("setcurrentlocationtype", "setcurrentlocationtype [location type]: Change the type of the current location.", (string[] args) =>
|
||||
{
|
||||
var character = Character.Controlled;
|
||||
if (GameMain.GameSession?.Campaign == null)
|
||||
{
|
||||
ThrowError("Campaign not active!");
|
||||
return;
|
||||
}
|
||||
if (args.Length == 0)
|
||||
{
|
||||
ThrowError("Please give the location type after the command.");
|
||||
return;
|
||||
}
|
||||
var locationType = LocationType.List.Find(lt => lt.Identifier.Equals(args[0], StringComparison.OrdinalIgnoreCase));
|
||||
if (locationType == null)
|
||||
{
|
||||
ThrowError($"Could not find the location type \"{args[0]}\".");
|
||||
return;
|
||||
}
|
||||
GameMain.GameSession.Campaign.Map.CurrentLocation.ChangeType(locationType);
|
||||
},
|
||||
() =>
|
||||
{
|
||||
return new string[][]
|
||||
{
|
||||
LocationType.List.Select(lt => lt.Identifier).ToArray()
|
||||
};
|
||||
}));
|
||||
#endif
|
||||
|
||||
commands.Add(new Command("limbscale", "Define the limbscale for the controlled character. Provide id or name if you want to target another character. Note: the changes are not saved!", (string[] args) =>
|
||||
{
|
||||
var character = Character.Controlled;
|
||||
|
||||
Reference in New Issue
Block a user