aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb2
-rw-r--r--ShiftOS.Server/Core.cs26
-rw-r--r--ShiftOS.WinForms/Applications/Artpad.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Chat.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Dialog.cs6
-rw-r--r--ShiftOS.WinForms/Applications/Downloader.cs1
-rw-r--r--ShiftOS.WinForms/Applications/FormatEditor.cs1
-rw-r--r--ShiftOS.WinForms/Applications/GraphicPicker.cs1
-rw-r--r--ShiftOS.WinForms/Applications/MUDControlCentre.cs1
-rw-r--r--ShiftOS.WinForms/Applications/NameChanger.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Pong.cs1
-rw-r--r--ShiftOS.WinForms/Applications/ShiftLetters.cs1
-rw-r--r--ShiftOS.WinForms/Applications/ShiftLotto.cs1
-rw-r--r--ShiftOS.WinForms/Applications/ShiftSweeper.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Shifter.cs25
-rw-r--r--ShiftOS.WinForms/Applications/Shiftnet.cs8
-rw-r--r--ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs1
-rw-r--r--ShiftOS.WinForms/Applications/Terminal.cs16
-rw-r--r--ShiftOS.WinForms/Applications/TutorialBox.cs3
-rw-r--r--ShiftOS.WinForms/Controls/TerminalBox.cs26
-rw-r--r--ShiftOS.WinForms/HackerCommands.cs116
-rw-r--r--ShiftOS.WinForms/Tools/ControlManager.cs42
-rw-r--r--ShiftOS.WinForms/WinformsWindowManager.cs18
-rw-r--r--ShiftOS_TheReturn.sln12
-rw-r--r--ShiftOS_TheReturn/AppLauncherDaemon.cs20
-rw-r--r--ShiftOS_TheReturn/Commands.cs52
-rw-r--r--ShiftOS_TheReturn/ConsoleEx.cs28
-rw-r--r--ShiftOS_TheReturn/Infobox.cs6
-rw-r--r--ShiftOS_TheReturn/KernelWatchdog.cs64
-rw-r--r--ShiftOS_TheReturn/Scripting.cs53
-rw-r--r--ShiftOS_TheReturn/ServerManager.cs13
-rw-r--r--ShiftOS_TheReturn/ShiftOS.Engine.csproj1
-rw-r--r--ShiftOS_TheReturn/Skinning.cs4
-rw-r--r--ShiftOS_TheReturn/TerminalBackend.cs234
34 files changed, 639 insertions, 148 deletions
diff --git a/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb b/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb
index 0a65a5e..161012d 100644
--- a/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb
+++ b/ShiftOS.Modding.VB.LegacySkinConverter/Module1.vb
@@ -206,7 +206,7 @@ Public Class SkinConverterCommands
skn.Header2Font = New Font("Microsoft Sans Serif", 15, FontStyle.Regular)
skn.Header3Font = New Font("Microsoft Sans Serif", 12.5, FontStyle.Regular)
- skn.TerminalBackColor = Color.Black
+ skn.TerminalBackColorCC = ConsoleColor.Black
Console.WriteLine(" ...done!")
Console.WriteLine("Skin conversion complete.")
diff --git a/ShiftOS.Server/Core.cs b/ShiftOS.Server/Core.cs
index 4ec421d..e14ca27 100644
--- a/ShiftOS.Server/Core.cs
+++ b/ShiftOS.Server/Core.cs
@@ -96,10 +96,11 @@ namespace ShiftOS.Server
{
Name = "run",
GUID = "Server",
- Contents = $@"{{
- script:""{File.ReadAllText($"scripts/{user}/{script}.lua").Replace("\"", "\\\"")}"",
- args:""{sArgs}""
- }}"
+ Contents = JsonConvert.SerializeObject(new
+ {
+ script = File.ReadAllText($"scripts/{user}/{script}.lua"),
+ args = sArgs
+ })
}));
}
else
@@ -115,7 +116,7 @@ namespace ShiftOS.Server
{
Name = "Error",
GUID = "Server",
- Contents = JsonConvert.SerializeObject(new MudException("Command parse error"))
+ Contents = JsonConvert.SerializeObject(new MudException("<script_runner> Script not found or script error detected."))
}));
}
catch
@@ -126,6 +127,17 @@ namespace ShiftOS.Server
}
+ [MudRequest("diag_log", typeof(string))]
+ public static void Diagnostic(string guid, string line)
+ {
+ List<string> lines = new List<string>();
+ if (File.Exists("diagnostics.log"))
+ lines = new List<string>(File.ReadAllLines("diagnostics.log"));
+
+ lines.Add(line);
+ File.WriteAllLines("diagnostics.log", lines.ToArray());
+ }
+
[MudRequest("getusers", typeof(string))]
public static void GetAllUsers(string guid, string contents)
{
@@ -182,8 +194,8 @@ namespace ShiftOS.Server
GUID = "server",
Contents = JsonConvert.SerializeObject(saveFile)
}));
+ return;
}
- return;
}
}
foreach (var sve in Directory.GetFiles("saves"))
@@ -199,8 +211,8 @@ namespace ShiftOS.Server
GUID = "server",
Contents = JsonConvert.SerializeObject(saveFile)
}));
+ return;
}
- return;
}
}
diff --git a/ShiftOS.WinForms/Applications/Artpad.cs b/ShiftOS.WinForms/Applications/Artpad.cs
index 6c1bc1c..71f7afb 100644
--- a/ShiftOS.WinForms/Applications/Artpad.cs
+++ b/ShiftOS.WinForms/Applications/Artpad.cs
@@ -41,6 +41,7 @@ using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[Launcher("Artpad", true, "al_artpad", "Graphics")]
[RequiresUpgrade("artpad")]
[WinOpen("artpad")]
diff --git a/ShiftOS.WinForms/Applications/Chat.cs b/ShiftOS.WinForms/Applications/Chat.cs
index 06a7873..caf8cd2 100644
--- a/ShiftOS.WinForms/Applications/Chat.cs
+++ b/ShiftOS.WinForms/Applications/Chat.cs
@@ -36,6 +36,7 @@ using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
public partial class Chat : UserControl, IShiftOSWindow
{
public Chat(string chatId)
diff --git a/ShiftOS.WinForms/Applications/Dialog.cs b/ShiftOS.WinForms/Applications/Dialog.cs
index 26e3040..11fbf1e 100644
--- a/ShiftOS.WinForms/Applications/Dialog.cs
+++ b/ShiftOS.WinForms/Applications/Dialog.cs
@@ -76,12 +76,16 @@ namespace ShiftOS.WinForms.Applications
btnok.Click += (o, a) =>
{
AppearanceManager.Close(this);
+ OpenCallback?.Invoke();
};
}
- public void Open(string title, string msg)
+ private Action OpenCallback = null;
+
+ public void Open(string title, string msg, Action c = null)
{
+ OpenCallback = c;
new Dialog().OpenInternal(title, msg);
}
diff --git a/ShiftOS.WinForms/Applications/Downloader.cs b/ShiftOS.WinForms/Applications/Downloader.cs
index da90c6d..1f240bf 100644
--- a/ShiftOS.WinForms/Applications/Downloader.cs
+++ b/ShiftOS.WinForms/Applications/Downloader.cs
@@ -41,6 +41,7 @@ using System.IO.Compression;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[Launcher("Downloader", false, null, "Networking")]
[DefaultIcon("iconDownloader")]
public partial class Downloader : UserControl, IShiftOSWindow
diff --git a/ShiftOS.WinForms/Applications/FormatEditor.cs b/ShiftOS.WinForms/Applications/FormatEditor.cs
index ef44b47..56b0253 100644
--- a/ShiftOS.WinForms/Applications/FormatEditor.cs
+++ b/ShiftOS.WinForms/Applications/FormatEditor.cs
@@ -34,6 +34,7 @@ using System.Windows.Forms;
using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications {
+ [MultiplayerOnly]
[Launcher("FormatEditor", true, "al_format_editor", "Games")]
[RequiresUpgrade("format_editor")]
[WinOpen("formateditor")]
diff --git a/ShiftOS.WinForms/Applications/GraphicPicker.cs b/ShiftOS.WinForms/Applications/GraphicPicker.cs
index 2dfe7ec..b3dd8bf 100644
--- a/ShiftOS.WinForms/Applications/GraphicPicker.cs
+++ b/ShiftOS.WinForms/Applications/GraphicPicker.cs
@@ -37,6 +37,7 @@ using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[DefaultTitle("Choose graphic")] [DefaultIcon("icongraphicpicker")]
public partial class GraphicPicker : UserControl, IShiftOSWindow
{
diff --git a/ShiftOS.WinForms/Applications/MUDControlCentre.cs b/ShiftOS.WinForms/Applications/MUDControlCentre.cs
index 02fe868..e2668bd 100644
--- a/ShiftOS.WinForms/Applications/MUDControlCentre.cs
+++ b/ShiftOS.WinForms/Applications/MUDControlCentre.cs
@@ -38,6 +38,7 @@ using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[RequiresUpgrade("mud_fundamentals")]
[Launcher("MUD Control Centre", true, "al_mud_control_centre", "Networking")]
[WinOpen("mud_control_centre")]
diff --git a/ShiftOS.WinForms/Applications/NameChanger.cs b/ShiftOS.WinForms/Applications/NameChanger.cs
index ca76e57..d7c99f7 100644
--- a/ShiftOS.WinForms/Applications/NameChanger.cs
+++ b/ShiftOS.WinForms/Applications/NameChanger.cs
@@ -38,6 +38,7 @@ using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications {
+ [MultiplayerOnly]
[Launcher("Name Changer", true, "al_name_changer", "Customization")]
[RequiresUpgrade("name_changer")]
[WinOpen("name_changer")]
diff --git a/ShiftOS.WinForms/Applications/Pong.cs b/ShiftOS.WinForms/Applications/Pong.cs
index af1e156..157ce8c 100644
--- a/ShiftOS.WinForms/Applications/Pong.cs
+++ b/ShiftOS.WinForms/Applications/Pong.cs
@@ -37,6 +37,7 @@ using ShiftOS.Objects;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[Launcher("Pong", true, "al_pong", "Games")]
[WinOpen("pong")]
[DefaultIcon("iconPong")]
diff --git a/ShiftOS.WinForms/Applications/ShiftLetters.cs b/ShiftOS.WinForms/Applications/ShiftLetters.cs
index 700df7e..b5e9aa4 100644
--- a/ShiftOS.WinForms/Applications/ShiftLetters.cs
+++ b/ShiftOS.WinForms/Applications/ShiftLetters.cs
@@ -36,6 +36,7 @@ using System.Windows.Forms;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[Launcher("ShiftLetters", false, null, "Games")]
[RequiresUpgrade("shiftletters")]
[WinOpen("shiftletters")]
diff --git a/ShiftOS.WinForms/Applications/ShiftLotto.cs b/ShiftOS.WinForms/Applications/ShiftLotto.cs
index 4b1c983..5ab8154 100644
--- a/ShiftOS.WinForms/Applications/ShiftLotto.cs
+++ b/ShiftOS.WinForms/Applications/ShiftLotto.cs
@@ -35,6 +35,7 @@ using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications
{
[Launcher("ShiftLotto", true, "al_shiftlotto", "Games")]
+ [MultiplayerOnly]
[DefaultIcon("iconShiftLotto")]
[RequiresUpgrade("shiftlotto")]
[WinOpen("shiftlotto")]
diff --git a/ShiftOS.WinForms/Applications/ShiftSweeper.cs b/ShiftOS.WinForms/Applications/ShiftSweeper.cs
index b13880f..cf6d331 100644
--- a/ShiftOS.WinForms/Applications/ShiftSweeper.cs
+++ b/ShiftOS.WinForms/Applications/ShiftSweeper.cs
@@ -36,6 +36,7 @@ using ShiftOS.Engine;
namespace ShiftOS.WinForms.Applications {
[Launcher("ShiftSweeper", true, "al_shiftsweeper", "Games")]
[RequiresUpgrade("shiftsweeper")]
+ [MultiplayerOnly]
[WinOpen("shiftsweeper")]
[DefaultIcon("iconShiftSweeper")]
public partial class ShiftSweeper : UserControl, IShiftOSWindow {
diff --git a/ShiftOS.WinForms/Applications/Shifter.cs b/ShiftOS.WinForms/Applications/Shifter.cs
index 4d29cf8..fe2bf20 100644
--- a/ShiftOS.WinForms/Applications/Shifter.cs
+++ b/ShiftOS.WinForms/Applications/Shifter.cs
@@ -40,6 +40,7 @@ using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications
{
+ [MultiplayerOnly]
[Launcher("Shifter", true, "al_shifter", "Customization")]
[RequiresUpgrade("shifter")]
[WinOpen("shifter")]
@@ -446,6 +447,30 @@ namespace ShiftOS.WinForms.Applications
flbody.Controls.Add(color);
color.Show();
}
+ else if(c.Field.FieldType.IsEnum == true)
+ {
+ var cBox = new ComboBox();
+ cBox.Width = 150;
+ ControlManager.SetupControl(cBox);
+
+ foreach(var itm in Enum.GetNames(c.Field.FieldType))
+ {
+ cBox.Items.Add(itm);
+ }
+
+ cBox.Text = c.Field.GetValue(LoadedSkin).ToString();
+
+ cBox.SelectedIndexChanged += (o, a) =>
+ {
+ c.Field.SetValue(LoadedSkin, Enum.Parse(c.Field.FieldType, cBox.Text));
+ };
+
+ labelHeight = cBox.Height;
+
+ flbody.Controls.Add(cBox);
+ cBox.Show();
+ flbody.SetFlowBreak(cBox, true);
+ }
else if(c.Field.FieldType == typeof(int))
{
if (c.Field.HasShifterEnumMask())
diff --git a/ShiftOS.WinForms/Applications/Shiftnet.cs b/ShiftOS.WinForms/Applications/Shiftnet.cs
index 9540794..c1c81d5 100644
--- a/ShiftOS.WinForms/Applications/Shiftnet.cs
+++ b/ShiftOS.WinForms/Applications/Shiftnet.cs
@@ -34,9 +34,11 @@ using System.Windows.Forms;
using ShiftOS.Engine;
using Newtonsoft.Json;
using static ShiftOS.Engine.SkinEngine;
+using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications {
[Launcher("Shiftnet", false, null, "Networking")]
+ [MultiplayerOnly]
[DefaultIcon("iconShiftnet")]
public partial class Shiftnet : UserControl, IShiftOSWindow {
public Shiftnet() {
@@ -62,6 +64,8 @@ namespace ShiftOS.WinForms.Applications {
}
public string ConstructHtml(string markdown) {
+ var TerminalForeColor = ControlManager.ConvertColor(SkinEngine.LoadedSkin.TerminalForeColorCC);
+ var TerminalBackColor = ControlManager.ConvertColor(SkinEngine.LoadedSkin.TerminalBackColorCC);
string html = $@"<html>
<head>
<style>
@@ -90,8 +94,8 @@ namespace ShiftOS.WinForms.Applications {
pre, code {{
font-family: ""{LoadedSkin.TerminalFont.Name}"";
font-size: {LoadedSkin.TerminalFont.SizeInPoints}pt;
- color: rgb({LoadedSkin.TerminalForeColor.R}, {LoadedSkin.TerminalForeColor.G}, {LoadedSkin.TerminalForeColor.B});
- background-color: rgb({LoadedSkin.TerminalBackColor.R}, {LoadedSkin.TerminalBackColor.G}, {LoadedSkin.TerminalBackColor.B});
+ color: rgb({TerminalForeColor.R}, {TerminalForeColor.G}, {TerminalForeColor.B});
+ background-color: rgb({TerminalBackColor.R}, {TerminalBackColor.G}, {TerminalBackColor.B});
}}
</style>
</head>
diff --git a/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs b/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs
index b3724ae..0580b47 100644
--- a/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs
+++ b/ShiftOS.WinForms/Applications/ShiftoriumFrontend.cs
@@ -39,6 +39,7 @@ namespace ShiftOS.WinForms.Applications
{
[Launcher("Shiftorium", true, "al_shiftorium", "Utilities")]
[RequiresUpgrade("shiftorium_gui")]
+ [MultiplayerOnly]
[WinOpen("shiftorium")]
[DefaultTitle("Shiftorium")]
[DefaultIcon("iconShiftorium")]
diff --git a/ShiftOS.WinForms/Applications/Terminal.cs b/ShiftOS.WinForms/Applications/Terminal.cs
index 7bab213..06a6e8d 100644
--- a/ShiftOS.WinForms/Applications/Terminal.cs
+++ b/ShiftOS.WinForms/Applications/Terminal.cs
@@ -43,6 +43,7 @@ using System.Collections;
using static ShiftOS.Engine.SkinEngine;
using ShiftOS.Engine;
using ShiftOS.Objects;
+using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Applications
{
@@ -134,7 +135,7 @@ namespace ShiftOS.WinForms.Applications
rtbterm.Text = "";
TerminalBackend.PrefixEnabled = true;
TerminalBackend.InStory = false;
- Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ");
+ TerminalBackend.PrintPrompt();
if (Shiftorium.UpgradeInstalled("wm_free_placement"))
{
this.ParentForm.Width = 640;
@@ -276,7 +277,7 @@ namespace ShiftOS.WinForms.Applications
}
if (TerminalBackend.PrefixEnabled)
{
- Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ");
+ TerminalBackend.PrintPrompt();
}
}
}
@@ -350,8 +351,8 @@ namespace ShiftOS.WinForms.Applications
txt.Focus();
txt.Font = LoadedSkin.TerminalFont;
- txt.ForeColor = LoadedSkin.TerminalForeColor;
- txt.BackColor = LoadedSkin.TerminalBackColor;
+ txt.ForeColor = ControlManager.ConvertColor(LoadedSkin.TerminalForeColorCC);
+ txt.BackColor = ControlManager.ConvertColor(LoadedSkin.TerminalBackColorCC);
}
@@ -391,8 +392,7 @@ namespace ShiftOS.WinForms.Applications
rtbterm.Text = AppearanceManager.LastTerminalText;
rtbterm.Select(rtbterm.TextLength, 0);
}
- Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ");
-
+ TerminalBackend.PrintPrompt();
}
@@ -403,8 +403,8 @@ namespace ShiftOS.WinForms.Applications
try
{
rtbterm.Font = LoadedSkin.TerminalFont;
- rtbterm.ForeColor = LoadedSkin.TerminalForeColor;
- rtbterm.BackColor = LoadedSkin.TerminalBackColor;
+ rtbterm.ForeColor = ControlManager.ConvertColor(LoadedSkin.TerminalForeColorCC);
+ rtbterm.BackColor = ControlManager.ConvertColor(LoadedSkin.TerminalBackColorCC);
}
catch
{
diff --git a/ShiftOS.WinForms/Applications/TutorialBox.cs b/ShiftOS.WinForms/Applications/TutorialBox.cs
index 25921e1..3c74443 100644
--- a/ShiftOS.WinForms/Applications/TutorialBox.cs
+++ b/ShiftOS.WinForms/Applications/TutorialBox.cs
@@ -21,6 +21,8 @@ namespace ShiftOS.WinForms.Applications
InitializeComponent();
IsComplete = false;
lbltuttext.Text = "";
+ lbltuttext.Padding = new Padding(15);
+ lbltuttext.Margin = lbltuttext.Padding;
}
bool stillTyping = false;
@@ -47,6 +49,7 @@ namespace ShiftOS.WinForms.Applications
}));
Thread.Sleep(75);
}
+ Thread.Sleep(5000);
stillTyping = false;
}).Start();
}
diff --git a/ShiftOS.WinForms/Controls/TerminalBox.cs b/ShiftOS.WinForms/Controls/TerminalBox.cs
index b75d077..9e4c61c 100644
--- a/ShiftOS.WinForms/Controls/TerminalBox.cs
+++ b/ShiftOS.WinForms/Controls/TerminalBox.cs
@@ -24,11 +24,14 @@
using System;
using System.Collections.Generic;
+using System.Drawing;
using System.Linq;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using ShiftOS.Engine;
+using ShiftOS.WinForms.Tools;
namespace ShiftOS.WinForms.Controls
{
@@ -53,13 +56,36 @@ namespace ShiftOS.WinForms.Controls
public void Write(string text)
{
this.HideSelection = true;
+ this.Select(this.TextLength, 0);
+ this.SelectionFont = ConstructFont();
+ this.SelectionColor = ControlManager.ConvertColor(ConsoleEx.ForegroundColor);
+ this.SelectionBackColor = ControlManager.ConvertColor(ConsoleEx.BackgroundColor);
this.AppendText(Localization.Parse(text));
this.HideSelection = false;
}
+ private Font ConstructFont()
+ {
+ FontStyle fs = FontStyle.Regular;
+ if (ConsoleEx.Bold)
+ fs = fs | FontStyle.Bold;
+ if (ConsoleEx.Italic)
+ fs = fs | FontStyle.Italic;
+ if (ConsoleEx.Underline)
+ fs = fs | FontStyle.Underline;
+
+ return new Font(this.Font, fs);
+ }
+
public void WriteLine(string text)
{
+ this.HideSelection = true;
+ this.Select(this.TextLength, 0);
+ this.SelectionFont = ConstructFont();
+ this.SelectionColor = ControlManager.ConvertColor(ConsoleEx.ForegroundColor);
+ this.SelectionBackColor = ControlManager.ConvertColor(ConsoleEx.BackgroundColor);
this.AppendText(Localization.Parse(text) + Environment.NewLine);
+ this.HideSelection = false;
}
bool quickCopying = false;
diff --git a/ShiftOS.WinForms/HackerCommands.cs b/ShiftOS.WinForms/HackerCommands.cs
index f3f132e..107343b 100644
--- a/ShiftOS.WinForms/HackerCommands.cs
+++ b/ShiftOS.WinForms/HackerCommands.cs
@@ -59,10 +59,25 @@ namespace ShiftOS.WinForms
{
private static void writeSlow(string text)
{
- Console.Write("[hacker101@undisclosed]: ");
- Thread.Sleep(200);
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ ConsoleEx.Bold = false;
+ ConsoleEx.Italic = false;
+ Console.Write("[");
+ ConsoleEx.ForegroundColor = ConsoleColor.Magenta;
+ ConsoleEx.Bold = true;
+ Console.Write("hacker101");
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ ConsoleEx.Italic = true;
+ Console.Write("@");
+ ConsoleEx.ForegroundColor = ConsoleColor.White;
+ Console.Write("undisclosed");
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ ConsoleEx.Bold = false;
+ ConsoleEx.Italic = false;
+ Console.Write("]: ");
+ Thread.Sleep(850);
Console.WriteLine(text);
- Thread.Sleep(1000);
+ Thread.Sleep(4000);
}
[Story("hacker101_deadaccts")]
@@ -121,9 +136,12 @@ namespace ShiftOS.WinForms
TerminalBackend.PrefixEnabled = true;
Console.Write($"{SaveSystem.CurrentSave.Username}@{SaveSystem.CurrentSave.SystemName}:~$ ");
StartHackerTutorial();
+ TerminalBackend.PrefixEnabled = true;
+ TerminalBackend.PrintPrompt();
});
t.IsBackground = true;
t.Start();
+ TerminalBackend.PrefixEnabled = false;
}
internal static void StartHackerTutorial()
@@ -140,8 +158,7 @@ namespace ShiftOS.WinForms
int tutPos = 0;
Action ondec = () =>
{
- if (tutPos == 2)
- tutPos++;
+ tutPos++;
};
TerminalBackend.CommandProcessed += (o, a) =>
{
@@ -351,6 +368,7 @@ namespace ShiftOS.WinForms
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_";
+ [MultiplayerOnly]
[Command("breach_user_password")]
[KernelMode]
[RequiresArgument("user")]
@@ -377,6 +395,9 @@ namespace ShiftOS.WinForms
if(rnd.Next(0, 100) >= 75)
{
Console.WriteLine("--operation took too long - failed.");
+ ServerManager.SendMessage("mud_save_allow_dead", JsonConvert.SerializeObject(sve));
+ ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrefixEnabled = true;
return;
}
sw.Stop();
@@ -385,13 +406,16 @@ namespace ShiftOS.WinForms
Console.WriteLine("--password breached. Operation took " + sw.ElapsedMilliseconds + " milliseconds.");
received = true;
ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrintPrompt();
}
else if(msg.Name == "user_data_not_found")
{
Console.WriteLine("--access denied.");
received = true;
ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrintPrompt();
}
+ TerminalBackend.PrefixEnabled = true;
};
Console.WriteLine("--beginning brute-force attack on " + usr + "@" + sys + "...");
@@ -402,10 +426,13 @@ namespace ShiftOS.WinForms
user = usr,
sysname = sys
}));
+ TerminalBackend.PrefixEnabled = false;
Thread.Sleep(500);
return true;
}
+
+ [MultiplayerOnly]
[Command("print_user_info")]
[KernelMode]
[RequiresArgument("pass")]
@@ -442,14 +469,17 @@ namespace ShiftOS.WinForms
}
received = true;
ServerManager.MessageReceived -= msgReceived;
-
+ TerminalBackend.PrintPrompt();
+
}
else if (msg.Name == "user_data_not_found")
{
Console.WriteLine("--access denied.");
received = true;
ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrintPrompt();
}
+ TerminalBackend.PrefixEnabled = true;
};
Console.WriteLine("--contacting multi-user domain...");
@@ -461,9 +491,11 @@ namespace ShiftOS.WinForms
sysname = sys
}));
Thread.Sleep(500);
+ TerminalBackend.PrefixEnabled = false;
return true;
}
+ [MultiplayerOnly]
[Command("steal_codepoints")]
[KernelMode]
[RequiresArgument("amount")]
@@ -498,6 +530,8 @@ namespace ShiftOS.WinForms
if(amount > sve.Codepoints)
{
Console.WriteLine("--can't steal this many codepoints from user.");
+ ServerManager.SendMessage("mud_save_allow_dead", JsonConvert.SerializeObject(sve));
+ TerminalBackend.PrefixEnabled = true;
return;
}
@@ -512,13 +546,16 @@ namespace ShiftOS.WinForms
}
received = true;
ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrintPrompt();
}
else if (msg.Name == "user_data_not_found")
{
Console.WriteLine("--access denied.");
received = true;
ServerManager.MessageReceived -= msgReceived;
+ TerminalBackend.PrintPrompt();
}
+ TerminalBackend.PrefixEnabled = true;
};
Console.WriteLine("--contacting multi-user domain...");
@@ -531,10 +568,64 @@ namespace ShiftOS.WinForms
sysname = sys
}));
Thread.Sleep(500);
-
+ TerminalBackend.PrefixEnabled = false;
return true;
}
+ [MultiplayerOnly]
+ [Command("purge_user")]
+ [KernelMode]
+ [RequiresArgument("pass")]
+ [RequiresArgument("user")]
+ [RequiresArgument("sys")]
+ [RequiresUpgrade("hacker101_deadaccts")]
+ public static bool PurgeUser(Dictionary<string, object> args)
+ {
+ string usr = args["user"].ToString();
+ string sys = args["sys"].ToString();
+ string pass = args["pass"].ToString();
+ ServerMessageReceived msgReceived = null;
+
+ Console.WriteLine("--hooking multi-user domain response call...");
+
+ msgReceived = (msg) =>
+ {
+ if (msg.Name == "user_data")
+ {
+ var sve = JsonConvert.DeserializeObject<Save>(msg.Contents);
+ if (sve.Password == pass)
+ {
+ ServerManager.SendMessage("delete_dead_save", JsonConvert.SerializeObject(sve));
+ Console.WriteLine("<mud> User purged successfully.");
+ }
+ else
+ {
+ Console.WriteLine("--access denied.");
+ }
+ ServerManager.MessageReceived -= msgReceived;
+ }
+ else if (msg.Name == "user_data_not_found")
+ {
+ Console.WriteLine("--access denied.");
+ ServerManager.MessageReceived -= msgReceived;
+ }
+ TerminalBackend.PrintPrompt();
+ TerminalBackend.PrefixEnabled = true;
+ };
+
+ Console.WriteLine("--contacting multi-user domain...");
+ Thread.Sleep(500);
+ ServerManager.MessageReceived += msgReceived;
+
+ ServerManager.SendMessage("get_user_data", JsonConvert.SerializeObject(new
+ {
+ user = usr,
+ sysname = sys
+ }));
+ Thread.Sleep(500);
+ TerminalBackend.PrefixEnabled = false;
+ return true;
+ }
[Command("brute_decrypt", true)]
@@ -577,6 +668,7 @@ namespace ShiftOS.WinForms
}
}
+ [MultiplayerOnly]
[Namespace("storydev")]
public static class StoryDevCommands
{
@@ -608,5 +700,15 @@ namespace ShiftOS.WinForms
return true;
}
+
+ [Command("experience", description = "Marks a story plot as experienced without triggering the plot.", usage ="{id:}")]
+ [RequiresArgument("id")]
+ [RemoteLock]
+ public static bool Experience(Dictionary<string, object> args)
+ {
+ SaveSystem.CurrentSave.StoriesExperienced.Add(args["id"].ToString());
+ SaveSystem.SaveGame();
+ return true;
+ }
}
}
diff --git a/ShiftOS.WinForms/Tools/ControlManager.cs b/ShiftOS.WinForms/Tools/ControlManager.cs
index 5cc4813..52663d7 100644
--- a/ShiftOS.WinForms/Tools/ControlManager.cs
+++ b/ShiftOS.WinForms/Tools/ControlManager.cs
@@ -152,6 +152,48 @@ namespace ShiftOS.WinForms.Tools
}
}
+ internal static Color ConvertColor(ConsoleColor cCol)
+ {
+ switch (cCol)
+ {
+ case ConsoleColor.Black:
+ return Color.Black;
+ case ConsoleColor.Gray:
+ return Color.Gray;
+ case ConsoleColor.DarkGray:
+ return Color.DarkGray;
+ case ConsoleColor.Blue:
+ return Color.Blue;
+ case ConsoleColor.Cyan:
+ return Color.Cyan;
+ case ConsoleColor.DarkBlue:
+ return Color.DarkBlue;
+ case ConsoleColor.DarkCyan:
+ return Color.DarkCyan;
+ case ConsoleColor.DarkGreen:
+ return Color.DarkGreen;
+ case ConsoleColor.DarkMagenta:
+ return Color.DarkMagenta;
+ case ConsoleColor.DarkRed:
+ return Color.DarkRed;
+ case ConsoleColor.DarkYellow:
+ return Color.YellowGreen;
+ case ConsoleColor.Yellow:
+ return Color.Yellow;
+ case ConsoleColor.Green:
+ return Color.Green;
+ case ConsoleColor.Magenta:
+ return Color.Magenta;
+ case ConsoleColor.Red:
+ return Color.Red;
+ case ConsoleColor.White:
+ return Color.White;
+ default:
+ return Color.Black;
+ }
+
+ }
+
public static void SetCursor(Control ctrl)
{
#if STUPID
diff --git a/ShiftOS.WinForms/WinformsWindowManager.cs b/ShiftOS.WinForms/WinformsWindowManager.cs
index b8f0cae..eeaa6c9 100644
--- a/ShiftOS.WinForms/WinformsWindowManager.cs
+++ b/ShiftOS.WinForms/WinformsWindowManager.cs
@@ -106,6 +106,24 @@ namespace ShiftOS.WinForms
return;
}
+ foreach(var attr in form.GetType().GetCustomAttributes(true))
+ {
+ if(attr is MultiplayerOnlyAttribute)
+ {
+ if(KernelWatchdog.MudConnected == false)
+ {
+ Infobox.PromptYesNo("Disconnected from MUD", "This application requires a connection to the MUD. Would you like to reconnect?", new Action<bool>((answer) =>
+ {
+ if(answer == true)
+ {
+ KernelWatchdog.MudConnected = true;
+ SetupWindow(form);
+ }
+ }));
+ return;
+ }
+ }
+ }
if (!Shiftorium.UpgradeAttributesUnlocked(form.GetType()))
{
diff --git a/ShiftOS_TheReturn.sln b/ShiftOS_TheReturn.sln
index 7f7acdf..a3eb2a0 100644
--- a/ShiftOS_TheReturn.sln
+++ b/ShiftOS_TheReturn.sln
@@ -21,6 +21,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModLauncher", "ModLauncher\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShiftOS.Server.WebAdmin", "ShiftOS.Server.WebAdmin\ShiftOS.Server.WebAdmin.csproj", "{B29FDD06-E6FE-40A2-8258-283728CED81A}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gwen", "Gwen\Gwen.csproj", "{ADDA2F43-96C0-497F-8216-29C67ABC9806}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gwen.Renderer.OpenTK", "Gwen.Renderer.OpenTK\Gwen.Renderer.OpenTK.csproj", "{41650C82-D630-4E5C-845A-F1513C8FDC99}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -63,6 +67,14 @@ Global
{B29FDD06-E6FE-40A2-8258-283728CED81A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B29FDD06-E6FE-40A2-8258-283728CED81A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B29FDD06-E6FE-40A2-8258-283728CED81A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ADDA2F43-96C0-497F-8216-29C67ABC9806}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ADDA2F43-96C0-497F-8216-29C67ABC9806}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ADDA2F43-96C0-497F-8216-29C67ABC9806}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ADDA2F43-96C0-497F-8216-29C67ABC9806}.Release|Any CPU.Build.0 = Release|Any CPU
+ {41650C82-D630-4E5C-845A-F1513C8FDC99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {41650C82-D630-4E5C-845A-F1513C8FDC99}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {41650C82-D630-4E5C-845A-F1513C8FDC99}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {41650C82-D630-4E5C-845A-F1513C8FDC99}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/ShiftOS_TheReturn/AppLauncherDaemon.cs b/ShiftOS_TheReturn/AppLauncherDaemon.cs
index 7ef34c1..5e3bd72 100644
--- a/ShiftOS_TheReturn/AppLauncherDaemon.cs
+++ b/ShiftOS_TheReturn/AppLauncherDaemon.cs
@@ -66,12 +66,24 @@ namespace ShiftOS.Engine
{
foreach (var attr in type.GetCustomAttributes(false))
{
- if (attr is LauncherAttribute)
+ bool isAllowed = true;
+ if(attr is MultiplayerOnlyAttribute)
{
- var launch = attr as LauncherAttribute;
- if (launch.UpgradeInstalled)
+ if(KernelWatchdog.MudConnected == false)
{
- win.Add(new LauncherItem { DisplayData = launch, LaunchType = type });
+ isAllowed = false;
+
+ }
+ }
+ if (isAllowed == true)
+ {
+ if (attr is LauncherAttribute)
+ {
+ var launch = attr as LauncherAttribute;
+ if (launch.UpgradeInstalled)
+ {
+ win.Add(new LauncherItem { DisplayData = launch, LaunchType = type });
+ }
}
}
}
diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs
index 0ea00e5..7e517c1 100644
--- a/ShiftOS_TheReturn/Commands.cs
+++ b/ShiftOS_TheReturn/Commands.cs
@@ -133,6 +133,7 @@ namespace ShiftOS.Engine
[Namespace("mud")]
public static class MUDCommands
{
+ [MultiplayerOnly]
[Command("status")]
public static bool Status()
{
@@ -155,6 +156,8 @@ namespace ShiftOS.Engine
{
Console.WriteLine("{ERROR}: " + ex.Message);
}
+
+ TerminalBackend.PrefixEnabled = false;
return true;
}
catch (Exception ex)
@@ -174,6 +177,7 @@ namespace ShiftOS.Engine
return true;
}
+ [MultiplayerOnly]
[Command("disconnect")]
[RequiresUpgrade("hacker101_deadaccts")]
public static bool Disconnect()
@@ -183,6 +187,7 @@ namespace ShiftOS.Engine
return true;
}
+ [MultiplayerOnly]
[Command("sendmsg")]
[KernelMode]
[RequiresUpgrade("hacker101_deadaccts")]
@@ -195,48 +200,6 @@ namespace ShiftOS.Engine
}
}
- [RequiresUpgrade("mud_fundamentals")]
- [Namespace("chat")]
- public static class ChatCommands
- {
- [RequiresArgument("id")]
- [RequiresArgument("name")]
- [RequiresArgument("topic")]
- [Command("create")]
- public static bool CreateChat(Dictionary<string, object> args)
- {
- string id = "";
- string topic = "";
- string name = "";
- int max_users = 0;
-
- id = args["id"] as string;
- name = args["topic"] as string;
- topic = args["name"] as string;
-
- bool valid = true;
-
- if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(topic))
- valid = false;
-
- if (valid)
- {
- ServerManager.SendMessage("chat_create", $@"{{
- id: ""{id}"",
- name: ""{name}"",
- topic: ""{topic}"",
- max_users: {max_users}
-}}");
- }
- else
- {
- Console.WriteLine("{CHAT_PLEASE_PROVIDE_VALID_CHANNEL_DATA}");
- }
- return true;
- }
-
- }
-
[TutorialLock]
[Namespace("trm")]
public static class TerminalCommands
@@ -266,6 +229,7 @@ namespace ShiftOS.Engine
}
}
+ [MultiplayerOnly]
[Namespace("dev")]
public static class ShiftOSDevCommands
{
@@ -474,6 +438,7 @@ namespace ShiftOS.Engine
return true;
}
+ [MultiplayerOnly]
[Command("save")]
public static bool Save()
{
@@ -481,6 +446,7 @@ namespace ShiftOS.Engine
return true;
}
+ [MultiplayerOnly]
[Command("status")]
public static bool Status()
{
@@ -493,7 +459,7 @@ Upgrades: {SaveSystem.CurrentSave.CountUpgrades()} installed,
}
}
-
+ [MultiplayerOnly]
[Namespace("shiftorium")]
public static class ShiftoriumCommands
{
diff --git a/ShiftOS_TheReturn/ConsoleEx.cs b/ShiftOS_TheReturn/ConsoleEx.cs
new file mode 100644
index 0000000..69f6a18
--- /dev/null
+++ b/ShiftOS_TheReturn/ConsoleEx.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ShiftOS.Engine
+{
+ public static class ConsoleEx
+ {
+ static ConsoleEx()
+ {
+ ForegroundColor = ConsoleColor.White;
+ BackgroundColor = ConsoleColor.Black;
+
+ Bold = false;
+ Italic = false;
+ Underline = false;
+ }
+
+ public static ConsoleColor ForegroundColor { get; set; }
+ public static ConsoleColor BackgroundColor { get; set; }
+
+ public static bool Bold { get; set; }
+ public static bool Italic { get; set; }
+ public static bool Underline { get; set; }
+ }
+}
diff --git a/ShiftOS_TheReturn/Infobox.cs b/ShiftOS_TheReturn/Infobox.cs
index 3e8fa30..e3308dc 100644
--- a/ShiftOS_TheReturn/Infobox.cs
+++ b/ShiftOS_TheReturn/Infobox.cs
@@ -55,11 +55,11 @@ namespace ShiftOS.Engine
/// </summary>
/// <param name="title">Infobox title</param>
/// <param name="message">Infobox message</param>
- public static void Show(string title, string message)
+ public static void Show(string title, string message, Action callback = null)
{
title = Localization.Parse(title);
message = Localization.Parse(message);
- _infobox.Open(title, message);
+ _infobox.Open(title, message, callback);
}
public static void PromptText(string title, string message, Action<string> callback)
@@ -89,7 +89,7 @@ namespace ShiftOS.Engine
// Infobox Interface
public interface IInfobox
{
- void Open(string title, string msg);
+ void Open(string title, string msg, Action callback = null);
void PromptText(string title, string message, Action<string> callback);
void PromptYesNo(string title, string message, Action<bool> callback);
}
diff --git a/ShiftOS_TheReturn/KernelWatchdog.cs b/ShiftOS_TheReturn/KernelWatchdog.cs
index 1b59b25..cc03f5a 100644
--- a/ShiftOS_TheReturn/KernelWatchdog.cs
+++ b/ShiftOS_TheReturn/KernelWatchdog.cs
@@ -25,8 +25,44 @@ namespace ShiftOS.Engine
}
}
+ private static bool _mudConnected = true;
+
public static bool InKernelMode { get; private set; }
- public static bool MudConnected { get; set; }
+ public static bool MudConnected
+ {
+ get
+ {
+ return _mudConnected;
+ }
+ set
+ {
+ if(value == false)
+ {
+ foreach(var win in AppearanceManager.OpenForms)
+ {
+ foreach(var attr in win.ParentWindow.GetType().GetCustomAttributes(true))
+ {
+ if(attr is MultiplayerOnlyAttribute)
+ {
+ ConsoleEx.Bold = true;
+ ConsoleEx.Underline = false;
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.Red;
+ Console.Write("Error:");
+ ConsoleEx.Bold = false;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine("Cannot disconnect from multi-user domain because an app that depends on it is open.");
+ TerminalBackend.PrintPrompt();
+ return;
+ }
+ }
+ }
+ }
+
+ _mudConnected = value;
+ Desktop.PopulateAppLauncher();
+ }
+ }
public static bool IsSafe(Type type)
{
@@ -66,5 +102,31 @@ namespace ShiftOS.Engine
InKernelMode = false;
Console.WriteLine("<kernel> Kernel mode disabled.");
}
+
+ internal static bool CanRunOffline(Type method)
+ {
+ if (MudConnected)
+ return true;
+
+ foreach (var attr in method.GetCustomAttributes(false))
+ {
+ if (attr is MultiplayerOnlyAttribute)
+ return false;
+ }
+ return true;
+ }
+
+ internal static bool CanRunOffline(MethodInfo method)
+ {
+ if (MudConnected)
+ return true;
+
+ foreach(var attr in method.GetCustomAttributes(false))
+ {
+ if (attr is MultiplayerOnlyAttribute)
+ return false;
+ }
+ return true;
+ }
}
}
diff --git a/ShiftOS_TheReturn/Scripting.cs b/ShiftOS_TheReturn/Scripting.cs
index 3ecf9d9..d96bc98 100644
--- a/ShiftOS_TheReturn/Scripting.cs
+++ b/ShiftOS_TheReturn/Scripting.cs
@@ -63,6 +63,26 @@ namespace ShiftOS.Engine.Scripting
public dynamic Lua = new DynamicLua.DynamicLua();
public bool Running = true;
+ static LuaInterpreter()
+ {
+ ServerManager.MessageReceived += (msg) =>
+ {
+ if (msg.Name == "run")
+ {
+ TerminalBackend.PrefixEnabled = false;
+ var cntnts = JsonConvert.DeserializeObject<dynamic>(msg.Contents);
+ var interp = new LuaInterpreter();
+ Desktop.InvokeOnWorkerThread(() =>
+ {
+ interp.Execute(cntnts.script.ToString());
+
+ });
+ TerminalBackend.PrefixEnabled = true;
+ TerminalBackend.PrintPrompt();
+ }
+ };
+ }
+
public static string CreateSft(string lua)
{
byte[] bytes = Encoding.UTF8.GetBytes(lua);
@@ -341,12 +361,41 @@ end");
}
}
+ [Exposed("mud")]
+ public class MUDFunctions
+ {
+ public void sendDiagnostic(string src, string cat, object val)
+ {
+ ServerManager.SendMessage("diag_log", $"[{src}] <{cat}>: {val}");
+ }
+ }
+
+ [Exposed("userinfo")]
+ public class UserInfoFunctions
+ {
+ public string getUsername()
+ {
+ return SaveSystem.CurrentSave.Username;
+ }
+
+ public string getSysname()
+ {
+ return SaveSystem.CurrentSave.SystemName;
+ }
+
+ public string getEmail()
+ {
+ return getUsername() + "@" + getSysname();
+ }
+ }
+
+
[Exposed("infobox")]
public class InfoboxFunctions
{
- public void show(string title, string message)
+ public void show(string title, string message, Action callback = null)
{
- Infobox.Show(title, message);
+ Infobox.Show(title, message, callback);
}
public void question(string title, string message, Action<bool> callback)
diff --git a/ShiftOS_TheReturn/ServerManager.cs b/ShiftOS_TheReturn/ServerManager.cs
index a121ab6..31b3129 100644
--- a/ShiftOS_TheReturn/ServerManager.cs
+++ b/ShiftOS_TheReturn/ServerManager.cs
@@ -125,6 +125,8 @@ namespace ShiftOS.Engine
{
thisGuid = new Guid(msg.Contents);
GUIDReceived?.Invoke(msg.Contents);
+ TerminalBackend.PrefixEnabled = true;
+ TerminalBackend.PrintPrompt();
}
else if(msg.Name == "allusers")
{
@@ -132,6 +134,7 @@ namespace ShiftOS.Engine
{
Console.WriteLine(acc);
}
+ TerminalBackend.PrintPrompt();
}
else if(msg.Name == "update_your_cp")
{
@@ -154,9 +157,15 @@ namespace ShiftOS.Engine
{
var ex = JsonConvert.DeserializeObject<Exception>(msg.Contents);
TerminalBackend.PrefixEnabled = true;
- Console.WriteLine($@"{{MUD_ERROR}}: {ex.Message}");
+ ConsoleEx.ForegroundColor = ConsoleColor.Red;
+ ConsoleEx.Bold = true;
+ Console.Write($@"{{MUD_ERROR}}: ");
+ ConsoleEx.Bold = false;
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(ex.Message);
TerminalBackend.PrefixEnabled = true;
- Console.Write($"{SaveSystem.CurrentSave.Username}@{CurrentSave.SystemName}:~$ ");
+ TerminalBackend.PrintPrompt();
}
else
{
diff --git a/ShiftOS_TheReturn/ShiftOS.Engine.csproj b/ShiftOS_TheReturn/ShiftOS.Engine.csproj
index 20ca879..00d828f 100644
--- a/ShiftOS_TheReturn/ShiftOS.Engine.csproj
+++ b/ShiftOS_TheReturn/ShiftOS.Engine.csproj
@@ -99,6 +99,7 @@
<Compile Include="AudioManager.cs" />
<Compile Include="Commands.cs" />
<Compile Include="Command.cs" />
+ <Compile Include="ConsoleEx.cs" />
<Compile Include="CrashHandler.cs" />
<Compile Include="CrashHandler.Designer.cs">
<DependentUpon>CrashHandler.cs</DependentUpon>
diff --git a/ShiftOS_TheReturn/Skinning.cs b/ShiftOS_TheReturn/Skinning.cs
index 43e0b5d..800b107 100644
--- a/ShiftOS_TheReturn/Skinning.cs
+++ b/ShiftOS_TheReturn/Skinning.cs
@@ -865,12 +865,12 @@ namespace ShiftOS.Engine {
[ShifterMeta("System")]
[ShifterCategory("General")]
[ShifterName("Terminal text color")]
- public Color TerminalForeColor = DefaultForeground;
+ public ConsoleColor TerminalForeColorCC = ConsoleColor.White;
[ShifterMeta("System")]
[ShifterCategory("General")]
[ShifterName("Terminal background color")]
- public Color TerminalBackColor = DesktopBG;
+ public ConsoleColor TerminalBackColorCC = ConsoleColor.Black;
[ShifterMeta("Desktop")]
[ShifterCategory("Desktop Panel")]
diff --git a/ShiftOS_TheReturn/TerminalBackend.cs b/ShiftOS_TheReturn/TerminalBackend.cs
index 8be54d0..e4bad33 100644
--- a/ShiftOS_TheReturn/TerminalBackend.cs
+++ b/ShiftOS_TheReturn/TerminalBackend.cs
@@ -139,20 +139,20 @@ namespace ShiftOS.Engine
{
if (Shiftorium.UpgradeAttributesUnlocked(type))
{
- if (KernelWatchdog.IsSafe(type))
+ foreach (var a in type.GetCustomAttributes(false))
{
- foreach (var a in type.GetCustomAttributes(false))
+ if (a is Namespace)
{
- if (a is Namespace)
+ var ns = a as Namespace;
+ if (text.Split('.')[0] == ns.name)
{
- var ns = a as Namespace;
- if (text.Split('.')[0] == ns.name)
+ if (KernelWatchdog.IsSafe(type))
{
- foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Static))
+ if (KernelWatchdog.CanRunOffline(type))
{
- if (Shiftorium.UpgradeAttributesUnlocked(method))
+ foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Static))
{
- if (KernelWatchdog.IsSafe(method))
+ if (Shiftorium.UpgradeAttributesUnlocked(method))
{
if (CanRunRemotely(method, isRemote))
{
@@ -163,88 +163,125 @@ namespace ShiftOS.Engine
var cmd = ma as Command;
if (text.Split('.')[1] == cmd.name)
{
-
- var attr = method.GetCustomAttribute<CommandObsolete>();
-
- if (attr != null)
+ if (KernelWatchdog.IsSafe(method))
{
- string newcommand = attr.newcommand;
- if (attr.warn)
+ if (KernelWatchdog.CanRunOffline(method))
{
- Console.WriteLine(Localization.Parse((newcommand == "" ? "{ERROR}" : "{WARN}") + attr.reason, new Dictionary<string, string>() {
+ var attr = method.GetCustomAttribute<CommandObsolete>();
+
+ if (attr != null)
+ {
+ string newcommand = attr.newcommand;
+ if (attr.warn)
+ {
+ Console.WriteLine(Localization.Parse((newcommand == "" ? "{ERROR}" : "{WARN}") + attr.reason, new Dictionary<string, string>() {
{"%newcommand", newcommand}
}));
- }
- if (newcommand != "")
- {
- // redo the entire process running newcommand
+ }
+ if (newcommand != "")
+ {
+ // redo the entire process running newcommand
- return RunClient(newcommand, args);
- }
- }
-
- var requiresArgs = method.GetCustomAttributes<RequiresArgument>();
+ return RunClient(newcommand, args);
+ }
+ }
- bool error = false;
- bool providedusage = false;
+ var requiresArgs = method.GetCustomAttributes<RequiresArgument>();
- foreach (RequiresArgument argument in requiresArgs)
- {
- if (!args.ContainsKey(argument.argument))
- {
+ bool error = false;
+ bool providedusage = false;
- if (!providedusage)
+ foreach (RequiresArgument argument in requiresArgs)
{
- string usageparse = "{COMMAND_" + ns.name.ToUpper() + "_" + cmd.name.ToUpper() + "_USAGE}";
- if (usageparse == Localization.Parse(usageparse))
- usageparse = "";
- else
- usageparse = Shiftorium.UpgradeInstalled("help_usage") ? Localization.Parse("{ERROR}{USAGE}" + usageparse, new Dictionary<string, string>() {
+ if (!args.ContainsKey(argument.argument))
+ {
+
+ if (!providedusage)
+ {
+ string usageparse = "{COMMAND_" + ns.name.ToUpper() + "_" + cmd.name.ToUpper() + "_USAGE}";
+ if (usageparse == Localization.Parse(usageparse))
+ usageparse = "";
+ else
+ usageparse = Shiftorium.UpgradeInstalled("help_usage") ? Localization.Parse("{ERROR}{USAGE}" + usageparse, new Dictionary<string, string>() {
{"%ns", ns.name},
{"%cmd", cmd.name}
}) : "";
- Console.WriteLine(usageparse);
+ Console.WriteLine(usageparse);
- providedusage = true;
- }
+ providedusage = true;
+ }
- if (Shiftorium.UpgradeInstalled("help_usage"))
- {
- Console.WriteLine(Localization.Parse("{ERROR_ARGUMENT_REQUIRED}", new Dictionary<string, string>() {
+ if (Shiftorium.UpgradeInstalled("help_usage"))
+ {
+ Console.WriteLine(Localization.Parse("{ERROR_ARGUMENT_REQUIRED}", new Dictionary<string, string>() {
{"%argument", argument.argument}
}));
+ }
+ else
+ {
+ Console.WriteLine(Localization.Parse("{ERROR_ARGUMENT_REQUIRED_NO_USAGE}"));
+ }
+
+ error = true;
+ }
}
- else
+
+ if (error)
{
- Console.WriteLine(Localization.Parse("{ERROR_ARGUMENT_REQUIRED_NO_USAGE}"));
+ throw new Exception("{ERROR_COMMAND_WRONG}");
}
- error = true;
+ try
+ {
+ return (bool)method.Invoke(null, new[] { args });
+ }
+ catch (TargetInvocationException e)
+ {
+ Console.WriteLine(Localization.Parse("{ERROR_EXCEPTION_THROWN_IN_METHOD}"));
+ Console.WriteLine(e.InnerException.Message);
+ Console.WriteLine(e.InnerException.StackTrace);
+ return true;
+ }
+ catch
+ {
+ return (bool)method.Invoke(null, new object[] { });
+ }
}
- }
-
- if (error)
- {
- throw new Exception("{ERROR_COMMAND_WRONG}");
- }
+ else
+ {
+ Console.Write("<");
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkRed;
+ Console.Write("session_mgr");
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ ConsoleEx.Bold = false;
+ Console.Write(">");
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(" You cannot run this command while disconnected from the multi-user domain..");
+ return true;
- try
- {
- return (bool)method.Invoke(null, new[] { args });
+ }
}
- catch (TargetInvocationException e)
+ else
{
- Console.WriteLine(Localization.Parse("{ERROR_EXCEPTION_THROWN_IN_METHOD}"));
- Console.WriteLine(e.InnerException.Message);
- Console.WriteLine(e.InnerException.StackTrace);
+ Console.Write("<");
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkRed;
+ Console.Write("watchdog");
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ ConsoleEx.Bold = false;
+ Console.Write(">");
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(" You cannot run this command.");
+ KernelWatchdog.Log("potential_sys_breach", "user attempted to run kernel mode command " + text + " - watchdog has prevented this, good sir.");
return true;
}
- catch
- {
- return (bool)method.Invoke(null, new object[] { });
- }
}
+
+
}
}
}
@@ -254,14 +291,44 @@ namespace ShiftOS.Engine
return true;
}
}
-
+
}
}
+ else
+ {
+ Console.Write("<");
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkRed;
+ Console.Write("session_mgr");
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ ConsoleEx.Bold = false;
+ Console.Write(">");
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(" You cannot run this command while disconnected from the multi-user domain..");
+ return true;
+
+ }
+ }
+ else
+ {
+
+ Console.Write("<");
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkRed;
+ Console.Write("watchdog");
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ ConsoleEx.Bold = false;
+ Console.Write(">");
+ ConsoleEx.Italic = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.DarkYellow;
+ Console.WriteLine(" You cannot run this command.");
+ KernelWatchdog.Log("potential_sys_breach", "user attempted to run kernel mode command " + text + " - watchdog has prevented this, good sir.");
+ return true;
}
}
}
}
-
}
}
}
@@ -269,7 +336,44 @@ namespace ShiftOS.Engine
}
return false;
}
-
+
+ public static void PrintPrompt()
+ {
+ if (SaveSystem.CurrentSave != null)
+ {
+ ConsoleEx.BackgroundColor = SkinEngine.LoadedSkin.TerminalBackColorCC;
+ ConsoleEx.Italic = false;
+ ConsoleEx.Underline = false;
+
+ ConsoleEx.ForegroundColor = ConsoleColor.Magenta;
+ ConsoleEx.Bold = true;
+
+ Console.Write(SaveSystem.CurrentSave.Username);
+ ConsoleEx.Bold = false;
+ ConsoleEx.ForegroundColor = ConsoleColor.Gray;
+ Console.Write("@");
+ ConsoleEx.Italic = true;
+ ConsoleEx.Bold = true;
+ ConsoleEx.ForegroundColor = ConsoleColor.Yellow;
+ Console.Write(SaveSystem.CurrentSave.SystemName);
+ ConsoleEx.Italic = false;
+ ConsoleEx.Bold = false;
+ ConsoleEx.ForegroundColor = ConsoleColor.Gray;
+ Console.Write(":~");
+ Console.ForegroundColor = ConsoleColor.White;
+ ConsoleEx.Italic = true;
+ if (KernelWatchdog.InKernelMode == true)
+ Console.Write("#");
+ else
+ Console.Write("$");
+ ConsoleEx.Italic = false;
+ ConsoleEx.Bold = false;
+ ConsoleEx.ForegroundColor = SkinEngine.LoadedSkin.TerminalForeColorCC;
+ Console.Write(" ");
+ }
+ }
+
+
static TerminalBackend()
{
ServerMessageReceived onMessageReceived = (msg) =>