1 Commits
1.8.0 ... 1.9.0

Author SHA1 Message Date
100c93e8da UPDATE: Update howto, fix bug bytes humman format 2025-10-04 20:30:51 +07:00
9 changed files with 140 additions and 39 deletions

View File

@@ -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)

View File

@@ -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">

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">

View File

@@ -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>

View File

@@ -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,
}) })

View File

@@ -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 {

View File

@@ -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