MSCO 2.9.1: fixes without MSCLoader, admin teleport, MSCO branding

- Own JSON reader (MiniJson) instead of Newtonsoft.Json - the server browser failed with
  "Could not load System.Runtime.Serialization" once MSCLoader was gone
- Mouse cursor visible in admin menu/chat/console (PlayerInMenu)
- Intro "Press any key" screen replaced by an MSCO loading screen; hook PlayMakerFSM.Awake too
- Join links while the game runs: picked up from MSCO\join.txt (written by the launcher)
- Admin menu: TELEPORT tab (home, shop, repair shop, inspection, villages, events, Satsuma)
- Window title/icon "MSCO - My Summer Car Online", MSCO logo in the main menu
- In-game UI restyled like the keymaster website (rounded cards, pills, glow, slim scrollbars)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-03 00:34:03 +02:00
co-authored by Claude Opus 5.5
parent 166f873669
commit 027296d27c
17 changed files with 747 additions and 74 deletions
+27
View File
@@ -455,6 +455,20 @@ namespace MSCO
}
/// <summary>Admin: Satsuma neben sich holen (z.B. wenn er verschwunden oder im Boden ist).</summary>
/// <summary>Admin: sich selbst zu einem Ort teleportieren (Haus, Laden ... siehe Cheats.Places).</summary>
public void TeleportToPlace(string label, string objectName)
{
if (!CanCheat || localPlayer == null) return;
Vector3 pos;
if (!Cheats.FindPlace(objectName, out pos)) { overlays.Log(label + " not found (only works in the game)"); return; }
passenger.Exit(localPlayer, playerCamera);
if (Cheats.Teleport(localPlayer, pos))
{
overlays.Log("Teleported to " + label);
AnnounceCheat("teleported to " + label);
}
}
public void BringCar()
{
if (!CanCheat || localPlayer == null) return;
@@ -611,6 +625,18 @@ namespace MSCO
if (host != null) JoinServer(host, port);
}
/// <summary>JOIN-Link aus dem Browser, während das Spiel schon läuft (über den Launcher, siehe JoinLinks).</summary>
void CheckJoinRequest()
{
string host;
int port;
if (!JoinLinks.TryTakeRequest(out host, out port)) return;
PendingJoinHost = host;
PendingJoinPort = port;
if (IsInSession || !MenuHelper.InMenu)
toasts.Add("Join link: " + host + ":" + port, "leave this game - then confirm JOIN in the main menu", UiTheme.Accent);
}
public void CancelPendingJoin()
{
PendingJoinHost = null;
@@ -974,6 +1000,7 @@ namespace MSCO
void Update()
{
CheckHitch();
CheckJoinRequest();
MeasureFps();
// Menü-Buttons des Spiels nicht durch unser Fenster hindurch auslösen (z.B. Changelog)
// Solange das Multiplayer-Fenster offen ist, reagiert das Spielmenü (CONTINUE, QUIT ...) gar nicht;