diff --git a/README.md b/README.md index b29d248..f71a633 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ LCE Emerald Launcher is the easiest way to play Minecraft Legacy Console Edition | **Controller Support** | Full gamepad navigation support (keyboard support included) | | **Discord Rich Presence** | Show your current activity and game status on Discord | | **Workshop** | Community content like DLCs, Textures, Skins and more | -| **Free Multiplayer** | Powered by LCELive, Emerald provides a free multiplayer service so you can play with anyone without port forwarding! | +| **Free Multiplayer** | Powered by LCEOnline, Emerald provides a free multiplayer service so you can play with anyone without port forwarding! | --- @@ -183,7 +183,7 @@ sudo apt install --reinstall libwebkit2gtk-4.1-0 - **The Emerald Team** - Technical development and maintenance - **4J Studios & Mojang** - Original creators of Legacy Console Edition - **The LCE Community** - Research and foundations for LCE on PC -- **Veroxsity (Racoon)** - Original creator of LCELive +- **Str1k3r** - Original creator of LCEOnline --- diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 43d5e40..419bf65 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -12,6 +12,7 @@ "core:resources:default", "core:tray:default", "core:webview:default", + "core:webview:allow-create-webview-window", "core:window:default", "core:window:allow-set-decorations", "core:window:allow-is-fullscreen", diff --git a/src-tauri/src/commands/game.rs b/src-tauri/src/commands/game.rs index bc4384a..15627da 100644 --- a/src-tauri/src/commands/game.rs +++ b/src-tauri/src/commands/game.rs @@ -27,9 +27,9 @@ pub async fn launch_game( perform_instance_sync(&app, &instance_id).await?; let working_dir = util::get_instance_working_dir(&app, &instance_id); let config_val = config::load_config_raw(app.clone()); - let lce_live = McServer { name: "LCELive Game".into(), ip: "127.0.0.1".into(), port: 61000 }; - if !servers.iter().any(|s| s.ip == lce_live.ip && s.port == lce_live.port) { - servers.push(lce_live); + let lce_online = McServer { name: "LCEOnline Game".into(), ip: "127.0.0.1".into(), port: 61000 }; + if !servers.iter().any(|s| s.ip == lce_online.ip && s.port == lce_online.port) { + servers.push(lce_online); } if let Some(ref saved) = config_val.saved_servers { for s in saved { diff --git a/src/components/modals/ChooseInstanceModal.tsx b/src/components/modals/ChooseInstanceModal.tsx index 39a3e0d..6c65134 100644 --- a/src/components/modals/ChooseInstanceModal.tsx +++ b/src/components/modals/ChooseInstanceModal.tsx @@ -75,7 +75,7 @@ export default function ChooseInstanceModal({ selectedInstance, [ { - name: invite.hostName || "LCE Online Game", + name: invite.hostName || "LCEOnline Game", ip: "127.0.0.1", port: 61000, }, @@ -87,7 +87,7 @@ export default function ChooseInstanceModal({ await TauriService.stopAllProxies(); await TauriService.launchGame(selectedInstance, [ { - name: invite.hostName || "LCE Online Game", + name: invite.hostName || "LCEOnline Game", ip: invite.hostIp, port: invite.hostPort, }, diff --git a/src/components/views/LceOnlineView.tsx b/src/components/views/LceOnlineView.tsx index 01cc762..3d38a78 100644 --- a/src/components/views/LceOnlineView.tsx +++ b/src/components/views/LceOnlineView.tsx @@ -9,6 +9,8 @@ import { import ChooseInstanceModal from "../modals/ChooseInstanceModal"; import { lceOnlineService } from "../../services/LceOnlineService"; import { TauriService } from "../../services/TauriService"; +import { WebviewWindow } from '@tauri-apps/api/webviewWindow'; +import { listen } from "@tauri-apps/api/event"; interface LceOnlineViewProps { addFriendTarget?: string | null; onClearAddFriendTarget?: () => void; @@ -28,6 +30,7 @@ const LceOnlineView = memo(function LceOnlineView({ const { playPressSound, playBackSound } = useAudio(); const game = useGame(); const [isSignedIn, setIsSignedIn] = useState(lceOnlineService.signedIn); + const opened = useRef(false); const [currentTab, setCurrentTab] = useState< "friends" | "requests" | "invites" >("friends"); @@ -73,12 +76,29 @@ const LceOnlineView = memo(function LceOnlineView({ }, []); useEffect(() => { - if (!isSignedIn) { - TauriService.openUrl( - "https://mclegacyedition.xyz/internal/auth?appId=emerald_launcher", - ); - } - }, []); + if (isSignedIn) return; + + if (!opened.current) { + opened.current = true; + new WebviewWindow('LCEOnline', { + url: "https://mclegacyedition.xyz/internal/auth?appId=emerald_launcher", + width: 400, + height: 570, + resizable: false, + title: 'Emerald Legacy Launcher - LCEOnline', + }); + }; + + const unlisten = listen('deep-link', async (event) => { + const authUrl = event.payload.find(u => u.startsWith('emerald://')); + if (!authUrl) return; + const token = new URL(authUrl).searchParams.get('token'); + if (token) setIsSignedIn(true); + (await WebviewWindow.getByLabel('LCEOnline'))?.close(); + }); + + return () => { unlisten.then(f => f()); }; + }, [isSignedIn]); useEffect(() => { if (!addFriendTarget) return; @@ -619,7 +639,15 @@ const LceOnlineView = memo(function LceOnlineView({ > {renderContent()} - +
+ LCEOnline TauriService.openUrl("https://mclegacyedition.xyz/")} + /> +
+ {isAddingFriend && ( diff --git a/src/hooks/useGameManager.ts b/src/hooks/useGameManager.ts index 944b00f..8fb48bd 100644 --- a/src/hooks/useGameManager.ts +++ b/src/hooks/useGameManager.ts @@ -497,7 +497,7 @@ export function useGameManager({ profile, PARTNERSHIP_SERVERS, currentEdition?.lceOnline - ? extraLaunchArgs!.concat([ + ? (extraLaunchArgs ?? []).concat([ "-token", localStorage.getItem("lceonline_session") ? JSON.parse(localStorage.getItem("lceonline_session")!).accessToken diff --git a/src/hooks/useLceOnlineNotifications.ts b/src/hooks/useLceOnlineNotifications.ts index ad45415..68b2f80 100644 --- a/src/hooks/useLceOnlineNotifications.ts +++ b/src/hooks/useLceOnlineNotifications.ts @@ -1,17 +1,9 @@ import { useState, useEffect, useRef } from "react"; import { lceOnlineService } from "../services/LceOnlineService"; export function useLceOnlineNotifications() { - const [friendRequestMessage, setFriendRequestMessage] = useState< - string | null - >(null); + const [friendRequestMessage, setFriendRequestMessage] = useState(null); const [InviteMessage, setInviteMessage] = useState(null); - const [invites, setInvites] = useState< - Array<{ - inviteid: string; - from: { uuid: string; username: string }; - sessionid: string; - }> - >([]); + const [invites, setInvites] = useState>([]); const seenRequests = useRef>(new Set()); const seenInvites = useRef>(new Set()); useEffect(() => { @@ -24,7 +16,7 @@ export function useLceOnlineNotifications() { lists.requests.forEach((r: string) => { if (!seenRequests.current.has(r)) { seenRequests.current.add(r); - setFriendRequestMessage(`New Friend request from ${r}`); + setFriendRequestMessage(`${r} wants to be friends!`); } }); } catch (e) {} @@ -32,12 +24,12 @@ export function useLceOnlineNotifications() { const invitesData = await lceOnlineService.getInvites(); setInvites(invitesData); invitesData.forEach((i) => { - if (!seenInvites.current.has(i.inviteid)) { - seenInvites.current.add(i.inviteid); - setInviteMessage(`New invite from ${i.from.username}`); - } - }); - } catch {} + if (!seenInvites.current.has(i.inviteid)) { + seenInvites.current.add(i.inviteid); + setInviteMessage(`${i.from.username} invited you to play!`); + } + }); + } catch { } }; const init = async () => { @@ -47,7 +39,7 @@ export function useLceOnlineNotifications() { lists.requests.forEach((r: string) => { if (!seenRequests.current.has(r)) { seenRequests.current.add(r); - setFriendRequestMessage(`New Friend request from ${r}`); + setFriendRequestMessage(`${r} wants to be friends!`); } }); } catch (e) {} @@ -55,12 +47,12 @@ export function useLceOnlineNotifications() { const invitesData = await lceOnlineService.getInvites(); setInvites(invitesData); invitesData.forEach((i) => { - if (!seenInvites.current.has(i.inviteid)) { - seenInvites.current.add(i.inviteid); - setInviteMessage(`New invite from ${i.from.username}`); - } - }); - } catch {} + if (!seenInvites.current.has(i.inviteid)) { + seenInvites.current.add(i.inviteid); + setInviteMessage(`${i.from.username} invited you to play!`); + } + }); + } catch { } } pollInterval = setInterval(poll, 3000); };