Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 100c93e8da |
@@ -4,20 +4,15 @@ import { RouterProvider, createRouter } from '@tanstack/react-router'
|
|||||||
import './styles/index.css'
|
import './styles/index.css'
|
||||||
import "../runtime.js"
|
import "../runtime.js"
|
||||||
import "@wailsio/runtime";
|
import "@wailsio/runtime";
|
||||||
// Import the generated route tree
|
|
||||||
import { routeTree } from './routeTree.gen.js'
|
import { routeTree } from './routeTree.gen.js'
|
||||||
|
|
||||||
// Create a new router instance
|
|
||||||
const router = createRouter({ routeTree })
|
const router = createRouter({ routeTree })
|
||||||
|
|
||||||
// Register the router instance for type safety
|
|
||||||
declare module '@tanstack/react-router' {
|
declare module '@tanstack/react-router' {
|
||||||
interface Register {
|
interface Register {
|
||||||
router: typeof router
|
router: typeof router
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render the app
|
|
||||||
const rootElement = document.getElementById('root')!
|
const rootElement = document.getElementById('root')!
|
||||||
if (!rootElement.innerHTML) {
|
if (!rootElement.innerHTML) {
|
||||||
const root = ReactDOM.createRoot(rootElement)
|
const root = ReactDOM.createRoot(rootElement)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Link } from "@tanstack/react-router";
|
|||||||
export default function AboutPage() {
|
export default function AboutPage() {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-base-200 flex items-center justify-center p-6">
|
<div className="min-h-screen bg-base-200 flex items-center justify-center p-6">
|
||||||
<div className="max-w-3xl w-full bg-base-100 shadow-xl rounded-2xl p-8 space-y-6">
|
<div className="w-full bg-base-100 shadow-xl rounded-2xl p-8 space-y-6">
|
||||||
<h1 className="text-4xl font-bold text-primary text-center">About</h1>
|
<h1 className="text-4xl font-bold text-primary text-center">About</h1>
|
||||||
|
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Link } from '@tanstack/react-router';
|
|||||||
export default function AnalysisPage() {
|
export default function AnalysisPage() {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-base-200 flex items-center justify-center p-6">
|
<div className="min-h-screen bg-base-200 flex items-center justify-center p-6">
|
||||||
<div className="max-w-4xl w-full bg-base-100 shadow-xl rounded-2xl p-8 space-y-8">
|
<div className="w-full bg-base-100 shadow-xl rounded-2xl p-8 space-y-8">
|
||||||
<h1 className="text-4xl font-bold text-primary text-center">
|
<h1 className="text-4xl font-bold text-primary text-center">
|
||||||
Firefly Analysis & Veritas Plugin
|
Firefly Analysis & Veritas Plugin
|
||||||
</h1>
|
</h1>
|
||||||
@@ -144,7 +144,7 @@ export default function AnalysisPage() {
|
|||||||
<div className="space-y-2 text-purple-700">
|
<div className="space-y-2 text-purple-700">
|
||||||
<div className="flex items-start gap-2">
|
<div className="flex items-start gap-2">
|
||||||
<span className="font-medium min-w-[20px] text-purple-600">1.</span>
|
<span className="font-medium min-w-[20px] text-purple-600">1.</span>
|
||||||
<p>Launch the <span className="font-semibold">game</span> and your <span className="font-semibold">Firefly Private Server (PS)</span>.</p>
|
<p>Launch the <span className="font-semibold">game</span> and your <span className="font-semibold">Firefly GO Server (PS)</span>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-start gap-2">
|
<div className="flex items-start gap-2">
|
||||||
<span className="font-medium min-w-[20px] text-purple-600">2.</span>
|
<span className="font-medium min-w-[20px] text-purple-600">2.</span>
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
import { Link } from "@tanstack/react-router";
|
import { Link } from "@tanstack/react-router";
|
||||||
|
|
||||||
export default function SrToolsPage() {
|
export default function FireflyToolsPage() {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-base-200 flex items-center justify-center p-6">
|
<div className="min-h-screen bg-base-200 flex items-center justify-center p-6">
|
||||||
<div className="max-w-4xl w-full bg-base-100 shadow-xl rounded-2xl p-8 space-y-8">
|
<div className="w-full bg-base-100 shadow-xl rounded-2xl p-8 space-y-8">
|
||||||
<h1 className="text-4xl font-bold text-primary text-center">SR Tools</h1>
|
<h1 className="text-4xl font-bold text-primary text-center">Firefly Tools</h1>
|
||||||
|
|
||||||
{/* Section 1: About SR Tools */}
|
{/* Section 1: About SR Tools */}
|
||||||
<div className="bg-blue-50 border-l-4 border-blue-400 p-6 rounded-r-lg">
|
<div className="bg-blue-50 border-l-4 border-blue-400 p-6 rounded-r-lg">
|
||||||
<h2 className="text-2xl font-bold text-blue-800 flex items-center gap-2 mb-4">
|
<h2 className="text-2xl font-bold text-blue-800 flex items-center gap-2 mb-4">
|
||||||
<span>ℹ️</span>
|
<span>ℹ️</span>
|
||||||
<span>About SR Tools</span>
|
<span>About Firefly Tools</span>
|
||||||
</h2>
|
</h2>
|
||||||
<div className="space-y-3 text-blue-700">
|
<div className="space-y-3 text-blue-700">
|
||||||
<div className="flex items-start gap-3">
|
<div className="flex items-start gap-3">
|
||||||
<div className="text-blue-600 text-lg">🏠</div>
|
<div className="text-blue-600 text-lg">🏠</div>
|
||||||
<p>
|
<p>
|
||||||
This site is a another version of {" "}
|
This site is a another version of {" "}
|
||||||
<span className="font-semibold text-success">SR Tools {" "}</span>
|
<span className="font-semibold text-success">Firefly Tools {" "}</span>
|
||||||
developed by {" "}
|
developed by {" "}
|
||||||
<span className="font-semibold text-warning">Me {"(Kain)"}</span>
|
<span className="font-semibold text-warning">Me {"(Kain)"}</span>
|
||||||
</p>
|
</p>
|
||||||
@@ -95,9 +95,24 @@ export default function SrToolsPage() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex items-start gap-3">
|
<div className="flex items-start gap-3">
|
||||||
<div className="text-green-600 text-lg">🔌</div>
|
<div className="text-green-600 text-lg">🔌</div>
|
||||||
<p>Instantly apply setups to <span className="font-semibold text-warning">Firefly Private Server</span> using <span className="font-semibold">Connect PS</span> — no manual file uploads required.</p>
|
<p>Instantly apply setups to <span className="font-semibold text-warning">Firefly GO Server</span> using <span className="font-semibold">Connect PS</span> — no manual file uploads required.</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-start gap-3">
|
<div className="flex items-start gap-3">
|
||||||
|
<div className="text-green-600 text-2xl">✨</div>
|
||||||
|
<div>
|
||||||
|
<h4 className="font-semibold text-green-800 text-lg">Extra Settings</h4>
|
||||||
|
<p className="text-green-700 mt-1">
|
||||||
|
Enhance your <span className="font-semibold text-warning">Firefly GO Server</span> experience with extra features:
|
||||||
|
</p>
|
||||||
|
<ul className="list-disc list-inside mt-2 space-y-1 text-green-700">
|
||||||
|
<li>🎭 <span className="font-medium">Hidden Game UI</span> — remove the entire game interface.</li>
|
||||||
|
<li>🚫 <span className="font-medium">Disable Censorship</span> — get rid of Lens Flare censor 💀.</li>
|
||||||
|
<li>🧪 <span className="font-medium">Theorycraft Mode</span> — configure HP, cycles, and more via the web.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-start gap-3">
|
||||||
<div className="text-green-600 text-lg">📂</div>
|
<div className="text-green-600 text-lg">📂</div>
|
||||||
<p>Export and import full builds using <code className="bg-gray-200 px-2 py-1 rounded text-sm">freesr-data.json</code>.</p>
|
<p>Export and import full builds using <code className="bg-gray-200 px-2 py-1 rounded text-sm">freesr-data.json</code>.</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -3,7 +3,7 @@ import { Link } from '@tanstack/react-router';
|
|||||||
export default function HowToPage() {
|
export default function HowToPage() {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-base-200 flex items-center justify-center p-6">
|
<div className="min-h-screen bg-base-200 flex items-center justify-center p-6">
|
||||||
<div className="max-w-4xl w-full bg-base-100 shadow-xl rounded-2xl p-8 space-y-8">
|
<div className=" w-full bg-base-100 shadow-xl rounded-2xl p-8 space-y-8">
|
||||||
<h1 className="text-4xl font-bold text-primary text-center">How to Use</h1>
|
<h1 className="text-4xl font-bold text-primary text-center">How to Use</h1>
|
||||||
|
|
||||||
{/* Section 1: Launcher Features */}
|
{/* Section 1: Launcher Features */}
|
||||||
@@ -28,13 +28,23 @@ export default function HowToPage() {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-start gap-3">
|
<div className="flex items-start gap-3">
|
||||||
<div className="text-green-600 text-lg">📦</div>
|
<div className="text-green-600 text-2xl">📦</div>
|
||||||
<p>Patch and update game files using{" "}
|
<div>
|
||||||
<a href="/hdiff" className="link link-info font-mono">Hdiffz Tool</a>
|
<p className="text-green-800 font-semibold">
|
||||||
{" "}(HDiffPatch) — fast & lightweight incremental updates.
|
Patch & Update Game Files
|
||||||
|
</p>
|
||||||
|
<p className="text-green-700">
|
||||||
|
Use the{" "}
|
||||||
|
<a href="/diff" className="link link-info font-mono">Diff Tool</a>{" "}
|
||||||
|
(<span className="font-medium">DiffPatch</span>) for fast & lightweight incremental updates.
|
||||||
|
</p>
|
||||||
|
<p className="text-green-700 mt-1">
|
||||||
|
Supports <span className="font-semibold">Hdiff</span>, <span className="font-semibold">Ldiff</span>, and custom diff formats.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Section 2: FireflyGo Commands */}
|
{/* Section 2: FireflyGo Commands */}
|
||||||
@@ -65,8 +75,60 @@ export default function HowToPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="bg-white border border-blue-200 rounded-lg p-4">
|
||||||
|
<div className="flex items-start gap-3">
|
||||||
|
<div className="text-blue-600 text-lg">✨</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<h4 className="font-semibold text-blue-800 mb-1">Extra Settings</h4>
|
||||||
|
|
||||||
|
<div className="space-y-4 text-blue-700 text-sm">
|
||||||
|
|
||||||
|
<div className="bg-blue-50 border border-blue-200 rounded-lg p-3">
|
||||||
|
<h5 className="font-semibold text-blue-800 flex items-center gap-2">
|
||||||
|
🎭 Hidden UI
|
||||||
|
</h5>
|
||||||
|
<p className="mt-1">
|
||||||
|
Instantly hides the entire game UI — often used in DIM showcase videos.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div className="bg-blue-50 border border-blue-200 rounded-lg p-3">
|
||||||
|
<h5 className="font-semibold text-blue-800 flex items-center gap-2">
|
||||||
|
🚫 Disable Censorship
|
||||||
|
</h5>
|
||||||
|
<p className="mt-1">
|
||||||
|
Remove the Lens Flare censor effect 💀 for a cleaner experience.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="bg-blue-50 border border-blue-200 rounded-lg p-3">
|
||||||
|
<h5 className="font-semibold text-blue-800 flex items-center gap-2">
|
||||||
|
🧪 Theorycraft Mode
|
||||||
|
</h5>
|
||||||
|
<p className="mt-1">
|
||||||
|
No need to type chat commands anymore — configure everything through the
|
||||||
|
web: adjust monster HP, set cycles, view logs, and more.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div className="mt-4 aspect-w-16 aspect-h-9">
|
||||||
|
<iframe
|
||||||
|
src="https://www.youtube.com/embed/uiKdFrvn9NQ"
|
||||||
|
title="Extra Settings Tutorial"
|
||||||
|
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||||
|
allowFullScreen
|
||||||
|
className="rounded-lg w-full h-[300px]"
|
||||||
|
></iframe>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Commands List */}
|
{/* Commands List */}
|
||||||
<div className="space-y-4">
|
<div className="space-y-4 mt-4">
|
||||||
<h3 className="text-lg font-semibold text-blue-800">Available Commands:</h3>
|
<h3 className="text-lg font-semibold text-blue-800">Available Commands:</h3>
|
||||||
|
|
||||||
{/* Theorycraft Toggle */}
|
{/* Theorycraft Toggle */}
|
||||||
@@ -103,16 +165,28 @@ export default function HowToPage() {
|
|||||||
<div className="flex items-start gap-3">
|
<div className="flex items-start gap-3">
|
||||||
<div className="text-blue-600 text-lg">❤️</div>
|
<div className="text-blue-600 text-lg">❤️</div>
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<h4 className="font-semibold text-blue-800 mb-1">HP Override <span className="text-red-600 text-sm">(Theorycraft only)</span></h4>
|
<h4 className="font-semibold text-blue-800 mb-1">
|
||||||
<div className="space-y-1 text-blue-700">
|
HP Override <span className="text-red-600 text-sm">(Theorycraft only)</span>
|
||||||
<p><code className="bg-blue-100 px-1 py-0.5 rounded text-sm">/hp WAVE HP</code> — Set monster HP for a specific wave</p>
|
</h4>
|
||||||
<p className="text-sm">Example: <code className="bg-blue-100 px-1 py-0.5 rounded text-sm">/hp 1 2000000</code> sets Wave 1 monster HP to 2,000,000</p>
|
<div className="space-y-2 text-blue-700 text-sm">
|
||||||
<p className="text-sm"><code className="bg-blue-100 px-1 py-0.5 rounded text-sm">/hp 0</code> disables HP override</p>
|
<p>
|
||||||
|
<code className="bg-blue-100 px-1 py-0.5 rounded text-sm">/hp N</code> — Set monster HP (only available in Theorycraft mode)
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<code className="bg-blue-100 px-1 py-0.5 rounded text-sm">/hp 0</code> — Disable the set HP feature
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<code className="bg-blue-100 px-1 py-0.5 rounded text-sm">/hp Wave V1 V2 ...</code> — Set HP for each monster in a specific wave
|
||||||
|
</p>
|
||||||
|
<p className="ml-4">
|
||||||
|
Example: <code className="bg-blue-100 px-1 py-0.5 rounded text-sm">/hp 1 2000000 3000000</code> sets wave 1 monster1 HP=2,000,000 and monster2 HP=3,000,000
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{/* Log Command */}
|
{/* Log Command */}
|
||||||
<div className="bg-white border border-blue-200 rounded-lg p-4">
|
<div className="bg-white border border-blue-200 rounded-lg p-4">
|
||||||
<div className="flex items-start gap-3">
|
<div className="flex items-start gap-3">
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ function RootLayout() {
|
|||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className="navbar-center hidden md:flex">
|
<div className="navbar-center hidden md:flex">
|
||||||
<ul className="menu menu-horizontal px-1">
|
<ul className="menu menu-horizontal px-1 gap-4">
|
||||||
<li><Link to="/">Home</Link></li>
|
<li><Link to="/">Home</Link></li>
|
||||||
<li>
|
<li>
|
||||||
<details>
|
<details>
|
||||||
@@ -87,7 +87,7 @@ function RootLayout() {
|
|||||||
<summary>Plugins</summary>
|
<summary>Plugins</summary>
|
||||||
<ul className="p-2">
|
<ul className="p-2">
|
||||||
<li><Link to="/analysis">Analysis (Veritas)</Link></li>
|
<li><Link to="/analysis">Analysis (Veritas)</Link></li>
|
||||||
<li><Link to="/srtools">SrTools</Link></li>
|
<li><Link to="/srtools">Firefly Tools</Link></li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import SrToolsPage from '@/pages/srtools'
|
import FireflyToolsPage from '@/pages/fireflytools'
|
||||||
import { createFileRoute } from '@tanstack/react-router'
|
import { createFileRoute } from '@tanstack/react-router'
|
||||||
|
|
||||||
export const Route = createFileRoute('/srtools')({
|
export const Route = createFileRoute('/srtools')({
|
||||||
component: SrToolsPage,
|
component: FireflyToolsPage,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,16 +13,34 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func HumanFormat(bytes float64) string {
|
func HumanFormat(bytes float64) string {
|
||||||
for _, unit := range []string{"", "Ki", "Mi", "Gi"} {
|
if math.IsNaN(bytes) || math.IsInf(bytes, 0) {
|
||||||
if math.Abs(bytes) < 1024.0 {
|
return fmt.Sprintf("%v", bytes)
|
||||||
return fmt.Sprintf("%3.1f%sB", bytes, unit)
|
|
||||||
}
|
}
|
||||||
bytes /= 1024.0
|
if bytes == 0 {
|
||||||
|
return "0B"
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%.1fTiB", bytes)
|
|
||||||
|
neg := bytes < 0
|
||||||
|
if neg {
|
||||||
|
bytes = -bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
units := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"}
|
||||||
|
i := 0
|
||||||
|
for bytes >= 1024 && i < len(units)-1 {
|
||||||
|
bytes /= 1024
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
|
||||||
|
res := fmt.Sprintf("%.1f%s", bytes, units[i])
|
||||||
|
if neg {
|
||||||
|
res = "-" + res
|
||||||
|
}
|
||||||
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
type WriteCounter struct {
|
type WriteCounter struct {
|
||||||
@@ -53,14 +71,13 @@ func (wc *WriteCounter) PrintProgress() {
|
|||||||
if elapsed < 0.001 {
|
if elapsed < 0.001 {
|
||||||
elapsed = 0.001
|
elapsed = 0.001
|
||||||
}
|
}
|
||||||
speed := float64(wc.Total) / 1024 / 1024 / elapsed
|
speed := float64(wc.Total) / elapsed
|
||||||
percent := float64(wc.Total) / float64(wc.TotalSize) * 100
|
percent := float64(wc.Total) / float64(wc.TotalSize) * 100
|
||||||
if wc.OnEmit != nil {
|
if wc.OnEmit != nil {
|
||||||
wc.OnEmit(percent, fmt.Sprintf("%s/s", HumanFormat(speed)))
|
wc.OnEmit(percent, fmt.Sprintf("%s/s", HumanFormat(speed)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- DownloadFileParallel ---
|
|
||||||
func (g *GitService) downloadFileParallel(filePath, url string, numParts int, onEmit func(percent float64, speed string)) (tmpPath string, err error) {
|
func (g *GitService) downloadFileParallel(filePath, url string, numParts int, onEmit func(percent float64, speed string)) (tmpPath string, err error) {
|
||||||
resp, err := http.Head(url)
|
resp, err := http.Head(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const ProxyZipFile = "64bit.zip"
|
|||||||
const LauncherFile = "firefly-launcher.exe"
|
const LauncherFile = "firefly-launcher.exe"
|
||||||
const TempUrl = "./temp"
|
const TempUrl = "./temp"
|
||||||
|
|
||||||
const CurrentLauncherVersion = "1.8.0"
|
const CurrentLauncherVersion = "1.9.0"
|
||||||
|
|
||||||
type ToolFile string
|
type ToolFile string
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user