From d9b5e30831312361b8d88a9ccd16b091c51c3009 Mon Sep 17 00:00:00 2001 From: Brian Beck Date: Mon, 9 Mar 2026 23:19:14 -0700 Subject: [PATCH] bug fixes, add player name support --- app/page.tsx | 79 +++--- docs/404.html | 2 +- docs/404/index.html | 2 +- docs/__next.__PAGE__.txt | 8 +- docs/__next._full.txt | 8 +- docs/__next._head.txt | 2 +- docs/__next._index.txt | 2 +- docs/__next._tree.txt | 6 +- .../_buildManifest.js | 0 .../_clientMiddlewareManifest.json | 0 .../_ssgManifest.js | 0 docs/_next/static/chunks/1fe5719635cf5984.js | 1 - docs/_next/static/chunks/2677e6a5750bb60c.js | 1 - ...c29da8d7ee18a67.js => 3fc0c5e684385765.js} | 4 +- docs/_next/static/chunks/463a5d636c02e0db.js | 1 + docs/_next/static/chunks/49bf5eb2ca42014f.js | 1 - docs/_next/static/chunks/534ef931e88eb989.js | 1 + ...29d98e413c0344a.js => 5b60a5e8e48bc409.js} | 2 +- ...2261e943ff623d2.js => 82a44da545bac352.js} | 2 +- ...3a29a57c8ca45.css => 9542fc38c512bd1a.css} | 2 +- ...d5d454f7c6ac3.css => a2e31798d9bc121e.css} | 2 +- ...400be5b6a2e4806.js => ac206141b5c1882c.js} | 2 +- docs/_next/static/chunks/b07469fc6c6cd3bb.js | 1 - ...e88398bb27ad4a1.js => c293826b70147a61.js} | 2 +- docs/_next/static/chunks/d16b6f1b4eacbf2b.js | 1 + docs/_next/static/chunks/e4a5074909f0df67.js | 1 + docs/_not-found/__next._full.txt | 2 +- docs/_not-found/__next._head.txt | 2 +- docs/_not-found/__next._index.txt | 2 +- .../_not-found/__next._not-found.__PAGE__.txt | 2 +- docs/_not-found/__next._not-found.txt | 2 +- docs/_not-found/__next._tree.txt | 2 +- docs/_not-found/index.html | 2 +- docs/_not-found/index.txt | 2 +- docs/index.html | 2 +- docs/index.txt | 8 +- docs/shapes/__next._full.txt | 6 +- docs/shapes/__next._head.txt | 2 +- docs/shapes/__next._index.txt | 2 +- docs/shapes/__next._tree.txt | 4 +- docs/shapes/__next.shapes.__PAGE__.txt | 6 +- docs/shapes/__next.shapes.txt | 2 +- docs/shapes/index.html | 2 +- docs/shapes/index.txt | 6 +- relay/crc.ts | 6 +- relay/gameConnection.ts | 8 +- relay/server.ts | 12 +- relay/types.ts | 2 +- scripts/play-demo.ts | 2 +- src/components/DemoPlayback.tsx | 9 - src/components/InspectorControls.tsx | 5 +- src/components/JoinServerButton.tsx | 26 +- src/components/LiveConnection.tsx | 261 +----------------- src/components/LiveObserver.tsx | 33 ++- src/components/ObserverControls.tsx | 2 +- src/components/PlayerHUD.module.css | 87 +++++- src/components/PlayerHUD.tsx | 133 +++++---- src/components/PlayerModel.tsx | 93 ++++++- src/components/PlayerNameplate.tsx | 24 +- src/components/ServerBrowser.module.css | 35 ++- src/components/ServerBrowser.tsx | 26 +- src/components/SettingsProvider.tsx | 12 + src/components/StreamPlayback.tsx | 9 + ...Controller.tsx => StreamingController.tsx} | 37 ++- src/state/engineStore.ts | 4 +- src/state/gameEntityTypes.ts | 3 + src/state/liveConnectionStore.ts | 249 +++++++++++++++++ src/stream/StreamEngine.ts | 235 ++++++++++++++-- src/stream/demoStreaming.ts | 52 +++- src/stream/entityBridge.ts | 3 + src/stream/liveStreaming.ts | 27 +- src/stream/playerAnimation.ts | 61 ++-- src/stream/relayClient.ts | 4 +- src/stream/streamHelpers.ts | 25 ++ src/stream/types.ts | 9 + 75 files changed, 1139 insertions(+), 544 deletions(-) rename docs/_next/static/{JablvlklHXp4NGWk4TTlC => MrEXjMpW9X_XkpwJ2-Z7S}/_buildManifest.js (100%) rename docs/_next/static/{JablvlklHXp4NGWk4TTlC => MrEXjMpW9X_XkpwJ2-Z7S}/_clientMiddlewareManifest.json (100%) rename docs/_next/static/{JablvlklHXp4NGWk4TTlC => MrEXjMpW9X_XkpwJ2-Z7S}/_ssgManifest.js (100%) delete mode 100644 docs/_next/static/chunks/1fe5719635cf5984.js delete mode 100644 docs/_next/static/chunks/2677e6a5750bb60c.js rename docs/_next/static/chunks/{0c29da8d7ee18a67.js => 3fc0c5e684385765.js} (57%) create mode 100644 docs/_next/static/chunks/463a5d636c02e0db.js delete mode 100644 docs/_next/static/chunks/49bf5eb2ca42014f.js create mode 100644 docs/_next/static/chunks/534ef931e88eb989.js rename docs/_next/static/chunks/{629d98e413c0344a.js => 5b60a5e8e48bc409.js} (99%) rename docs/_next/static/chunks/{12261e943ff623d2.js => 82a44da545bac352.js} (99%) rename docs/_next/static/chunks/{bd03a29a57c8ca45.css => 9542fc38c512bd1a.css} (89%) rename docs/_next/static/chunks/{12ed5d454f7c6ac3.css => a2e31798d9bc121e.css} (81%) rename docs/_next/static/chunks/{2400be5b6a2e4806.js => ac206141b5c1882c.js} (96%) delete mode 100644 docs/_next/static/chunks/b07469fc6c6cd3bb.js rename docs/_next/static/chunks/{ee88398bb27ad4a1.js => c293826b70147a61.js} (85%) create mode 100644 docs/_next/static/chunks/d16b6f1b4eacbf2b.js create mode 100644 docs/_next/static/chunks/e4a5074909f0df67.js delete mode 100644 src/components/DemoPlayback.tsx create mode 100644 src/components/StreamPlayback.tsx rename src/components/{DemoPlaybackController.tsx => StreamingController.tsx} (93%) create mode 100644 src/state/liveConnectionStore.ts diff --git a/app/page.tsx b/app/page.tsx index 669d1baf..a2ba1bfa 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -24,7 +24,10 @@ import { import { KeyboardControls } from "@react-three/drei"; import { InspectorControls } from "@/src/components/InspectorControls"; import { useTouchDevice } from "@/src/components/useTouchDevice"; -import { SettingsProvider } from "@/src/components/SettingsProvider"; +import { + SettingsProvider, + useSettings, +} from "@/src/components/SettingsProvider"; import { ObserverCamera } from "@/src/components/ObserverCamera"; import { AudioProvider } from "@/src/components/AudioContext"; import { DebugElements } from "@/src/components/DebugElements"; @@ -38,10 +41,8 @@ import { EntityScene } from "@/src/components/EntityScene"; import { TickProvider } from "@/src/components/TickProvider"; import { SceneLighting } from "@/src/components/SceneLighting"; import { PlayerHUD } from "@/src/components/PlayerHUD"; -import { - LiveConnectionProvider, - useLiveConnection, -} from "@/src/components/LiveConnection"; +import { LiveConnectionProvider } from "@/src/components/LiveConnection"; +import { useLiveSelector } from "@/src/state/liveConnectionStore"; import { ServerBrowser } from "@/src/components/ServerBrowser"; import { FeaturesProvider, @@ -50,9 +51,9 @@ import { // Lazy-load demo and live streaming modules — they pull in heavy dependencies // (demo parser, streaming engine, particles) that aren't needed for mission-only mode. -const DemoPlayback = lazy(() => - import("@/src/components/DemoPlayback").then((mod) => ({ - default: mod.DemoPlayback, +const StreamPlayback = lazy(() => + import("@/src/components/StreamPlayback").then((mod) => ({ + default: mod.StreamPlayback, })), ); const DemoPlaybackControls = lazy(() => @@ -152,7 +153,9 @@ function MapInspector() { const isTouch = useTouchDevice(); const features = useFeatures(); - const live = useLiveConnection(); + const hasLiveAdapter = useLiveSelector((s) => s.adapter != null); + const liveReady = useLiveSelector((s) => s.liveReady); + const gameStatus = useLiveSelector((s) => s.gameStatus); const { missionName, missionType } = currentMission; const [mapInfoOpen, setMapInfoOpen] = useState(false); const [serverBrowserOpen, setServerBrowserOpen] = useState(false); @@ -162,13 +165,13 @@ function MapInspector() { // During live join, show progress based on connection status. // Relay status order: connecting → challenging → authenticating → connected. // Once liveReady (first ghost arrives), loading is complete. - const liveLoadingProgress = live.adapter != null - ? live.liveReady + const liveLoadingProgress = hasLiveAdapter + ? liveReady ? 1 - : live.gameStatus === "connected" ? 0.8 - : live.gameStatus === "authenticating" ? 0.6 - : live.gameStatus === "challenging" ? 0.3 - : live.gameStatus === "connecting" ? 0.2 + : gameStatus === "connected" ? 0.8 + : gameStatus === "authenticating" ? 0.6 + : gameStatus === "challenging" ? 0.3 + : gameStatus === "connecting" ? 0.2 : 0.1 : null; @@ -360,8 +363,8 @@ function MissionWhenIdle({ onLoadingChange: (isLoading: boolean, progress?: number) => void; }) { const recording = useRecording(); - const { adapter: liveAdapter } = useLiveConnection(); - const isStreaming = recording != null || liveAdapter != null; + const hasLiveAdapter = useLiveSelector((s) => s.adapter != null); + const isStreaming = recording != null || hasLiveAdapter; if (isStreaming) return null; @@ -377,7 +380,7 @@ function MissionWhenIdle({ /** * In-Canvas components that depend on streaming mode. Mounts the appropriate - * controller (DemoPlayback or LiveObserver) and disables observer controls + * controller (StreamPlayback or LiveObserver) and disables observer controls * during streaming. */ function StreamingComponents({ @@ -394,8 +397,7 @@ function StreamingComponents({ lookJoystickZoneRef: React.RefObject; }) { const recording = useRecording(); - const live = useLiveConnection(); - const isLive = live.adapter != null; + const isLive = useLiveSelector((s) => s.adapter != null); const isStreaming = recording != null || isLive; // Show ObserverControls for: non-streaming mode, OR live mode. @@ -409,7 +411,7 @@ function StreamingComponents({ <> {recording && ( - + )} {isLive && ( @@ -441,16 +443,16 @@ function StreamingComponents({ /** HUD overlay — shown during streaming (demo or live). */ function StreamingHUD() { const recording = useRecording(); - const live = useLiveConnection(); - if (!recording && !live.adapter) return null; - return ; + const hasLiveAdapter = useLiveSelector((s) => s.adapter != null); + if (!recording && !hasLiveAdapter) return null; + return ; } /** Playback controls overlay — only shown during demo playback. */ function StreamingOverlay() { const recording = useRecording(); - const live = useLiveConnection(); - if (!recording || live.adapter != null) return null; + const hasLiveAdapter = useLiveSelector((s) => s.adapter != null); + if (!recording || hasLiveAdapter) return null; return ( @@ -466,16 +468,29 @@ function ServerBrowserDialog({ open: boolean; onClose: () => void; }) { - const live = useLiveConnection(); + const servers = useLiveSelector((s) => s.servers); + const serversLoading = useLiveSelector((s) => s.serversLoading); + const browserToRelayPing = useLiveSelector((s) => s.browserToRelayPing); + const listServers = useLiveSelector((s) => s.listServers); + const joinServer = useLiveSelector((s) => s.joinServer); + const settings = useSettings(); + const handleJoin = useCallback( + (address: string) => { + joinServer(address, settings?.warriorName); + }, + [joinServer, settings?.warriorName], + ); return ( live.joinServer(address)} - wsPing={live.wsPing} + servers={servers} + loading={serversLoading} + onRefresh={listServers} + onJoin={handleJoin} + wsPing={browserToRelayPing} + warriorName={settings?.warriorName ?? ""} + onWarriorNameChange={(name) => settings?.setWarriorName(name)} /> ); } diff --git a/docs/404.html b/docs/404.html index cfbe476a..be6e873b 100644 --- a/docs/404.html +++ b/docs/404.html @@ -1 +1 @@ -404: This page could not be found.MapGenius – Explore maps for Tribes 2

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.MapGenius – Explore maps for Tribes 2

404

This page could not be found.

\ No newline at end of file diff --git a/docs/404/index.html b/docs/404/index.html index cfbe476a..be6e873b 100644 --- a/docs/404/index.html +++ b/docs/404/index.html @@ -1 +1 @@ -404: This page could not be found.MapGenius – Explore maps for Tribes 2

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.MapGenius – Explore maps for Tribes 2

404

This page could not be found.

\ No newline at end of file diff --git a/docs/__next.__PAGE__.txt b/docs/__next.__PAGE__.txt index 0ded516e..104b2414 100644 --- a/docs/__next.__PAGE__.txt +++ b/docs/__next.__PAGE__.txt @@ -1,11 +1,11 @@ 1:"$Sreact.fragment" 2:I[47257,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ClientPageRoot"] -3:I[31713,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/2400be5b6a2e4806.js","/t2-mapper/_next/static/chunks/164bc8495505bc95.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/ee88398bb27ad4a1.js","/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","/t2-mapper/_next/static/chunks/b07469fc6c6cd3bb.js","/t2-mapper/_next/static/chunks/629d98e413c0344a.js","/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","/t2-mapper/_next/static/chunks/49bf5eb2ca42014f.js"],"default"] +3:I[31713,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/ac206141b5c1882c.js","/t2-mapper/_next/static/chunks/164bc8495505bc95.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/c293826b70147a61.js","/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","/t2-mapper/_next/static/chunks/534ef931e88eb989.js","/t2-mapper/_next/static/chunks/5b60a5e8e48bc409.js","/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","/t2-mapper/_next/static/chunks/e4a5074909f0df67.js"],"default"] 6:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"OutletBoundary"] 7:"$Sreact.suspense" -:HL["/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","style"] -:HL["/t2-mapper/_next/static/chunks/bd03a29a57c8ca45.css","style"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/bd03a29a57c8ca45.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/2400be5b6a2e4806.js","async":true}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/164bc8495505bc95.js","async":true}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/ee88398bb27ad4a1.js","async":true}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","async":true}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/b07469fc6c6cd3bb.js","async":true}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/629d98e413c0344a.js","async":true}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","async":true}],["$","script","script-9",{"src":"/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","async":true}],["$","script","script-10",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true}],["$","script","script-11",{"src":"/t2-mapper/_next/static/chunks/49bf5eb2ca42014f.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"loading":null,"isPartial":false} +:HL["/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","style"] +:HL["/t2-mapper/_next/static/chunks/9542fc38c512bd1a.css","style"] +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/9542fc38c512bd1a.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/ac206141b5c1882c.js","async":true}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/164bc8495505bc95.js","async":true}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/c293826b70147a61.js","async":true}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","async":true}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/534ef931e88eb989.js","async":true}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/5b60a5e8e48bc409.js","async":true}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","async":true}],["$","script","script-9",{"src":"/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","async":true}],["$","script","script-10",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true}],["$","script","script-11",{"src":"/t2-mapper/_next/static/chunks/e4a5074909f0df67.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"loading":null,"isPartial":false} 4:{} 5:"$0:rsc:props:children:0:props:serverProvidedParams:params" 8:null diff --git a/docs/__next._full.txt b/docs/__next._full.txt index 0f7d73dd..4761c8c1 100644 --- a/docs/__next._full.txt +++ b/docs/__next._full.txt @@ -3,16 +3,16 @@ 3:I[39756,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 4:I[37457,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 5:I[47257,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ClientPageRoot"] -6:I[31713,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/2400be5b6a2e4806.js","/t2-mapper/_next/static/chunks/164bc8495505bc95.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/ee88398bb27ad4a1.js","/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","/t2-mapper/_next/static/chunks/b07469fc6c6cd3bb.js","/t2-mapper/_next/static/chunks/629d98e413c0344a.js","/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","/t2-mapper/_next/static/chunks/49bf5eb2ca42014f.js"],"default"] +6:I[31713,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/ac206141b5c1882c.js","/t2-mapper/_next/static/chunks/164bc8495505bc95.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/c293826b70147a61.js","/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","/t2-mapper/_next/static/chunks/534ef931e88eb989.js","/t2-mapper/_next/static/chunks/5b60a5e8e48bc409.js","/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","/t2-mapper/_next/static/chunks/e4a5074909f0df67.js"],"default"] 9:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"OutletBoundary"] a:"$Sreact.suspense" c:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ViewportBoundary"] e:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"MetadataBoundary"] 10:I[68027,[],"default"] :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -:HL["/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","style"] -:HL["/t2-mapper/_next/static/chunks/bd03a29a57c8ca45.css","style"] -0:{"P":null,"b":"JablvlklHXp4NGWk4TTlC","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/bd03a29a57c8ca45.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/2400be5b6a2e4806.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/164bc8495505bc95.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/ee88398bb27ad4a1.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/b07469fc6c6cd3bb.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/629d98e413c0344a.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/t2-mapper/_next/static/chunks/49bf5eb2ca42014f.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[]],"S":true} +:HL["/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","style"] +:HL["/t2-mapper/_next/static/chunks/9542fc38c512bd1a.css","style"] +0:{"P":null,"b":"MrEXjMpW9X_XkpwJ2-Z7S","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/9542fc38c512bd1a.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/ac206141b5c1882c.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/164bc8495505bc95.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/c293826b70147a61.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/534ef931e88eb989.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/5b60a5e8e48bc409.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/t2-mapper/_next/static/chunks/e4a5074909f0df67.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[]],"S":true} 7:{} 8:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params" d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]] diff --git a/docs/__next._head.txt b/docs/__next._head.txt index 462067a2..653a1b4e 100644 --- a/docs/__next._head.txt +++ b/docs/__next._head.txt @@ -3,4 +3,4 @@ 3:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"IconMark"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"MapGenius – Explore maps for Tribes 2"}],["$","meta","1",{"name":"description","content":"Tribes 2 forever."}],["$","link","2",{"rel":"icon","href":"/t2-mapper/icon.png?icon.2911bba1.png","sizes":"108x128","type":"image/png"}],["$","$L5","3",{}]]}]}]}],null]}],"loading":null,"isPartial":false} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"MapGenius – Explore maps for Tribes 2"}],["$","meta","1",{"name":"description","content":"Tribes 2 forever."}],["$","link","2",{"rel":"icon","href":"/t2-mapper/icon.png?icon.2911bba1.png","sizes":"108x128","type":"image/png"}],["$","$L5","3",{}]]}]}]}],null]}],"loading":null,"isPartial":false} diff --git a/docs/__next._index.txt b/docs/__next._index.txt index 42eb3c22..58c2cae6 100644 --- a/docs/__next._index.txt +++ b/docs/__next._index.txt @@ -3,4 +3,4 @@ 3:I[39756,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 4:I[37457,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]]}],"loading":null,"isPartial":false} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]]}],"loading":null,"isPartial":false} diff --git a/docs/__next._tree.txt b/docs/__next._tree.txt index 616cc1b4..a98feb93 100644 --- a/docs/__next._tree.txt +++ b/docs/__next._tree.txt @@ -1,4 +1,4 @@ :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -:HL["/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","style"] -:HL["/t2-mapper/_next/static/chunks/bd03a29a57c8ca45.css","style"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":true},"staleTime":300} +:HL["/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","style"] +:HL["/t2-mapper/_next/static/chunks/9542fc38c512bd1a.css","style"] +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":true},"staleTime":300} diff --git a/docs/_next/static/JablvlklHXp4NGWk4TTlC/_buildManifest.js b/docs/_next/static/MrEXjMpW9X_XkpwJ2-Z7S/_buildManifest.js similarity index 100% rename from docs/_next/static/JablvlklHXp4NGWk4TTlC/_buildManifest.js rename to docs/_next/static/MrEXjMpW9X_XkpwJ2-Z7S/_buildManifest.js diff --git a/docs/_next/static/JablvlklHXp4NGWk4TTlC/_clientMiddlewareManifest.json b/docs/_next/static/MrEXjMpW9X_XkpwJ2-Z7S/_clientMiddlewareManifest.json similarity index 100% rename from docs/_next/static/JablvlklHXp4NGWk4TTlC/_clientMiddlewareManifest.json rename to docs/_next/static/MrEXjMpW9X_XkpwJ2-Z7S/_clientMiddlewareManifest.json diff --git a/docs/_next/static/JablvlklHXp4NGWk4TTlC/_ssgManifest.js b/docs/_next/static/MrEXjMpW9X_XkpwJ2-Z7S/_ssgManifest.js similarity index 100% rename from docs/_next/static/JablvlklHXp4NGWk4TTlC/_ssgManifest.js rename to docs/_next/static/MrEXjMpW9X_XkpwJ2-Z7S/_ssgManifest.js diff --git a/docs/_next/static/chunks/1fe5719635cf5984.js b/docs/_next/static/chunks/1fe5719635cf5984.js deleted file mode 100644 index 7f3a7244..00000000 --- a/docs/_next/static/chunks/1fe5719635cf5984.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,29055,e=>{"use strict";var t=e.i(43476),n=e.i(71645),i=e.i(15080),a=e.i(71753),r=e.i(90072),o=e.i(12979),s=e.i(51434),l=e.i(79123),u=e.i(89887);e.i(13876);var c=e.i(58647);let m=new Map,d=new Map;function f(e,t=1){d.set(e,t)}function p(e){d.delete(e)}let h=0;function S(){return h}function g(){for(let[e]of(h++,d)){try{e.stop()}catch{}try{e.disconnect()}catch{}}d.clear()}function y(e,t){let n=t(e),i=n?.filename;if(!i)return null;let a=i.endsWith(".wav")?i:`${i}.wav`,r=n.description,o=null!=r?t(r):void 0,s=o?.is3D??!0,l=o?.isLooping??!1,u=o?.referenceDistance??20;return{filename:a,is3D:s,isLooping:l,refDist:u,maxDist:o?.maxDistance??100,volume:o?.volume??1}}function T(e,t,n,i,a){let s;try{s=(0,o.audioToUrl)(e.filename)}catch{return}let l=c.engineStore.getState().playback.rate,u=h;I(s,n,n=>{if(u===h)try{if(e.is3D&&a){let o=new r.PositionalAudio(t);o.setBuffer(n),o.setDistanceModel("inverse"),o.setRefDistance(e.refDist),o.setMaxDistance(e.maxDist),o.setRolloffFactor(1),o.setVolume(e.volume),o.setPlaybackRate(l),i&&o.position.copy(i),a.add(o),d.set(o,1),o.play(),o.source.onended=()=>{d.delete(o);try{o.disconnect()}catch{}a.remove(o)}}else{let i=new r.Audio(t);i.setBuffer(n),i.setVolume(e.volume),i.setPlaybackRate(l),d.set(i,1),i.play(),i.source.onended=()=>{d.delete(i);try{i.disconnect()}catch{}}}}catch{}})}function I(e,t,n){m.has(e)?n(m.get(e)):t.load(e,t=>{m.set(e,t),n(t)},void 0,t=>{console.error("Audio load error",e,t)})}c.engineStore.subscribe(e=>e.playback.rate,e=>{for(let[t,n]of d)try{t.setPlaybackRate(n*e)}catch{}});let w=(0,n.memo)(function({entity:e}){let{debugMode:c}=(0,l.useDebug)(),m=e.audioFileName??"",d=e.audioVolume??1,f=e.audioMinDistance??1,p=e.audioMaxDistance??1,h=e.audioMinLoopGap??0,S=e.audioMaxLoopGap??0,g=e.audioIs3D??!0?1:0,y=e.audioIsLooping??!0,[T,w,A]=e.position??[0,0,0],{scene:M,camera:k}=(0,i.useThree)(),{audioLoader:N,audioListener:v}=(0,s.useAudio)(),{audioEnabled:b}=(0,l.useSettings)(),x=(0,n.useRef)(null),R=(0,n.useRef)(null),_=(0,n.useRef)(null),L=(0,n.useRef)(!1),C=(0,n.useRef)(!1),O=(0,n.useRef)(new r.Vector3(T,w,A)),E=(0,n.useRef)(0),D=()=>{null!=R.current&&(clearTimeout(R.current),R.current=null),null!=_.current&&(clearTimeout(_.current),_.current=null)};(0,n.useEffect)(()=>{let e;if(N&&v){if(E.current++,g){let t=new r.PositionalAudio(v);t.position.copy(O.current),t.setDistanceModel("inverse"),t.setRefDistance(f),t.setMaxDistance(p),t.setRolloffFactor(1),t.setVolume(d),e=t,M.add(e)}else(e=new r.Audio(v)).setVolume(d);return x.current=e,()=>{D();try{e.stop()}catch{}try{e.disconnect()}catch{}g&&M.remove(e),x.current=null,L.current=!1,C.current=!1}}},[N,v,g,f,p,d,M]);let P=(e,t)=>{if(y)if(h>0||S>0){let n=Math.max(0,h),i=Math.max(n,S),a=n===i?n:Math.random()*(i-n)+n;e.loop=!1;let r=()=>{t===E.current&&(!1===e.isPlaying?R.current=setTimeout(()=>{if(t===E.current)try{e.play(),P(e,t)}catch{}},a):_.current=setTimeout(r,100))};_.current=setTimeout(r,100)}else e.setLoop(!0)},F=e=>{if(!N)return;let t=E.current;if(L.current)try{e.isPlaying||(e.play(),P(e,t))}catch{}else{let n;try{n=(0,o.audioToUrl)(m)}catch{return}I(n,N,n=>{if(t===E.current&&!e.buffer){e.setBuffer(n),L.current=!0;try{e.play(),P(e,t)}catch{}}})}};return(0,n.useEffect)(()=>{let e=x.current;e&&!g&&b&&m&&F(e)},[b,g,m,N,v]),(0,a.useFrame)(()=>{let e=x.current;if(!e||!g||!b||!m)return;let t=k.position.distanceTo(O.current),n=C.current,i=t<=p;if(i&&!n)C.current=!0,F(e);else if(!i&&n){C.current=!1,D();try{e.stop()}catch{}}}),(0,n.useEffect)(()=>{let e=x.current;if(e&&!b){D();try{e.stop()}catch{}C.current=!1}},[b]),c?(0,t.jsxs)("mesh",{position:O.current,children:[(0,t.jsx)("sphereGeometry",{args:[f,12,12]}),(0,t.jsx)("meshBasicMaterial",{color:"#00ff00",wireframe:!0,opacity:.05,transparent:!0,toneMapped:!1}),(0,t.jsx)(u.FloatingLabel,{color:"#00ff00",position:[0,f+1,0],children:m})]}):null});e.s(["AudioEmitter",0,w,"audioBufferCache",0,m,"getCachedAudioBuffer",()=>I,"getSoundGeneration",()=>S,"playOneShotSound",()=>T,"resolveAudioProfile",()=>y,"stopAllTrackedSounds",()=>g,"trackSound",()=>f,"untrackSound",()=>p])},9721,e=>{"use strict";var t=e.i(43476),n=e.i(932),i=e.i(71645),a=e.i(71753),r=e.i(90072),o=e.i(82816),s=e.i(85557);class l{states;seqIndexToName;currentStateIndex=0;delayTime=0;lastFireCount=-1;spinTimeScale=0;constructor(e,t){this.states=e,this.seqIndexToName=t,e.length>0&&(this.delayTime=e[0].timeoutValue??0)}get stateIndex(){return this.currentStateIndex}reset(){this.currentStateIndex=0,this.delayTime=this.states.length>0?this.states[0].timeoutValue??0:0,this.lastFireCount=-1}tick(e,t){if(0===this.states.length)return{sequenceName:null,isFiring:!1,spinTimeScale:0,reverse:!1,scaleAnimation:!1,timeoutValue:0,transitioned:!1,soundDataBlockIds:[],stateIndex:-1};let n=this.lastFireCount>=0&&t.fireCount!==this.lastFireCount;this.lastFireCount=t.fireCount;let i=[];if(n){let e=this.states.findIndex(e=>e.fire);if(e>=0&&e!==this.currentStateIndex){this.currentStateIndex=e,this.delayTime=this.states[e].timeoutValue??0;let t=this.states[e].soundDataBlockId;t>=0&&i.push(t)}}this.delayTime-=e;let a=n,r=this.evaluateTickTransitions(t),o=0;for(;r>=0&&o<32;){if(o++,a=!0,r===this.currentStateIndex){this.delayTime=this.states[r].timeoutValue??0;break}let e=this.states[this.currentStateIndex].spin,n=this.delayTime;this.currentStateIndex=r;let s=this.states[r].timeoutValue??0;this.delayTime=s;let l=this.states[r].soundDataBlockId;switch(l>=0&&i.push(l),this.states[r].spin){case 1:this.spinTimeScale=0;break;case 4:this.spinTimeScale=1;break;case 2:3===e&&s>0&&(this.delayTime*=1-n/s);break;case 3:2===e&&s>0&&(this.delayTime*=1-n/s)}r=this.evaluateEntryTransitions(t)}let s=this.states[this.currentStateIndex],l=s.timeoutValue??0;switch(s.spin){case 1:this.spinTimeScale=0;break;case 2:this.spinTimeScale=l>0?Math.max(0,1-this.delayTime/l):1;break;case 4:this.spinTimeScale=1;break;case 3:this.spinTimeScale=l>0?Math.max(0,this.delayTime/l):0}return{sequenceName:this.resolveSequenceName(s),isFiring:s.fire,spinTimeScale:this.spinTimeScale,reverse:!s.direction,scaleAnimation:s.scaleAnimation,timeoutValue:s.timeoutValue??0,transitioned:a,soundDataBlockIds:i,stateIndex:this.currentStateIndex}}evaluateTickTransitions(e){let t=this.states[this.currentStateIndex],n=this.delayTime<=0;if(!(n||!t.waitForTimeout))return -1;let i=this.evaluateConditions(t,e);if(-1!==i)return i;if(n){let e=t.transitionOnTimeout;if(-1!==e)return e}return -1}evaluateEntryTransitions(e){let t=this.states[this.currentStateIndex];return this.evaluateConditions(t,e)}evaluateConditions(e,t){let n=t.loaded?e.transitionOnLoaded:e.transitionOnNotLoaded;if(-1!==n)return n;let i=t.ammo?e.transitionOnAmmo:e.transitionOnNoAmmo;if(-1!==i)return i;let a=t.target?e.transitionOnTarget:e.transitionOnNoTarget;if(-1!==a)return a;let r=t.wet?e.transitionOnWet:e.transitionOnNotWet;if(-1!==r)return r;let o=t.triggerDown?e.transitionOnTriggerDown:e.transitionOnTriggerUp;return -1!==o?o:-1}resolveSequenceName(e){return null==e.sequence||e.sequence<0?null:this.seqIndexToName[e.sequence]??null}}var u=e.i(43595),c=e.i(91907),m=e.i(87297),d=e.i(51434),f=e.i(29055),p=e.i(12979),h=e.i(79123);e.i(13876);var S=e.i(58647),g=e.i(93784);let y=["root","run","back","side","fall","jump","land"];function T(e,t,n){let i=e.current;if(i){(0,f.untrackSound)(i);try{i.stop()}catch{}try{i.disconnect()}catch{}n?.remove(i),e.current=null,t.current=-1}}function I(e){let l,d,f,p,h,T,I,b,x,R,_,L,C,O,E,D,P,F,B,q,V=(0,n.c)(47),{entity:j}=e,W=(0,S.useEngineStoreApi)(),U=j.shapeName??j.dataBlock,G=(0,c.useStaticShape)(U);V[0]!==U?(l=e=>{let t=U?.toLowerCase();return t?e.runtime.sequenceAliases.get(t):void 0},V[0]=U,V[1]=l):l=V[1];let Y=(0,S.useEngineSelector)(l);V[2]!==G.scene?(h=o.clone(G.scene),d=(0,s.processShapeScene)(h),h.traverse(N),p=new r.AnimationMixer(h),f=null,h.traverse(e=>{f||"Mount0"!==e.name||(f=e)}),V[2]=G.scene,V[3]=d,V[4]=f,V[5]=p,V[6]=h):(d=V[3],f=V[4],p=V[5],h=V[6]),V[7]!==d||V[8]!==f||V[9]!==p||V[10]!==h?(T={clonedScene:h,mixer:p,mount0:f,iflInitializers:d},V[7]=d,V[8]=f,V[9]=p,V[10]=h,V[11]=T):T=V[11];let{clonedScene:z,mixer:K,mount0:H,iflInitializers:$}=T;V[12]===Symbol.for("react.memo_cache_sentinel")?(I=new Map,V[12]=I):I=V[12];let J=(0,i.useRef)(I);V[13]===Symbol.for("react.memo_cache_sentinel")?(b={head:null,headside:null},V[13]=b):b=V[13];let Q=(0,i.useRef)(b);V[14]===Symbol.for("react.memo_cache_sentinel")?(x=new Map,V[14]=x):x=V[14];let X=(0,i.useRef)(x),Z=(0,i.useRef)(null);V[15]===Symbol.for("react.memo_cache_sentinel")?(R={name:"root",timeScale:1},V[15]=R):R=V[15];let ee=(0,i.useRef)(R),et=(0,i.useRef)(!1),en=(0,i.useRef)(void 0);if(V[16]!==W||V[17]!==U){e:{let e=W.getState().playback,t=e.recording?.streamingPlayback,n=U?.toLowerCase();if(!t||!n){let e;V[19]===Symbol.for("react.memo_cache_sentinel")?(e=new Map,V[19]=e):e=V[19],_=e;break e}let i=t.getShapeConstructorSequences(n);if(!i){let e;V[20]===Symbol.for("react.memo_cache_sentinel")?(e=new Map,V[20]=e):e=V[20],_=e;break e}_=function(e,t){let n=new Map,i=[];for(let n of e){let e=n.indexOf(" ");if(-1===e)continue;let a=n.slice(0,e).toLowerCase(),r=n.slice(e+1).trim().toLowerCase();if(!r||!a.startsWith(t)||!a.endsWith(".dsq"))continue;let o=a.slice(t.length,-4);o&&i.push({clipName:o,alias:r})}let a=new Set;for(let e=0;e{let e=(0,u.getAliasedActions)(G.animations,K,Y);J.current=e;let t=e.get("root");t&&t.play(),ee.current={name:"root",timeScale:1};let n={head:null,headside:null};for(let{key:e,names:t}of[{key:"head",names:["head"]},{key:"headside",names:["headside"]}]){let i=G.animations.find(e=>t.includes(e.name.toLowerCase()));if(!i)continue;let a=i.clone(),o=Math.round(30*i.duration/2);r.AnimationUtils.makeClipAdditive(a,o,i,30);let s=K.clipAction(a);s.blendMode=r.AdditiveAnimationBlendMode,s.timeScale=0,s.weight=1,s.play(),n[e]=s}Q.current=n;let i=new Map,a=G.animations.find(k),o=a?Math.round(30*a.duration/2):0;for(let e of["lookde","lookms","looksn"]){let t=G.animations.find(t=>t.name.toLowerCase()===e);if(!t)continue;let n=t.clone(),s=a??t;r.AnimationUtils.makeClipAdditive(n,o,s,30);let l=K.clipAction(n);l.blendMode=r.AdditiveAnimationBlendMode,l.timeScale=0,l.weight=0,l.play(),i.set(e,l)}X.current=i;let s=i.get("lookde");return s&&(s.weight=1,Z.current="lookde"),K.update(0),()=>{K.stopAllAction(),J.current=new Map,Q.current={head:null,headside:null},X.current=new Map,Z.current=null}},C=[K,G.animations,Y],V[21]=G.animations,V[22]=K,V[23]=Y,V[24]=L,V[25]=C):(L=V[24],C=V[25]),(0,i.useEffect)(L,C),V[26]!==$?(O=()=>{let e=[];for(let{mesh:t,initialize:n}of $)n(t,M).then(t=>e.push(t)).catch(A);return()=>e.forEach(w)},E=[$],V[26]=$,V[27]=O,V[28]=E):(O=V[27],E=V[28]),(0,i.useEffect)(O,E);let ea=(0,i.useRef)(j.weaponShape),[er,eo]=(0,i.useState)(j.weaponShape);return V[29]!==ei||V[30]!==W||V[31]!==j.headPitch||V[32]!==j.headYaw||V[33]!==j.keyframes||V[34]!==j.weaponShape||V[35]!==K?(D=(e,t)=>{j.weaponShape!==ea.current&&(ea.current=j.weaponShape,eo(j.weaponShape));let n=W.getState().playback,i="playing"===n.status,a=g.streamPlaybackStore.getState().time,o=(0,s.getKeyframeAtTime)(j.keyframes??[],a),l=o?.damageState!=null&&o.damageState>=1,u=J.current;if(l&&!et.current){et.current=!0;let e=null!=o.actionAnim?ei.get(o.actionAnim):void 0;if(e){let t=u.get(e.clipName);if(t){let n=u.get(ee.current.name.toLowerCase());n&&n.fadeOut(s.ANIM_TRANSITION_TIME),t.setLoop(r.LoopOnce,1),t.clampWhenFinished=!0,t.reset().fadeIn(s.ANIM_TRANSITION_TIME).play(),ee.current={name:e.clipName,timeScale:1},en.current=o.actionAnim}}}if(!l&&et.current){et.current=!1,en.current=void 0;let e=u.get(ee.current.name.toLowerCase());e&&(e.stop(),e.setLoop(r.LoopRepeat,1/0),e.clampWhenFinished=!1),ee.current={name:"root",timeScale:1};let t=u.get("root");t&&t.reset().play()}let c=o?.actionAnim,m=en.current;if(!et.current&&c!==m){en.current=c;let e=null!=m&&m>=7;if(null!=c&&c>=7){let e=ei.get(c);if(e){let t=u.get(e.clipName);if(t){let n=u.get(ee.current.name.toLowerCase());n&&n.fadeOut(s.ANIM_TRANSITION_TIME),t.setLoop(r.LoopOnce,1),t.clampWhenFinished=!0,t.reset().fadeIn(s.ANIM_TRANSITION_TIME).play(),ee.current={name:e.clipName,timeScale:1}}}}else if(e){let e=ei.get(m);if(e){let t=u.get(e.clipName);t&&(t.fadeOut(s.ANIM_TRANSITION_TIME),t.setLoop(r.LoopRepeat,1/0),t.clampWhenFinished=!1)}ee.current={name:"root",timeScale:1};let t=u.get("root");t&&t.reset().fadeIn(s.ANIM_TRANSITION_TIME).play()}}if(null!=c&&c>=7&&o?.actionAtEnd){let e=ei.get(c);if(e){let t=u.get(e.clipName);t&&(t.paused=!0)}}let d=null!=en.current&&en.current>=7;if(!et.current&&!d){let e=function(e,t){if(!e)return{animation:"root",timeScale:1};let[n,i,a]=e;if(a<-10)return{animation:"fall",timeScale:1};let r=-2*Math.atan2(t[1],t[3]),o=Math.cos(r),s=Math.sin(r),l=n*o+i*s,u=-n*s+i*o,c=-u,m=-l,d=Math.max(u,c,m,l);return d<.1?{animation:"root",timeScale:1}:d===u?{animation:"run",timeScale:1}:d===c?{animation:"back",timeScale:1}:d===m?{animation:"side",timeScale:1}:{animation:"side",timeScale:-1}}(o?.velocity,o?.rotation??[0,0,0,1]),t=ee.current;if(e.animation!==t.name||e.timeScale!==t.timeScale){let n=u.get(t.name.toLowerCase()),a=u.get(e.animation.toLowerCase());a&&(i&&n&&n!==a?(n.fadeOut(s.ANIM_TRANSITION_TIME),a.reset().fadeIn(s.ANIM_TRANSITION_TIME).play()):(n&&n!==a&&n.stop(),a.reset().play()),a.timeScale=e.timeScale,ee.current={name:e.animation,timeScale:e.timeScale})}}let f=function(e){if(!e)return"lookde";let t=e.toLowerCase();return t.includes("missile")?"lookms":t.includes("sniper")?"looksn":"lookde"}(j.weaponShape);if(f!==Z.current){let e=X.current,t=Z.current?e.get(Z.current):null,n=e.get(f);n&&(t&&(t.weight=0),n.weight=+!l,Z.current=f)}let{head:p,headside:h}=Q.current,S=Z.current?X.current.get(Z.current):null,y=+!l,T=j.headPitch??0,I=j.headYaw??0,w=(T+1)/2;S&&(S.time=w*S.getClip().duration,S.weight=y),p&&(p.time=w*p.getClip().duration,p.weight=y),h&&(h.time=(I+1)/2*h.getClip().duration,h.weight=y),i?K.update(t*n.rate):K.update(0)},V[29]=ei,V[30]=W,V[31]=j.headPitch,V[32]=j.headYaw,V[33]=j.keyframes,V[34]=j.weaponShape,V[35]=K,V[36]=D):D=V[36],(0,a.useFrame)(D),V[37]===Symbol.for("react.memo_cache_sentinel")?(P=[0,Math.PI/2,0],V[37]=P):P=V[37],V[38]!==z?(F=(0,t.jsx)("group",{rotation:P,children:(0,t.jsx)("primitive",{object:z})}),V[38]=z,V[39]=F):F=V[39],V[40]!==er||V[41]!==j||V[42]!==H?(B=er&&H&&(0,t.jsx)(m.ShapeErrorBoundary,{fallback:null,children:(0,t.jsx)(i.Suspense,{fallback:null,children:(0,t.jsx)(v,{entity:j,weaponShape:er,mount0:H})})},er),V[40]=er,V[41]=j,V[42]=H,V[43]=B):B=V[43],V[44]!==F||V[45]!==B?(q=(0,t.jsxs)(t.Fragment,{children:[F,B]}),V[44]=F,V[45]=B,V[46]=q):q=V[46],q}function w(e){return e()}function A(){}function M(){return g.streamPlaybackStore.getState().time}function k(e){return"lookde"===e.name.toLowerCase()}function N(e){if(e.isMesh&&e.material)for(let t of Array.isArray(e.material)?e.material:[e.material])t.side=r.FrontSide}function v(e){let t,u,m,g,y,I,w,A,M,k,N,v,_,L,C=(0,n.c)(38),{entity:O,weaponShape:E,mount0:D}=e,P=(0,S.useEngineStoreApi)(),F=(0,c.useStaticShape)(E);if(C[0]!==F.animations||C[1]!==F.scene){t=o.clone(F.scene),u=(0,s.processShapeScene)(t);let e=(0,s.getPosedNodeTransform)(F.scene,F.animations,"Mountpoint");if(e){let n=e.quaternion.clone().invert(),i=e.position.clone().negate().applyQuaternion(n);t.position.copy(i),t.quaternion.copy(n)}g=new Map,t.traverse(e=>{if(!e.isMesh)return;let t=e.userData,n=(t?.vis_sequence??"").toLowerCase();if(!n)return;let i=g.get(n);i||(i=[],g.set(n,i)),i.push(e)}),m=new r.AnimationMixer(t),C[0]=F.animations,C[1]=F.scene,C[2]=t,C[3]=u,C[4]=m,C[5]=g}else t=C[2],u=C[3],m=C[4],g=C[5];let B=m,q=F.scene;C[6]!==q||C[7]!==F.animations?(y=function(e,t){let n=e.userData?.dts_sequence_names;if("string"==typeof n)try{return JSON.parse(n).map(e=>e.toLowerCase())}catch{}return t.map(e=>e.name.toLowerCase())}(q,F.animations),C[6]=q,C[7]=F.animations,C[8]=y):y=C[8];let V=y;C[9]!==t||C[10]!==u||C[11]!==B||C[12]!==V||C[13]!==g?(I={weaponClone:t,weaponMixer:B,seqIndexToName:V,visNodesBySequence:g,weaponIflInitializers:u},C[9]=t,C[10]=u,C[11]=B,C[12]=V,C[13]=g,C[14]=I):I=C[14];let{weaponClone:j,weaponMixer:W,seqIndexToName:U,visNodesBySequence:G,weaponIflInitializers:Y}=I;C[15]===Symbol.for("react.memo_cache_sentinel")?(w=new Map,C[15]=w):w=C[15];let z=(0,i.useRef)(w),K=(0,i.useRef)(null);C[16]!==F.animations||C[17]!==W?(A=()=>{let e=new Map;for(let t of F.animations)e.set(t.name.toLowerCase(),W.clipAction(t));z.current=e;let t=e.get("spin");return t&&(t.setLoop(r.LoopRepeat,1/0),t.timeScale=0,t.play()),K.current=t??null,W.update(0),()=>{W.stopAllAction(),z.current=new Map,K.current=null,T(et,en)}},M=[W,F.animations],C[16]=F.animations,C[17]=W,C[18]=A,C[19]=M):(A=C[18],M=C[19]),(0,i.useEffect)(A,M),C[20]!==Y?(k=()=>{let e=[];for(let{mesh:t,initialize:n}of Y)n(t,R).then(t=>e.push(t)).catch(x);return()=>e.forEach(b)},N=[Y],C[20]=Y,C[21]=k,C[22]=N):(k=C[21],N=C[22]),(0,i.useEffect)(k,N);let{audioLoader:H,audioListener:$}=(0,d.useAudio)(),J=(0,h.useSettings)(),Q=J?.audioEnabled??!1,X=(0,i.useRef)(null),Z=(0,i.useRef)(null),ee=(0,i.useRef)(O.weaponImageStates),et=(0,i.useRef)(null),en=(0,i.useRef)(-1);return C[23]!==D||C[24]!==j?(v=()=>(D.add(j),()=>{D.remove(j)}),_=[j,D],C[23]=D,C[24]=j,C[25]=v,C[26]=_):(v=C[25],_=C[26]),(0,i.useEffect)(v,_),C[27]!==Q||C[28]!==$||C[29]!==H||C[30]!==P||C[31]!==O.weaponImageState||C[32]!==O.weaponImageStates||C[33]!==U||C[34]!==G||C[35]!==j||C[36]!==W?(L=(e,t)=>{let n=P.getState().playback,i="playing"===n.status,a=z.current,o=O.weaponImageState,u=O.weaponImageStates;u!==ee.current&&(ee.current=u,u&&u.length>0?X.current=new l(u,U):X.current=null,Z.current=null,T(et,en,j)),!X.current&&u&&u.length>0&&(X.current=new l(u,U));let c=X.current;if(c&&o&&i){let e=t*n.rate,i=c.tick(e,o);if(function(e,t,n,i){let a=e.sequenceName,o=n.current;if(a===o&&!e.transitioned)return;if(a!==o){if(o){let e=i.get(o);if(e)for(let t of e)t.visible=!1}if(a){let e=i.get(a);if(e)for(let t of e)t.visible=!0}}if(!a){if(o){let e=t.get(o);e&&e.fadeOut(s.ANIM_TRANSITION_TIME),n.current=null}return}let l=t.get(a);if(l&&(e.transitioned||a!==o)){let i=o?t.get(o):null;if(e.isFiring||e.timeoutValue>0?(l.setLoop(r.LoopOnce,1),l.clampWhenFinished=!0):(l.setLoop(r.LoopRepeat,1/0),l.clampWhenFinished=!1),e.scaleAnimation&&e.timeoutValue>0){let t=l.getClip().duration;l.timeScale=t>0?t/e.timeoutValue:1}else l.timeScale=e.reverse?-1:1;i&&i!==l?(i.fadeOut(s.ANIM_TRANSITION_TIME),l.reset().fadeIn(s.ANIM_TRANSITION_TIME).play()):l.reset().play(),n.current=a}}(i,a,Z,G),et.current&&i.stateIndex!==en.current&&T(et,en,j),Q&&H&&$&&i.soundDataBlockIds.length>0){let e=n.recording?.streamingPlayback.getDataBlockData.bind(n.recording.streamingPlayback);if(e)for(let t of i.soundDataBlockIds){let i=(0,f.resolveAudioProfile)(t,e);if(i)if(i.isLooping){if(!et.current)try{let e=(0,p.audioToUrl)(i.filename),t=(0,f.getSoundGeneration)();(0,f.getCachedAudioBuffer)(e,H,e=>{if(t!==(0,f.getSoundGeneration)()||et.current)return;let a=c.stateIndex,o=new r.PositionalAudio($);o.setBuffer(e),o.setDistanceModel("inverse"),o.setRefDistance(i.refDist),o.setMaxDistance(i.maxDist),o.setRolloffFactor(1),o.setVolume(i.volume),o.setPlaybackRate(n.rate),o.setLoop(!0),j.add(o),(0,f.trackSound)(o),o.play(),et.current=o,en.current=a})}catch{}}else(0,f.playOneShotSound)(i,$,H,void 0,j)}}K.current&&(K.current.timeScale=i.spinTimeScale)}i?W.update(t*n.rate):W.update(0)},C[27]=Q,C[28]=$,C[29]=H,C[30]=P,C[31]=O.weaponImageState,C[32]=O.weaponImageStates,C[33]=U,C[34]=G,C[35]=j,C[36]=W,C[37]=L):L=C[37],(0,a.useFrame)(L),null}function b(e){return e()}function x(){}function R(){return g.streamPlaybackStore.getState().time}function _(e){let t,a,r=(0,n.c)(7),{shapeName:o,eyeOffsetRef:l}=e,u=(0,c.useStaticShape)(o);return r[0]!==l||r[1]!==u.animations||r[2]!==u.scene?(t=()=>{let e=(0,s.getPosedNodeTransform)(u.scene,u.animations,"Eye");e?l.current.set(e.position.z,e.position.y,-e.position.x):l.current.set(0,s.DEFAULT_EYE_HEIGHT,0)},r[0]=l,r[1]=u.animations,r[2]=u.scene,r[3]=t):t=r[3],r[4]!==l||r[5]!==u?(a=[u,l],r[4]=l,r[5]=u,r[6]=a):a=r[6],(0,i.useEffect)(t,a),null}e.s(["PlayerEyeOffset",()=>_,"PlayerModel",()=>I],9721)}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/2677e6a5750bb60c.js b/docs/_next/static/chunks/2677e6a5750bb60c.js deleted file mode 100644 index 89891d1f..00000000 --- a/docs/_next/static/chunks/2677e6a5750bb60c.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,60505,e=>{"use strict";var t=e.i(932),r=e.i(71645),n=e.i(71753),c=e.i(15080),i=e.i(90072),o=e.i(12631),a=e.i(12781),u=e.i(58647),l=e.i(93784),m=e.i(5729),s=e.i(79123),d=e.i(51475),p=e.i(89119);let v=1/d.TICK_RATE,y=new i.Vector3,E=new i.Vector3;function h(){let e,i,h,g,f,S,w,T,b,P,M,_,L,O,R=(0,t.c)(27),{adapter:I,gameStatus:A,sendMove:C}=(0,a.useLiveConnection)(),k=(0,u.useEngineStoreApi)(),{speedMultiplier:K}=(0,s.useControls)(),z=(0,r.useRef)(null),{gl:X}=(0,c.useThree)(),[,Y]=(0,o.useKeyboardControls)(),N=(0,r.useRef)(0),x=(0,r.useRef)(0);R[0]===Symbol.for("react.memo_cache_sentinel")?(e={yaw:0,pitch:0,prevYaw:0,prevPitch:0,initialized:!1,lastSyncedCamera:null},R[0]=e):e=R[0];let H=(0,r.useRef)(e),D=(0,r.useRef)(0);return R[1]!==I||R[2]!==A||R[3]!==k?(i=()=>{I&&("connected"===A||"authenticating"===A)?z.current!==I&&(console.log("[LiveObserver] wiring adapter to engine store"),k.getState().setRecording({source:"live",duration:1/0,missionName:null,gameType:null,streamingPlayback:I}),k.getState().setPlaybackStatus("playing"),z.current=I,H.current.initialized=!1,H.current.lastSyncedCamera=null):!I&&z.current&&(k.getState().setRecording(null),z.current=null,H.current.initialized=!1)},h=[I,A,k],R[1]=I,R[2]=A,R[3]=k,R[4]=i,R[5]=h):(i=R[4],h=R[5]),(0,r.useEffect)(i,h),R[6]!==X.domElement?(g=()=>{let e=!1,t=t=>{document.pointerLockElement?(N.current=N.current+.002*t.movementX,x.current=x.current+.002*t.movementY):e&&(N.current=N.current+t.movementX*m.MOUSE_SENSITIVITY,x.current=x.current+t.movementY*m.MOUSE_SENSITIVITY)},r=t=>{document.pointerLockElement||t.target!==X.domElement||(e=!0)},n=()=>{e=!1};return document.addEventListener("mousemove",t),document.addEventListener("mousedown",r),document.addEventListener("mouseup",n),()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mousedown",r),document.removeEventListener("mouseup",n)}},f=[X.domElement],R[6]=X.domElement,R[7]=g,R[8]=f):(g=R[7],f=R[8]),(0,r.useEffect)(g,f),R[9]===Symbol.for("react.memo_cache_sentinel")?(S=()=>{let e=e=>{document.pointerLockElement&&z.current&&(e.stopImmediatePropagation(),z.current.cycleObserveNext())};return document.addEventListener("click",e,{capture:!0}),()=>{document.removeEventListener("click",e,{capture:!0})}},R[9]=S):S=R[9],R[10]!==X.domElement?(w=[X.domElement],R[10]=X.domElement,R[11]=w):w=R[11],(0,r.useEffect)(S,w),R[12]===Symbol.for("react.memo_cache_sentinel")?(T=()=>{let e=e=>{if("KeyO"!==e.code||e.metaKey||e.ctrlKey||e.altKey)return;let t=e.target;"INPUT"===t.tagName||"TEXTAREA"===t.tagName||t.isContentEditable||z.current&&(z.current.toggleObserverMode(),console.log(`[LiveObserver] observer mode: ${z.current.observerMode}`))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},b=[],R[12]=T,R[13]=b):(T=R[12],b=R[13]),(0,r.useEffect)(T,b),R[14]!==A||R[15]!==Y?(P=(e,t)=>{if(!z.current||"connected"!==A)return;let{lookUp:r,lookDown:n,lookLeft:c,lookRight:i}=Y();i&&(N.current=N.current+m.ARROW_LOOK_SPEED*t),c&&(N.current=N.current-m.ARROW_LOOK_SPEED*t),n&&(x.current=x.current+m.ARROW_LOOK_SPEED*t),r&&(x.current=x.current-m.ARROW_LOOK_SPEED*t)},R[14]=A,R[15]=Y,R[16]=P):P=R[16],(0,n.useFrame)(P),R[17]!==A||R[18]!==Y||R[19]!==C||R[20]!==K?(M=()=>{if(!z.current||"connected"!==A)return;let{forward:e,backward:t,left:r,right:n,up:c,down:i}=Y(),o=0,a=0,u=0;e&&(a=1),t&&(a-=1),r&&(o=-1),n&&(o+=1),c&&(u=1),i&&(u-=1);let l=N.current,m=x.current;N.current=0,x.current=0;let s=H.current;s.prevYaw=s.yaw,s.prevPitch=s.pitch,s.yaw=s.yaw+l,s.pitch=Math.max(-p.MAX_PITCH,Math.min(p.MAX_PITCH,s.pitch+m)),D.current=0;let d=Math.min(1,K);C({x:o*d,y:a*d,z:u*d,yaw:l,pitch:m,roll:0,trigger:[!1,!1,!1,!1,!1,!1],freeLook:!1})},R[17]=A,R[18]=Y,R[19]=C,R[20]=K,R[21]=M):M=R[21],(0,d.useTick)(M),R[22]!==A?(_=(e,t)=>{if(!z.current||"connected"!==A)return;let r=H.current,n=z.current.getSnapshot(),c=n?.camera;if(c&&c!==r.lastSyncedCamera&&"number"==typeof c.yaw&&"number"==typeof c.pitch){let e=N.current,t=x.current;r.prevYaw=r.initialized?r.yaw:c.yaw,r.prevPitch=r.initialized?r.pitch:c.pitch,r.yaw=c.yaw+e,r.pitch=Math.max(-p.MAX_PITCH,Math.min(p.MAX_PITCH,c.pitch+t)),r.lastSyncedCamera=c,r.initialized=!0}if(!r.initialized)return;D.current=D.current+t;let i=Math.min(1,D.current/v),o=r.prevYaw+(r.yaw-r.prevYaw)*i+N.current,a=Math.max(-p.MAX_PITCH,Math.min(p.MAX_PITCH,r.prevPitch+(r.pitch-r.prevPitch)*i+x.current)),[u,m,s,d]=(0,p.yawPitchToQuaternion)(o,a);if(c?.mode==="third-person"&&c.orbitTargetId){let t=l.streamPlaybackStore.getState().root,r=t?.children.find(e=>e.name===c.orbitTargetId);if(r){E.copy(r.position);let t=l.streamPlaybackStore.getState().entities.get(c.orbitTargetId);t?.renderType==="Player"&&(E.y=E.y+1);let n=Math.sin(a),i=Math.cos(a),u=Math.sin(o),m=Math.cos(o);if(y.set(-i,-u*n,-m*n),y.lengthSq()>1e-8){y.normalize();let t=Math.max(.1,c.orbitDistance??4);e.camera.position.copy(E).addScaledVector(y,t),e.camera.lookAt(E)}}}else e.camera.quaternion.set(u,m,s,d)},R[22]=A,R[23]=_):_=R[23],(0,n.useFrame)(_),R[24]!==k?(L=()=>()=>{z.current&&(k.getState().setRecording(null),z.current=null)},O=[k],R[24]=k,R[25]=L,R[26]=O):(L=R[25],O=R[26]),(0,r.useEffect)(L,O),null}e.s(["LiveObserver",()=>h])}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/0c29da8d7ee18a67.js b/docs/_next/static/chunks/3fc0c5e684385765.js similarity index 57% rename from docs/_next/static/chunks/0c29da8d7ee18a67.js rename to docs/_next/static/chunks/3fc0c5e684385765.js index ba05abd0..538faae9 100644 --- a/docs/_next/static/chunks/0c29da8d7ee18a67.js +++ b/docs/_next/static/chunks/3fc0c5e684385765.js @@ -1,4 +1,4 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,21500,e=>{"use strict";var t=e.i(43476),i=e.i(932),r=e.i(32865),a=e.i(71645),o=e.i(71753),n=e.i(78140),l=e.i(90072),s=e.i(85557),c=e.i(12979),u=e.i(15080),d=e.i(75567);let m=Math.PI/180,p=Math.PI/18e4;function f(e,t,i){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:i}function h(e,t,i){let r=e[t];return"boolean"==typeof r?r:"number"==typeof r?0!==r:i}function g(e,t){let i,r=e.particles;if(Array.isArray(r)){for(let e of r)if("number"==typeof e&&(i=t(e)))break}return i?{ejectionPeriodMS:f(e,"ejectionPeriodMS",100),periodVarianceMS:f(e,"periodVarianceMS",0),ejectionVelocity:.01*f(e,"ejectionVelocity",200),velocityVariance:.01*f(e,"velocityVariance",100),ejectionOffset:.01*f(e,"ejectionOffset",0),thetaMin:f(e,"thetaMin",0),thetaMax:f(e,"thetaMax",90),phiReferenceVel:f(e,"phiReferenceVel",0),phiVariance:f(e,"phiVariance",360),overrideAdvances:h(e,"overrideAdvances",!1),orientParticles:h(e,"orientParticles",!1),orientOnVelocity:h(e,"orientOnVelocity",!0),lifetimeMS:f(e,"lifetimeMS",0)<<5,lifetimeVarianceMS:f(e,"lifetimeVarianceMS",0)<<5,particles:function(e){let t=e.keys,i=[];if(Array.isArray(t)&&t.length>0)for(let e=0;e0&&t[0]&&(r=t[0])}return{dragCoefficient:5*f(e,"dragCoefficient",0),windCoefficient:f(e,"windCoefficient",1),gravityCoefficient:10*f(e,"gravityCoefficient",0),inheritedVelFactor:f(e,"inheritedVelFactor",0),constantAcceleration:f(e,"constantAcceleration",0),lifetimeMS:f(e,"lifetimeMS",31)<<5,lifetimeVarianceMS:f(e,"lifetimeVarianceMS",0)<<5,spinSpeed:f(e,"spinSpeed",0),spinRandomMin:f(e,"spinRandomMin",1e3)+-1e3,spinRandomMax:f(e,"spinRandomMax",1e3)+-1e3,useInvAlpha:h(e,"useInvAlpha",!1),keys:i,textureName:r}}(i)}:null}function y(e,t){return e+(2*Math.random()-1)*t}function S(e,t,i,r,a,o,n){let l=Math.cos(n),s=Math.sin(n),c=e*r+t*a+i*o;return[e*l+(a*i-o*t)*s+r*c*(1-l),t*l+(o*e-r*i)*s+a*c*(1-l),i*l+(r*t-a*e)*s+o*c*(1-l)]}class b{data;particles=[];maxParticles;internalClock=0;nextParticleTime=0;emitterAge=0;emitterLifetime;emitterDead=!1;constructor(e,t=256,i){this.data=e,this.maxParticles=t;let r=i??e.lifetimeMS;!i&&e.lifetimeVarianceMS>0&&(r+=Math.round(y(0,e.lifetimeVarianceMS))),this.emitterLifetime=r}emitBurst(e,t,i=[0,0,1]){for(let r=0;r0;){if(this.nextParticleTime>0){let e=Math.min(r,this.nextParticleTime);this.nextParticleTime-=e,r-=e,this.internalClock+=e;continue}if(this.particles.length0)){let e=this.particles[this.particles.length-1];e.currentAge+=r,e.currentAge>=e.totalLifetime&&this.particles.pop()}let t=this.data.ejectionPeriodMS;this.data.periodVarianceMS>0&&(t+=Math.round(y(0,this.data.periodVarianceMS))),this.nextParticleTime=Math.max(1,t)}}update(e){this.emitterAge+=e,this.emitterLifetime>0&&this.emitterAge>this.emitterLifetime&&(this.emitterDead=!0);let t=e/1e3,i=this.data.particles;for(let r=this.particles.length-1;r>=0;r--){let a=this.particles[r];if(a.currentAge+=e,a.currentAge>=a.totalLifetime){this.particles[r]=this.particles[this.particles.length-1],this.particles.pop();continue}let o=i.dragCoefficient,n=i.gravityCoefficient,l=a.acc[0]-a.vel[0]*o,s=a.acc[1]-a.vel[1]*o,c=a.acc[2]-a.vel[2]*o+-9.81*n;a.vel[0]+=l*t,a.vel[1]+=s*t,a.vel[2]+=c*t,a.pos[0]+=a.vel[0]*t,a.pos[1]+=a.vel[1]*t,a.pos[2]+=a.vel[2]*t;let u=a.currentAge/a.totalLifetime,d=function(e,t){for(let i=1;i=t){let r=e[i-1],a=e[i],o=a.time-r.time,n=o>0?(t-r.time)/o:0;return{r:r.r+(a.r-r.r)*n,g:r.g+(a.g-r.g)*n,b:r.b+(a.b-r.b)*n,a:r.a+(a.a-r.a)*n,size:r.size+(a.size-r.size)*n}}let i=e[e.length-1];return{r:i.r,g:i.g,b:i.b,a:i.a,size:i.size}}(i.keys,u);a.r=d.r,a.g=d.g,a.b=d.b,a.a=d.a,a.size=d.size,a.currentSpin=a.spinSpeed*a.currentAge*p}}isDead(){return this.emitterDead&&0===this.particles.length}kill(){this.emitterDead=!0}addParticle(e,t){var i,r,a,o;let n,l,s,c,u=this.data,d=u.particles,p=t[0],f=t[1],h=t[2],g=(i=p,r=f,.9>Math.abs(a=h)?(n=r,l=-i,s=0):(n=-a,l=0,s=i),(c=Math.sqrt(n*n+l*l+s*s))<1e-8?[1,0,0]:[n/c,l/c,s/c]),b=(u.thetaMin+Math.random()*(u.thetaMax-u.thetaMin))*m,v=(this.internalClock/1e3*u.phiReferenceVel+Math.random()*u.phiVariance)*m;[p,f,h]=S(p,f,h,g[0],g[1],g[2],b),[p,f,h]=S(p,f,h,t[0],t[1],t[2],v);let M=Math.sqrt(p*p+f*f+h*h);M>1e-8&&(p/=M,f/=M,h/=M);let x=y(u.ejectionVelocity,u.velocityVariance),w=[e[0]+p*u.ejectionOffset,e[1]+f*u.ejectionOffset,e[2]+h*u.ejectionOffset],A=[p*x,f*x,h*x],T=d.constantAcceleration,P=[A[0]*T,A[1]*T,A[2]*T],k=d.lifetimeMS;d.lifetimeVarianceMS>0&&(k+=Math.round(y(0,d.lifetimeVarianceMS))),k=Math.max(1,k);let C=d.spinSpeed+((o=d.spinRandomMin)+Math.random()*(d.spinRandomMax-o)),I=d.keys[0];this.particles.push({pos:w,vel:A,acc:P,orientDir:[p,f,h],currentAge:0,totalLifetime:k,dataIndex:0,spinSpeed:C,currentSpin:0,r:I.r,g:I.g,b:I.b,a:I.a,size:I.size})}}let v=` +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,53272,e=>{"use strict";var t=e.i(43476),i=e.i(932),r=e.i(32865),a=e.i(71645),n=e.i(71753),o=e.i(78140),l=e.i(90072),s=e.i(85557),c=e.i(12979),u=e.i(15080),d=e.i(75567);let m=Math.PI/180,p=Math.PI/18e4;function f(e,t,i){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:i}function h(e,t,i){let r=e[t];return"boolean"==typeof r?r:"number"==typeof r?0!==r:i}function g(e,t){let i,r=e.particles;if(Array.isArray(r)){for(let e of r)if("number"==typeof e&&(i=t(e)))break}return i?{ejectionPeriodMS:f(e,"ejectionPeriodMS",100),periodVarianceMS:f(e,"periodVarianceMS",0),ejectionVelocity:.01*f(e,"ejectionVelocity",200),velocityVariance:.01*f(e,"velocityVariance",100),ejectionOffset:.01*f(e,"ejectionOffset",0),thetaMin:f(e,"thetaMin",0),thetaMax:f(e,"thetaMax",90),phiReferenceVel:f(e,"phiReferenceVel",0),phiVariance:f(e,"phiVariance",360),overrideAdvances:h(e,"overrideAdvances",!1),orientParticles:h(e,"orientParticles",!1),orientOnVelocity:h(e,"orientOnVelocity",!0),lifetimeMS:f(e,"lifetimeMS",0)<<5,lifetimeVarianceMS:f(e,"lifetimeVarianceMS",0)<<5,particles:function(e){let t=e.keys,i=[];if(Array.isArray(t)&&t.length>0)for(let e=0;e0&&t[0]&&(r=t[0])}return{dragCoefficient:5*f(e,"dragCoefficient",0),windCoefficient:f(e,"windCoefficient",1),gravityCoefficient:10*f(e,"gravityCoefficient",0),inheritedVelFactor:f(e,"inheritedVelFactor",0),constantAcceleration:f(e,"constantAcceleration",0),lifetimeMS:f(e,"lifetimeMS",31)<<5,lifetimeVarianceMS:f(e,"lifetimeVarianceMS",0)<<5,spinSpeed:f(e,"spinSpeed",0),spinRandomMin:f(e,"spinRandomMin",1e3)+-1e3,spinRandomMax:f(e,"spinRandomMax",1e3)+-1e3,useInvAlpha:h(e,"useInvAlpha",!1),keys:i,textureName:r}}(i)}:null}function y(e,t){return e+(2*Math.random()-1)*t}function S(e,t,i,r,a,n,o){let l=Math.cos(o),s=Math.sin(o),c=e*r+t*a+i*n;return[e*l+(a*i-n*t)*s+r*c*(1-l),t*l+(n*e-r*i)*s+a*c*(1-l),i*l+(r*t-a*e)*s+n*c*(1-l)]}class b{data;particles=[];maxParticles;internalClock=0;nextParticleTime=0;emitterAge=0;emitterLifetime;emitterDead=!1;constructor(e,t=256,i){this.data=e,this.maxParticles=t;let r=i??e.lifetimeMS;!i&&e.lifetimeVarianceMS>0&&(r+=Math.round(y(0,e.lifetimeVarianceMS))),this.emitterLifetime=r}emitBurst(e,t,i=[0,0,1]){for(let r=0;r0;){if(this.nextParticleTime>0){let e=Math.min(r,this.nextParticleTime);this.nextParticleTime-=e,r-=e,this.internalClock+=e;continue}if(this.particles.length0)){let e=this.particles[this.particles.length-1];e.currentAge+=r,e.currentAge>=e.totalLifetime&&this.particles.pop()}let t=this.data.ejectionPeriodMS;this.data.periodVarianceMS>0&&(t+=Math.round(y(0,this.data.periodVarianceMS))),this.nextParticleTime=Math.max(1,t)}}update(e){this.emitterAge+=e,this.emitterLifetime>0&&this.emitterAge>this.emitterLifetime&&(this.emitterDead=!0);let t=e/1e3,i=this.data.particles;for(let r=this.particles.length-1;r>=0;r--){let a=this.particles[r];if(a.currentAge+=e,a.currentAge>=a.totalLifetime){this.particles[r]=this.particles[this.particles.length-1],this.particles.pop();continue}let n=i.dragCoefficient,o=i.gravityCoefficient,l=a.acc[0]-a.vel[0]*n,s=a.acc[1]-a.vel[1]*n,c=a.acc[2]-a.vel[2]*n+-9.81*o;a.vel[0]+=l*t,a.vel[1]+=s*t,a.vel[2]+=c*t,a.pos[0]+=a.vel[0]*t,a.pos[1]+=a.vel[1]*t,a.pos[2]+=a.vel[2]*t;let u=a.currentAge/a.totalLifetime,d=function(e,t){for(let i=1;i=t){let r=e[i-1],a=e[i],n=a.time-r.time,o=n>0?(t-r.time)/n:0;return{r:r.r+(a.r-r.r)*o,g:r.g+(a.g-r.g)*o,b:r.b+(a.b-r.b)*o,a:r.a+(a.a-r.a)*o,size:r.size+(a.size-r.size)*o}}let i=e[e.length-1];return{r:i.r,g:i.g,b:i.b,a:i.a,size:i.size}}(i.keys,u);a.r=d.r,a.g=d.g,a.b=d.b,a.a=d.a,a.size=d.size,a.currentSpin=a.spinSpeed*a.currentAge*p}}isDead(){return this.emitterDead&&0===this.particles.length}kill(){this.emitterDead=!0}addParticle(e,t){var i,r,a,n;let o,l,s,c,u=this.data,d=u.particles,p=t[0],f=t[1],h=t[2],g=(i=p,r=f,.9>Math.abs(a=h)?(o=r,l=-i,s=0):(o=-a,l=0,s=i),(c=Math.sqrt(o*o+l*l+s*s))<1e-8?[1,0,0]:[o/c,l/c,s/c]),b=(u.thetaMin+Math.random()*(u.thetaMax-u.thetaMin))*m,v=(this.internalClock/1e3*u.phiReferenceVel+Math.random()*u.phiVariance)*m;[p,f,h]=S(p,f,h,g[0],g[1],g[2],b),[p,f,h]=S(p,f,h,t[0],t[1],t[2],v);let M=Math.sqrt(p*p+f*f+h*h);M>1e-8&&(p/=M,f/=M,h/=M);let x=y(u.ejectionVelocity,u.velocityVariance),w=[e[0]+p*u.ejectionOffset,e[1]+f*u.ejectionOffset,e[2]+h*u.ejectionOffset],A=[p*x,f*x,h*x],T=d.constantAcceleration,P=[A[0]*T,A[1]*T,A[2]*T],k=d.lifetimeMS;d.lifetimeVarianceMS>0&&(k+=Math.round(y(0,d.lifetimeVarianceMS))),k=Math.max(1,k);let C=d.spinSpeed+((n=d.spinRandomMin)+Math.random()*(d.spinRandomMax-n)),I=d.keys[0];this.particles.push({pos:w,vel:A,acc:P,orientDir:[p,f,h],currentAge:0,totalLifetime:k,dataIndex:0,spinSpeed:C,currentSpin:0,r:I.r,g:I.g,b:I.b,a:I.a,size:I.size})}}let v=` // 'position' is auto-declared by Three.js for ShaderMaterial. attribute vec4 particleColor; attribute float particleSize; @@ -86,4 +86,4 @@ void main() { vec4 tex = texture2D(uTexture, vUV); gl_FragColor = vec4(vColor.rgb * tex.rgb, vColor.a * tex.a); } -`;function O(e){let t=(e+1)*2,i=new Float32Array(3*t),r=new Float32Array(2*t),a=new Float32Array(4*t),o=new Uint16Array(6*e);for(let t=0;t{let i=Y.current,r=k.current;if(!i||!r)return;let a=T.engineStore.getState().playback,o="playing"===a.status,n=o?t*a.rate:0,s=1e3*n,u=P.getDataBlockData.bind(P);for(let e of r.entities){if("Explosion"!==e.type||!e.explosionDataBlockId||!e.position||X.current.has(e.id))continue;X.current.add(e.id);let t=function(e,t){let i=t(e);if(!i)return null;let r=[],a=[],o=i.particleEmitter;if("number"==typeof o){let e=t(o);if(e){let a=g(e,t);if(a){let e=i.particleDensity??10;r.push({data:a,density:e})}}}let n=i.emitters;if(Array.isArray(n))for(let e of n){if("number"!=typeof e)continue;let i=t(e);if(!i)continue;let r=g(i,t);r&&a.push(r)}return 0===r.length&&0===a.length?null:{burstEmitters:r,streamingEmitters:a,lifetimeMS:32*(i.lifetimeMS??31)}}(e.explosionDataBlockId,u);if(!t)continue;let r=[...e.position];for(let e of t.burstEmitters){let t=new b(e.data,256);t.emitBurst(r,e.density);let a=B(e.data.particles.textureName),o=U(256),n=q(a,e.data.particles.useInvAlpha,e.data.orientParticles),s=new l.Mesh(o,n);s.frustumCulled=!1,i.add(s),Q.current.push({emitter:t,mesh:s,geometry:o,material:n,targetTexture:a,origin:r,isBurst:!0,hasBurst:!0})}for(let e of t.streamingEmitters){let a=new b(e,256,t.lifetimeMS),o=B(e.particles.textureName),n=U(256),s=q(o,e.particles.useInvAlpha,e.orientParticles),c=new l.Mesh(n,s);c.frustumCulled=!1,i.add(c),Q.current.push({emitter:a,mesh:c,geometry:n,material:s,targetTexture:o,origin:r,isBurst:!1,hasBurst:!1})}let a=u(e.explosionDataBlockId);if(I){let o=a?function(e){let t=e.sizes;if(Array.isArray(t)&&t.length>0){let e=0;for(let i of t)e=Math.max(e,i.x,i.y,i.z);if(e>0)return e/1e3}let i=e.particleRadius;return"number"==typeof i&&i>0?i:5}(a):5,n=function(e){if(!e)return 0xff00ff;let t=e.toLowerCase();return t.includes("disc")?4491519:t.includes("grenade")?0xff8800:t.includes("mortar")?0xff4400:t.includes("plasma")?4521796:t.includes("laser")?0xff2222:t.includes("blaster")?0xffff00:t.includes("missile")?0xff6600:t.includes("bomb")?0xff0000:t.includes("mine")?0xff8844:t.includes("concussion")?0xffaa00:t.includes("shocklance")?8930559:t.includes("chaingun")||t.includes("bullet")?0xcccccc:0xff00ff}(e.dataBlock),s=new l.MeshBasicMaterial({color:n,wireframe:!0,transparent:!0,opacity:1,depthWrite:!1}),c=new l.Mesh(F,s);c.frustumCulled=!1,c.scale.setScalar(o),c.position.set(r[1],r[2],r[0]),i.add(c);let{sprite:u,material:d}=function(e,t){let i=document.createElement("canvas"),r=i.getContext("2d");r.font="bold 32px monospace",i.width=Math.ceil(r.measureText(e).width)+16,i.height=48,r.font="bold 32px monospace",r.fillStyle=`#${t.toString(16).padStart(6,"0")}`,r.textBaseline="middle",r.fillText(e,8,i.height/2);let a=new l.CanvasTexture(i),o=new l.SpriteMaterial({map:a,transparent:!0,depthTest:!1,depthWrite:!1}),n=new l.Sprite(o),s=i.width/i.height;return n.scale.set(2*s,2,1),{sprite:n,material:o}}(`${e.id}: ${e.dataBlock??`expId:${e.explosionDataBlockId}`}`,n);u.position.set(r[1],r[2]+o+2,r[0]),u.frustumCulled=!1,i.add(u),et.current.push({entityId:e.id,mesh:c,material:s,label:u,labelMaterial:d,creationTime:(0,T.effectNow)(),lifetimeMS:Math.max(t.lifetimeMS,3e3),targetRadius:o})}let o=a?.shockwave;if("number"==typeof o){let t=function(e,t){let i=t(e);if(!i)return null;let r=i.colors??[],a=i.times??[0,.5,1,1];return{width:i.width??1,numSegments:Math.max(i.numSegments??16,4),velocity:i.velocity??0,height:i.height??0,verticalCurve:i.verticalCurve??0,acceleration:i.acceleration??0,texWrap:i.texWrap??1,lifetimeMS:i.lifetimeMS??500,is2D:!!i.is2D,renderSquare:!!i.renderSquare,renderBottom:!!i.renderBottom,mapToTerrain:!!i.mapToTerrain,colors:r,times:a,textureName:i.textureName??"",mapToTexture:i.mapToTexture??""}}(o,u);if(t){let a=B(t.textureName),o=O(t.numSegments),n=new l.ShaderMaterial({vertexShader:N,fragmentShader:_,uniforms:{uTexture:{value:a}},transparent:!0,depthWrite:!1,blending:l.AdditiveBlending,side:l.DoubleSide}),s=new l.Mesh(o,n);s.frustumCulled=!1,s.position.set(r[1],r[2],r[0]),i.add(s);let c=null,u=null;t.renderBottom&&(u=O(t.numSegments),(c=new l.Mesh(u,n)).frustumCulled=!1,c.position.set(r[1],r[2],r[0]),c.scale.y=-1,i.add(c));let d=Math.abs(t.velocity)>1e-10?t.velocity:0;ei.current.push({entityId:e.id,mesh:s,bottomMesh:c,geometry:o,bottomGeometry:u,material:n,creationTime:(0,T.effectNow)(),lifetimeMS:t.lifetimeMS,data:t,radius:0,velocity:d})}}}let d=new Set;for(let e of r.entities){if(d.add(e.id),!e.maintainEmitterId||J.current.has(e.id))continue;J.current.add(e.id);let t=u(e.maintainEmitterId);if(!t)continue;let r=g(t,u);if(!r)continue;let a=e.position?[...e.position]:[0,0,0],o=new b(r,256),n=B(r.particles.textureName),s=U(256),c=q(n,r.particles.useInvAlpha,r.orientParticles),m=new l.Mesh(s,c);m.frustumCulled=!1,i.add(m),Q.current.push({emitter:o,mesh:m,geometry:s,material:c,targetTexture:n,origin:a,isBurst:!1,hasBurst:!1,followEntityId:e.id})}for(let e of Q.current)e.followEntityId&&!d.has(e.followEntityId)&&e.emitter.kill();for(let e of J.current)d.has(e)||J.current.delete(e);let m=Q.current;for(let e=m.length-1;e>=0;e--){let t=m[e];if(t.shaderChecked||(!function(e,t,i){let r=e.properties.get(t).currentProgram;if(!r)return;let a=r.program,o=e.getContext();o.getProgramParameter(a,o.LINK_STATUS)||console.error(`[ParticleFX] Shader LINK ERROR (${i}):`,o.getProgramInfoLog(a))}(K,t.material,t.isBurst?"burst":"stream"),t.shaderChecked=!0),t.followEntityId){let e=r.entities.find(e=>e.id===t.followEntityId);e?.position&&(t.origin[0]=e.position[0],t.origin[1]=e.position[1],t.origin[2]=e.position[2]),e?.direction&&(t.emitAxis=e.direction)}if(t.isBurst||t.emitter.emitPeriodic(t.origin,s,t.emitAxis),t.emitter.update(s),C.has(t.targetTexture)&&t.material.uniforms.particleTexture.value!==t.targetTexture&&(t.material.uniforms.particleTexture.value=t.targetTexture),t.material.uniforms.debugOpacity.value=I?.2:1,!function(e){let t=e.emitter.particles,i=e.geometry,r=i.getAttribute("position"),a=i.getAttribute("particleColor"),o=i.getAttribute("particleSize"),n=i.getAttribute("particleSpin"),l=i.getAttribute("orientDir"),s=r.array,c=a.array,u=o.array,d=n.array,m=l.array,p=Math.min(t.length,256),f=e.emitter.data.orientOnVelocity;for(let e=0;e=0;e--){let t=p[e],r=Math.min((f-t.creationTime)/t.lifetimeMS,1),a=Math.min(r/.1,1);t.mesh.scale.setScalar(t.targetRadius*a),t.material.opacity=1-r,t.labelMaterial.opacity=1-r,r>=1&&(i.remove(t.mesh),i.remove(t.label),t.material.dispose(),t.labelMaterial.dispose(),p.splice(e,1))}let h=ei.current;for(let t=h.length-1;t>=0;t--){let r=h[t],a=Math.min((f-r.creationTime)/r.lifetimeMS,1);r.velocity=r.velocity+r.data.acceleration*n,r.radius=r.radius+r.velocity*n;let o=function(e,t){let{colors:i,times:r}=e;if(0===i.length)return[1,1,1,1];let a=0;for(let e=0;e=r[e]&&(a=e);let o=Math.min(a+1,i.length-1),n=r[a]??0,l=(r[o]??1)-n,s=l>0?Math.min((t-n)/l,1):0,c=i[a]??i[0],u=i[o]??i[0];return[c.r+(u.r-c.r)*s,c.g+(u.g-c.g)*s,c.b+(u.b-c.b)*s,c.a+(u.a-c.a)*s]}(r.data,a);z(r.geometry,r.data,r.radius,o,r.data.is2D),r.bottomGeometry&&z(r.bottomGeometry,r.data,r.radius,o,r.data.is2D),r.data.is2D&&r.mesh.lookAt(e.camera.position),a>=1&&(i.remove(r.mesh),r.bottomMesh&&i.remove(r.bottomMesh),r.geometry.dispose(),r.bottomGeometry?.dispose(),r.material.dispose(),h.splice(t,1))}if(o&&j&&H&&$&&Y.current){for(let e of r.entities){if("Explosion"!==e.type||!e.explosionDataBlockId||!e.position)continue;let t=`snd:${e.id}`;if(ee.current.has(t))continue;ee.current.add(t);let i=u(e.explosionDataBlockId);if(!i)continue;let r=i.soundProfile;if("number"!=typeof r)continue;let a=(0,A.resolveAudioProfile)(r,u);if(!a)continue;let o=new l.Vector3(e.position[1],e.position[2],e.position[0]);(0,A.playOneShotSound)(a,$,H,o,Y.current)}let e=Z.current;for(let t of r.entities){if("Projectile"!==t.type||!t.dataBlockId||!t.position)continue;if(e.has(t.id)){e.get(t.id).position.set(t.position[1],t.position[2],t.position[0]);continue}if(e.size>=20)continue;let i=u(t.dataBlockId);if(!i)continue;let r=i.sound;if("number"!=typeof r)continue;let o=(0,A.resolveAudioProfile)(r,u);if(o&&o.isLooping&&o.is3D)try{let i=(0,c.audioToUrl)(o.filename),r=(0,A.getSoundGeneration)();(0,A.getCachedAudioBuffer)(i,H,i=>{if(r!==(0,A.getSoundGeneration)()||!d.has(t.id)||e.has(t.id))return;let n=Y.current;if(!n)return;let s=new l.PositionalAudio($);s.setBuffer(i),s.setDistanceModel("inverse"),s.setRefDistance(o.refDist),s.setMaxDistance(o.maxDist),s.setRolloffFactor(1),s.setVolume(o.volume),s.setPlaybackRate(a.rate),s.setLoop(!0),s.position.set(t.position[1],t.position[2],t.position[0]),n.add(s),(0,A.trackSound)(s),s.play(),e.set(t.id,s)})}catch{}}for(let[t,i]of e)if(!d.has(t)){(0,A.untrackSound)(i);try{i.stop()}catch{}try{i.disconnect()}catch{}Y.current?.remove(i),e.delete(t)}for(let e of r.audioEvents){let t=`${e.timeSec}:${e.profileId}:${e.position?.x??""}`;if(ee.current.has(t))continue;ee.current.add(t);let i=(0,A.resolveAudioProfile)(e.profileId,u);if(!i)continue;let r=e.position?new l.Vector3(e.position.y,e.position.z,e.position.x):void 0;(0,A.playOneShotSound)(i,$,H,r,Y.current)}}if(X.current.size>500){let e=new Set(r.entities.map(G));for(let t of X.current)e.has(t)||X.current.delete(t)}if(ee.current.size>500){let e=new Set(r.entities.map(L));for(let t of ee.current)t.startsWith("snd:")&&e.has(t.slice(4))||ee.current.delete(t)}},M[7]=j,M[8]=$,M[9]=H,M[10]=I,M[11]=K,M[12]=P,M[13]=k,M[14]=h):h=M[14],(0,o.useFrame)(h),M[15]===Symbol.for("react.memo_cache_sentinel")?(S=()=>()=>{let e=Y.current;for(let t of Q.current){if(e&&(e.remove(t.mesh),t.debugOriginMesh&&e.remove(t.debugOriginMesh),t.debugParticleMeshes))for(let i of t.debugParticleMeshes)e.remove(i);t.geometry.dispose(),t.material.dispose()}for(let t of(Q.current=[],et.current))e&&(e.remove(t.mesh),e.remove(t.label)),t.material.dispose(),t.labelMaterial.dispose();for(let t of(et.current=[],ei.current))e&&(e.remove(t.mesh),t.bottomMesh&&e.remove(t.bottomMesh)),t.geometry.dispose(),t.bottomGeometry?.dispose(),t.material.dispose();for(let[,t]of(ei.current=[],X.current.clear(),J.current.clear(),Z.current)){(0,A.untrackSound)(t);try{t.stop()}catch{}try{t.disconnect()}catch{}e&&e.remove(t)}Z.current.clear(),ee.current.clear()},y=[],M[15]=y,M[16]=S):(y=M[15],S=M[16]),(0,a.useEffect)(S,y),M[17]===Symbol.for("react.memo_cache_sentinel")?(v=(0,t.jsx)("group",{ref:Y}),M[17]=v):v=M[17],v}function L(e){return e.id}function G(e){return e.id}function W(e){return e.gl}var H=e.i(9721),$=e.i(92224),K=e.i(93784);function Y(e,t){return{id:e.id,className:e.className??e.type,ghostIndex:e.ghostIndex,dataBlockId:e.dataBlockId,shapeHint:e.shapeHint,spawnTime:t,position:e.position,rotation:e.rotation,velocity:e.velocity,keyframes:[{time:t??0,position:e.position??[0,0,0],rotation:e.rotation??[0,0,0,1]}]}}var Q=e.i(77964);let X=new WeakMap;function J(e){let t=X.get(e);return t||(t=new Map(e.entities.map(e=>[e.id,e])),X.set(e,t)),t}let Z=new l.Vector3,ee=new l.Quaternion,et=new l.Quaternion,ei=new l.Quaternion(0,1,0,0),er=new l.Vector3,ea=new l.Vector3,eo=new l.Vector3;function en(e){let r,u,d,m,p,f,h,g,y,S=(0,i.c)(19),{recording:b}=e,v=(0,T.useEngineStoreApi)(),M=(0,a.useRef)(0),x=(0,a.useRef)(null),w=(0,a.useRef)(null);S[0]===Symbol.for("react.memo_cache_sentinel")?(r=new l.Vector3(0,s.DEFAULT_EYE_HEIGHT,0),S[0]=r):r=S[0];let P=(0,a.useRef)(r),k=(0,a.useRef)(b.streamingPlayback??null),C=(0,a.useRef)(null);S[1]===Symbol.for("react.memo_cache_sentinel")?(u=new Map,S[1]=u):u=S[1];let I=(0,a.useRef)(u),B=(0,a.useRef)(null),[D,E]=(0,a.useState)(null);S[2]===Symbol.for("react.memo_cache_sentinel")?(d=e=>{if(e===B.current)return;B.current=e;let t=I.current,i=new Map,r=!1;for(let o of e.entities){let n=t.get(o.id);if(n&&n.className===(o.className??o.type)&&n.ghostIndex===o.ghostIndex&&n.dataBlockId===o.dataBlockId&&n.shapeHint===o.shapeHint&&n.shapeName===o.dataBlock&&("Player"===n.renderType||n.weaponShape===o.weaponShape)){var a=n;switch(a.renderType){case"Player":a.threads=o.threads,a.weaponShape=o.weaponShape,a.weaponImageState=o.weaponImageState,a.weaponImageStates=o.weaponImageStates,a.playerName=o.playerName,a.iffColor=o.iffColor,a.headPitch=o.headPitch,a.headYaw=o.headYaw,a.targetRenderFlags=o.targetRenderFlags;break;case"Shape":a.threads=o.threads,a.targetRenderFlags=o.targetRenderFlags,a.iffColor=o.iffColor}}else n=function(e,t){if(e.sceneData){let i={id:e.id,className:e.className??e.type,ghostIndex:e.ghostIndex,dataBlockId:e.dataBlockId,shapeHint:e.shapeHint,spawnTime:t};switch(e.sceneData.className){case"TerrainBlock":return{...i,renderType:"TerrainBlock",terrainData:e.sceneData};case"InteriorInstance":return{...i,renderType:"InteriorInstance",interiorData:e.sceneData};case"Sky":return{...i,renderType:"Sky",skyData:e.sceneData};case"Sun":return{...i,renderType:"Sun",sunData:e.sceneData};case"WaterBlock":return{...i,renderType:"WaterBlock",waterData:e.sceneData};case"MissionArea":return{...i,renderType:"MissionArea",missionAreaData:e.sceneData};case"TSStatic":return{...Y(e,t),renderType:"Shape",shapeName:e.sceneData.shapeName,shapeType:"TSStatic",dataBlock:e.dataBlock}}}return e.visual?.kind==="tracer"?{...Y(e,t),renderType:"Tracer",visual:e.visual,dataBlock:e.dataBlock,direction:e.direction}:e.visual?.kind==="sprite"?{...Y(e,t),renderType:"Sprite",visual:e.visual}:"Player"===e.type?{...Y(e,t),renderType:"Player",shapeName:e.dataBlock,dataBlock:e.dataBlock,weaponShape:e.weaponShape,playerName:e.playerName,iffColor:e.iffColor,threads:e.threads,weaponImageState:e.weaponImageState,weaponImageStates:e.weaponImageStates,headPitch:e.headPitch,headYaw:e.headYaw,targetRenderFlags:e.targetRenderFlags}:"Explosion"===e.type?{...Y(e,t),renderType:"Explosion",shapeName:e.dataBlock,dataBlock:e.dataBlock,explosionDataBlockId:e.explosionDataBlockId,faceViewer:e.faceViewer}:"ForceFieldBare"===e.className?{...Y(e,t),renderType:"ForceFieldBare"}:"AudioEmitter"===e.className?{...Y(e,t),renderType:"AudioEmitter",audioFileName:e.audioFileName,audioVolume:e.audioVolume,audioIs3D:e.audioIs3D,audioIsLooping:e.audioIsLooping??!0,audioMinDistance:e.audioMinDistance,audioMaxDistance:e.audioMaxDistance,audioMinLoopGap:e.audioMinLoopGap,audioMaxLoopGap:e.audioMaxLoopGap}:"WayPoint"===e.className?{...Y(e,t),renderType:"WayPoint",label:e.label}:"Camera"===e.className?{...Y(e,t),renderType:"Camera"}:{...Y(e,t),renderType:"Shape",shapeName:e.dataBlock,shapeType:"Turret"===e.className?"Turret":"Item"===e.className?"Item":"StaticShape",dataBlock:e.dataBlock,weaponShape:e.weaponShape,threads:e.threads,targetRenderFlags:e.targetRenderFlags,iffColor:e.iffColor}}(o,e.timeSec),r=!0;if(i.set(o.id,n),(0,Q.isSceneEntity)(n)||"None"===n.renderType)continue;let l=n.keyframes;0===l.length&&l.push({time:e.timeSec,position:o.position??[0,0,0],rotation:o.rotation??[0,0,0,1]});let s=l[0];s.time=e.timeSec,o.position&&(s.position=o.position),o.rotation&&(s.rotation=o.rotation),s.velocity=o.velocity,s.health=o.health,s.energy=o.energy,s.actionAnim=o.actionAnim,s.actionAtEnd=o.actionAtEnd,s.damageState=o.damageState}for(let[a,o]of t)if(!i.has(a)){if("Explosion"===o.renderType&&o.shapeName&&null!=o.spawnTime&&e.timeSec-o.spawnTime<5){i.set(a,o);continue}r=!0}i.size!==t.size&&(r=!0),I.current=i,r&&$.gameEntityStore.getState().setAllStreamEntities(Array.from(i.values()));let o=null;if(e.camera?.mode==="first-person"&&e.camera.controlEntityId){let t=i.get(e.camera.controlEntityId),r=t?t.shapeName:void 0;r&&(o=r)}E(e=>e===o?e:o)},S[2]=d):d=S[2];let R=d;return S[3]!==v||S[4]!==b.streamingPlayback?(m=()=>{(0,A.stopAllTrackedSounds)(),k.current=b.streamingPlayback??null,I.current=new Map,B.current=null,C.current=null,(0,K.resetStreamPlayback)(),M.current=0,x.current=null,w.current=null;let e=k.current;if(K.streamPlaybackStore.setState({playback:e}),$.gameEntityStore.getState().beginStreaming(),!e)return void v.getState().setPlaybackStreamSnapshot(null);for(let t of(e.reset(),e.getEffectShapes()))n.useGLTF.preload((0,c.shapeToUrl)(t));let t=e.getSnapshot();return K.streamPlaybackStore.setState({time:t.timeSec}),M.current=t.timeSec,x.current=t,w.current=t,R(t),v.getState().setPlaybackStreamSnapshot(t),C.current=t,()=>{(0,A.stopAllTrackedSounds)(),$.gameEntityStore.getState().endStreaming(),(0,K.resetStreamPlayback)(),v.getState().setPlaybackStreamSnapshot(null)}},S[3]=v,S[4]=b.streamingPlayback,S[5]=m):m=S[5],S[6]!==v||S[7]!==b?(p=[b,v,R],S[6]=v,S[7]=b,S[8]=p):p=S[8],(0,a.useEffect)(m,p),S[9]!==v||S[10]!==b.source?(f=(e,t)=>{let i=k.current;if(!i)return;let r=v.getState(),a=r.playback,o="playing"===a.status,n=a.timeMs/1e3,l=!o&&Math.abs(n-M.current)>5e-4,c=o&&Math.abs(n-K.streamPlaybackStore.getState().time)>.05,u=l||c;u&&(M.current=n),o&&((0,T.advanceEffectClock)(t,a.rate),M.current=M.current+t*a.rate);let d=Math.max(1,Math.ceil(1e3*t*Math.max(a.rate,.01)/32)+2),m=M.current+s.STREAM_TICK_SEC,p=i.stepToTime(m,o&&!u?d:1/0),f=w.current;!f||p.timeSec1.5*s.STREAM_TICK_SEC?(x.current=p,w.current=p):p.timeSec!==f.timeSec&&(x.current=f,w.current=p);let h=w.current??p,g=x.current??h,y=h.timeSec-s.STREAM_TICK_SEC,S=Math.max(0,Math.min(1,(M.current-y)/s.STREAM_TICK_SEC));K.streamPlaybackStore.setState({time:M.current}),p.exhausted&&o&&(M.current=Math.min(M.current,p.timeSec)),R(h),K.streamPlaybackStore.getState().entities=I.current,h!==C.current&&(C.current=h,r.setPlaybackStreamSnapshot(h));let A=h.camera,B=A&&g.camera&&g.camera.mode===A.mode&&g.camera.controlEntityId===A.controlEntityId&&g.camera.orbitTargetId===A.orbitTargetId?g.camera:null,D=K.streamPlaybackStore.getState().freeFlyCamera,E="live"===b.source;if(A&&!D){if(B){let t=B.position[0],i=B.position[1],r=B.position[2],a=A.position[0],o=A.position[1],n=A.position[2];e.camera.position.set(i+(o-i)*S,r+(n-r)*S,t+(a-t)*S),E||(ee.set(...B.rotation),et.set(...A.rotation),ee.slerp(et,S),e.camera.quaternion.copy(ee))}else e.camera.position.set(A.position[1],A.position[2],A.position[0]),E||e.camera.quaternion.set(...A.rotation);if(!E&&Number.isFinite(A.fov)&&"isPerspectiveCamera"in e.camera&&e.camera.isPerspectiveCamera){let t=e.camera,i=B&&Number.isFinite(B.fov)?B.fov+(A.fov-B.fov)*S:A.fov,r=(0,s.torqueHorizontalFovToThreeVerticalFov)(i,t.aspect);Math.abs(t.fov-r)>.01&&(t.fov=r,t.updateProjectionMatrix())}}let V=J(h),F=J(g),N=I.current,_=K.streamPlaybackStore.getState().root;if(_)for(let t of _.children){let i=N.get(t.name);if(i&&(0,Q.isSceneEntity)(i))continue;let r=V.get(t.name);if(!r){let e=i&&"keyframes"in i?i.keyframes:void 0;if(e?.[0]?.position){let i=e[0];t.visible=!0,t.position.set(i.position[1],i.position[2],i.position[0]);continue}}if(!r?.position){t.visible=!1;continue}t.visible=!0;let a=F.get(t.name);if(a?.position){let e=a.position[0],i=a.position[1],o=a.position[2],n=r.position[0],l=r.position[1],s=r.position[2],c=e+(n-e)*S,u=i+(l-i)*S,d=o+(s-o)*S;t.position.set(u,d,c)}else t.position.set(r.position[1],r.position[2],r.position[0]);r.faceViewer?t.quaternion.copy(e.camera.quaternion).multiply(ei):r.visual?.kind==="tracer"?t.quaternion.identity():r.rotation&&(a?.rotation?(ee.set(...a.rotation),et.set(...r.rotation),ee.slerp(et,S),t.quaternion.copy(ee)):t.quaternion.set(...r.rotation))}let O=A?.mode;if(!D&&!E&&"third-person"===O&&_&&A?.orbitTargetId){let t=_.children.find(e=>e.name===A.orbitTargetId);if(t){let i=V.get(A.orbitTargetId);ea.copy(t.position),i?.type==="Player"&&(ea.y=ea.y+1);let r=!1;if("number"==typeof A.yaw&&"number"==typeof A.pitch){let e=Math.sin(A.pitch),t=Math.cos(A.pitch),i=Math.sin(A.yaw),a=Math.cos(A.yaw);er.set(-t,-i*e,-a*e),r=er.lengthSq()>1e-8}if(r||(er.copy(e.camera.position).sub(ea),r=er.lengthSq()>1e-8),r){er.normalize();let t=Math.max(.1,A.orbitDistance??4);eo.copy(ea).addScaledVector(er,t),e.camera.position.copy(eo),e.camera.lookAt(ea)}}}if(!D&&"first-person"===O&&_&&A?.controlEntityId){let t=_.children.find(e=>e.name===A.controlEntityId);t?(Z.copy(P.current).applyQuaternion(t.quaternion),e.camera.position.add(Z)):e.camera.position.y=e.camera.position.y+P.current.y}o&&p.exhausted&&r.setPlaybackStatus("paused");let z=1e3*M.current;Math.abs(z-a.timeMs)>.5&&r.setPlaybackTime(z)},S[9]=v,S[10]=b.source,S[11]=f):f=S[11],(0,o.useFrame)(f),S[12]!==b.streamingPlayback?(h=(0,t.jsx)(j,{playback:b.streamingPlayback,snapshotRef:w}),S[12]=b.streamingPlayback,S[13]=h):h=S[13],S[14]!==D?(g=D&&(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(H.PlayerEyeOffset,{shapeName:D,eyeOffsetRef:P})}),S[14]=D,S[15]=g):g=S[15],S[16]!==h||S[17]!==g?(y=(0,t.jsxs)(t.Fragment,{children:[h,g]}),S[16]=h,S[17]=g,S[18]=y):y=S[18],y}function el(){let e,a=(0,i.c)(2),o=(0,r.useRecording)();return o?(a[0]!==o?(e=(0,t.jsx)(en,{recording:o}),a[0]=o,a[1]=e):e=a[1],e):null}e.s(["DemoPlayback",()=>el],21500)}]); \ No newline at end of file +`;function O(e){let t=(e+1)*2,i=new Float32Array(3*t),r=new Float32Array(2*t),a=new Float32Array(4*t),n=new Uint16Array(6*e);for(let t=0;t{let i=Y.current,r=k.current;if(!i||!r)return;let a=T.engineStore.getState().playback,n="playing"===a.status,o=n?t*a.rate:0,s=1e3*o,u=P.getDataBlockData.bind(P);for(let e of r.entities){if("Explosion"!==e.type||!e.explosionDataBlockId||!e.position||X.current.has(e.id))continue;X.current.add(e.id);let t=function(e,t){let i=t(e);if(!i)return null;let r=[],a=[],n=i.particleEmitter;if("number"==typeof n){let e=t(n);if(e){let a=g(e,t);if(a){let e=i.particleDensity??10;r.push({data:a,density:e})}}}let o=i.emitters;if(Array.isArray(o))for(let e of o){if("number"!=typeof e)continue;let i=t(e);if(!i)continue;let r=g(i,t);r&&a.push(r)}return 0===r.length&&0===a.length?null:{burstEmitters:r,streamingEmitters:a,lifetimeMS:32*(i.lifetimeMS??31)}}(e.explosionDataBlockId,u);if(!t)continue;let r=[...e.position];for(let e of t.burstEmitters){let t=new b(e.data,256);t.emitBurst(r,e.density);let a=B(e.data.particles.textureName),n=U(256),o=j(a,e.data.particles.useInvAlpha,e.data.orientParticles),s=new l.Mesh(n,o);s.frustumCulled=!1,i.add(s),Q.current.push({emitter:t,mesh:s,geometry:n,material:o,targetTexture:a,origin:r,isBurst:!0,hasBurst:!0})}for(let e of t.streamingEmitters){let a=new b(e,256,t.lifetimeMS),n=B(e.particles.textureName),o=U(256),s=j(n,e.particles.useInvAlpha,e.orientParticles),c=new l.Mesh(o,s);c.frustumCulled=!1,i.add(c),Q.current.push({emitter:a,mesh:c,geometry:o,material:s,targetTexture:n,origin:r,isBurst:!1,hasBurst:!1})}let a=u(e.explosionDataBlockId);if(I){let n=a?function(e){let t=e.sizes;if(Array.isArray(t)&&t.length>0){let e=0;for(let i of t)e=Math.max(e,i.x,i.y,i.z);if(e>0)return e/1e3}let i=e.particleRadius;return"number"==typeof i&&i>0?i:5}(a):5,o=function(e){if(!e)return 0xff00ff;let t=e.toLowerCase();return t.includes("disc")?4491519:t.includes("grenade")?0xff8800:t.includes("mortar")?0xff4400:t.includes("plasma")?4521796:t.includes("laser")?0xff2222:t.includes("blaster")?0xffff00:t.includes("missile")?0xff6600:t.includes("bomb")?0xff0000:t.includes("mine")?0xff8844:t.includes("concussion")?0xffaa00:t.includes("shocklance")?8930559:t.includes("chaingun")||t.includes("bullet")?0xcccccc:0xff00ff}(e.dataBlock),s=new l.MeshBasicMaterial({color:o,wireframe:!0,transparent:!0,opacity:1,depthWrite:!1}),c=new l.Mesh(F,s);c.frustumCulled=!1,c.scale.setScalar(n),c.position.set(r[1],r[2],r[0]),i.add(c);let{sprite:u,material:d}=function(e,t){let i=document.createElement("canvas"),r=i.getContext("2d");r.font="bold 32px monospace",i.width=Math.ceil(r.measureText(e).width)+16,i.height=48,r.font="bold 32px monospace",r.fillStyle=`#${t.toString(16).padStart(6,"0")}`,r.textBaseline="middle",r.fillText(e,8,i.height/2);let a=new l.CanvasTexture(i),n=new l.SpriteMaterial({map:a,transparent:!0,depthTest:!1,depthWrite:!1}),o=new l.Sprite(n),s=i.width/i.height;return o.scale.set(2*s,2,1),{sprite:o,material:n}}(`${e.id}: ${e.dataBlock??`expId:${e.explosionDataBlockId}`}`,o);u.position.set(r[1],r[2]+n+2,r[0]),u.frustumCulled=!1,i.add(u),et.current.push({entityId:e.id,mesh:c,material:s,label:u,labelMaterial:d,creationTime:(0,T.effectNow)(),lifetimeMS:Math.max(t.lifetimeMS,3e3),targetRadius:n})}let n=a?.shockwave;if("number"==typeof n){let t=function(e,t){let i=t(e);if(!i)return null;let r=i.colors??[],a=i.times??[0,.5,1,1];return{width:i.width??1,numSegments:Math.max(i.numSegments??16,4),velocity:i.velocity??0,height:i.height??0,verticalCurve:i.verticalCurve??0,acceleration:i.acceleration??0,texWrap:i.texWrap??1,lifetimeMS:i.lifetimeMS??500,is2D:!!i.is2D,renderSquare:!!i.renderSquare,renderBottom:!!i.renderBottom,mapToTerrain:!!i.mapToTerrain,colors:r,times:a,textureName:i.textureName??"",mapToTexture:i.mapToTexture??""}}(n,u);if(t){let a=B(t.textureName),n=O(t.numSegments),o=new l.ShaderMaterial({vertexShader:N,fragmentShader:_,uniforms:{uTexture:{value:a}},transparent:!0,depthWrite:!1,blending:l.AdditiveBlending,side:l.DoubleSide}),s=new l.Mesh(n,o);s.frustumCulled=!1,s.position.set(r[1],r[2],r[0]),i.add(s);let c=null,u=null;t.renderBottom&&(u=O(t.numSegments),(c=new l.Mesh(u,o)).frustumCulled=!1,c.position.set(r[1],r[2],r[0]),c.scale.y=-1,i.add(c));let d=Math.abs(t.velocity)>1e-10?t.velocity:0;ei.current.push({entityId:e.id,mesh:s,bottomMesh:c,geometry:n,bottomGeometry:u,material:o,creationTime:(0,T.effectNow)(),lifetimeMS:t.lifetimeMS,data:t,radius:0,velocity:d})}}}let d=new Set;for(let e of r.entities){if(d.add(e.id),!e.maintainEmitterId||J.current.has(e.id))continue;J.current.add(e.id);let t=u(e.maintainEmitterId);if(!t)continue;let r=g(t,u);if(!r)continue;let a=e.position?[...e.position]:[0,0,0],n=new b(r,256),o=B(r.particles.textureName),s=U(256),c=j(o,r.particles.useInvAlpha,r.orientParticles),m=new l.Mesh(s,c);m.frustumCulled=!1,i.add(m),Q.current.push({emitter:n,mesh:m,geometry:s,material:c,targetTexture:o,origin:a,isBurst:!1,hasBurst:!1,followEntityId:e.id})}for(let e of Q.current)e.followEntityId&&!d.has(e.followEntityId)&&e.emitter.kill();for(let e of J.current)d.has(e)||J.current.delete(e);let m=Q.current;for(let e=m.length-1;e>=0;e--){let t=m[e];if(t.shaderChecked||(!function(e,t,i){let r=e.properties.get(t).currentProgram;if(!r)return;let a=r.program,n=e.getContext();n.getProgramParameter(a,n.LINK_STATUS)||console.error(`[ParticleFX] Shader LINK ERROR (${i}):`,n.getProgramInfoLog(a))}(K,t.material,t.isBurst?"burst":"stream"),t.shaderChecked=!0),t.followEntityId){let e=r.entities.find(e=>e.id===t.followEntityId);e?.position&&(t.origin[0]=e.position[0],t.origin[1]=e.position[1],t.origin[2]=e.position[2]),e?.direction&&(t.emitAxis=e.direction)}if(t.isBurst||t.emitter.emitPeriodic(t.origin,s,t.emitAxis),t.emitter.update(s),C.has(t.targetTexture)&&t.material.uniforms.particleTexture.value!==t.targetTexture&&(t.material.uniforms.particleTexture.value=t.targetTexture),t.material.uniforms.debugOpacity.value=I?.2:1,!function(e){let t=e.emitter.particles,i=e.geometry,r=i.getAttribute("position"),a=i.getAttribute("particleColor"),n=i.getAttribute("particleSize"),o=i.getAttribute("particleSpin"),l=i.getAttribute("orientDir"),s=r.array,c=a.array,u=n.array,d=o.array,m=l.array,p=Math.min(t.length,256),f=e.emitter.data.orientOnVelocity;for(let e=0;e=0;e--){let t=p[e],r=Math.min((f-t.creationTime)/t.lifetimeMS,1),a=Math.min(r/.1,1);t.mesh.scale.setScalar(t.targetRadius*a),t.material.opacity=1-r,t.labelMaterial.opacity=1-r,r>=1&&(i.remove(t.mesh),i.remove(t.label),t.material.dispose(),t.labelMaterial.dispose(),p.splice(e,1))}let h=ei.current;for(let t=h.length-1;t>=0;t--){let r=h[t],a=Math.min((f-r.creationTime)/r.lifetimeMS,1);r.velocity=r.velocity+r.data.acceleration*o,r.radius=r.radius+r.velocity*o;let n=function(e,t){let{colors:i,times:r}=e;if(0===i.length)return[1,1,1,1];let a=0;for(let e=0;e=r[e]&&(a=e);let n=Math.min(a+1,i.length-1),o=r[a]??0,l=(r[n]??1)-o,s=l>0?Math.min((t-o)/l,1):0,c=i[a]??i[0],u=i[n]??i[0];return[c.r+(u.r-c.r)*s,c.g+(u.g-c.g)*s,c.b+(u.b-c.b)*s,c.a+(u.a-c.a)*s]}(r.data,a);z(r.geometry,r.data,r.radius,n,r.data.is2D),r.bottomGeometry&&z(r.bottomGeometry,r.data,r.radius,n,r.data.is2D),r.data.is2D&&r.mesh.lookAt(e.camera.position),a>=1&&(i.remove(r.mesh),r.bottomMesh&&i.remove(r.bottomMesh),r.geometry.dispose(),r.bottomGeometry?.dispose(),r.material.dispose(),h.splice(t,1))}if(n&&q&&H&&$&&Y.current){for(let e of r.entities){if("Explosion"!==e.type||!e.explosionDataBlockId||!e.position)continue;let t=`snd:${e.id}`;if(ee.current.has(t))continue;ee.current.add(t);let i=u(e.explosionDataBlockId);if(!i)continue;let r=i.soundProfile;if("number"!=typeof r)continue;let a=(0,A.resolveAudioProfile)(r,u);if(!a)continue;let n=new l.Vector3(e.position[1],e.position[2],e.position[0]);(0,A.playOneShotSound)(a,$,H,n,Y.current)}let e=Z.current;for(let t of r.entities){if("Projectile"!==t.type||!t.dataBlockId||!t.position)continue;if(e.has(t.id)){e.get(t.id).position.set(t.position[1],t.position[2],t.position[0]);continue}if(e.size>=20)continue;let i=u(t.dataBlockId);if(!i)continue;let r=i.sound;if("number"!=typeof r)continue;let n=(0,A.resolveAudioProfile)(r,u);if(n&&n.isLooping&&n.is3D)try{let i=(0,c.audioToUrl)(n.filename),r=(0,A.getSoundGeneration)();(0,A.getCachedAudioBuffer)(i,H,i=>{if(r!==(0,A.getSoundGeneration)()||!d.has(t.id)||e.has(t.id))return;let o=Y.current;if(!o)return;let s=new l.PositionalAudio($);s.setBuffer(i),s.setDistanceModel("inverse"),s.setRefDistance(n.refDist),s.setMaxDistance(n.maxDist),s.setRolloffFactor(1),s.setVolume(n.volume),s.setPlaybackRate(a.rate),s.setLoop(!0),s.position.set(t.position[1],t.position[2],t.position[0]),o.add(s),(0,A.trackSound)(s),s.play(),e.set(t.id,s)})}catch{}}for(let[t,i]of e)if(!d.has(t)){(0,A.untrackSound)(i);try{i.stop()}catch{}try{i.disconnect()}catch{}Y.current?.remove(i),e.delete(t)}for(let e of r.audioEvents){let t=`${e.timeSec}:${e.profileId}:${e.position?.x??""}`;if(ee.current.has(t))continue;ee.current.add(t);let i=(0,A.resolveAudioProfile)(e.profileId,u);if(!i)continue;let r=e.position?new l.Vector3(e.position.y,e.position.z,e.position.x):void 0;(0,A.playOneShotSound)(i,$,H,r,Y.current)}}if(X.current.size>500){let e=new Set(r.entities.map(G));for(let t of X.current)e.has(t)||X.current.delete(t)}if(ee.current.size>500){let e=new Set(r.entities.map(L));for(let t of ee.current)t.startsWith("snd:")&&e.has(t.slice(4))||ee.current.delete(t)}},M[7]=q,M[8]=$,M[9]=H,M[10]=I,M[11]=K,M[12]=P,M[13]=k,M[14]=h):h=M[14],(0,n.useFrame)(h),M[15]===Symbol.for("react.memo_cache_sentinel")?(S=()=>()=>{let e=Y.current;for(let t of Q.current){if(e&&(e.remove(t.mesh),t.debugOriginMesh&&e.remove(t.debugOriginMesh),t.debugParticleMeshes))for(let i of t.debugParticleMeshes)e.remove(i);t.geometry.dispose(),t.material.dispose()}for(let t of(Q.current=[],et.current))e&&(e.remove(t.mesh),e.remove(t.label)),t.material.dispose(),t.labelMaterial.dispose();for(let t of(et.current=[],ei.current))e&&(e.remove(t.mesh),t.bottomMesh&&e.remove(t.bottomMesh)),t.geometry.dispose(),t.bottomGeometry?.dispose(),t.material.dispose();for(let[,t]of(ei.current=[],X.current.clear(),J.current.clear(),Z.current)){(0,A.untrackSound)(t);try{t.stop()}catch{}try{t.disconnect()}catch{}e&&e.remove(t)}Z.current.clear(),ee.current.clear()},y=[],M[15]=y,M[16]=S):(y=M[15],S=M[16]),(0,a.useEffect)(S,y),M[17]===Symbol.for("react.memo_cache_sentinel")?(v=(0,t.jsx)("group",{ref:Y}),M[17]=v):v=M[17],v}function L(e){return e.id}function G(e){return e.id}function W(e){return e.gl}var H=e.i(9721),$=e.i(92224),K=e.i(93784);function Y(e,t){return{id:e.id,className:e.className??e.type,ghostIndex:e.ghostIndex,dataBlockId:e.dataBlockId,shapeHint:e.shapeHint,spawnTime:t,position:e.position,rotation:e.rotation,velocity:e.velocity,keyframes:[{time:t??0,position:e.position??[0,0,0],rotation:e.rotation??[0,0,0,1]}]}}var Q=e.i(77964);let X=new WeakMap;function J(e){let t=X.get(e);return t||(t=new Map(e.entities.map(e=>[e.id,e])),X.set(e,t)),t}let Z=new l.Vector3,ee=new l.Quaternion,et=new l.Quaternion,ei=new l.Quaternion(0,1,0,0),er=new l.Vector3,ea=new l.Vector3,en=new l.Vector3;function eo(e){let r,u,d,m,p,f,h,g,y,S=(0,i.c)(20),{recording:b}=e,v=(0,T.useEngineStoreApi)(),M=(0,a.useRef)(0),x=(0,a.useRef)(null),w=(0,a.useRef)(null);S[0]===Symbol.for("react.memo_cache_sentinel")?(r=new l.Vector3(0,s.DEFAULT_EYE_HEIGHT,0),S[0]=r):r=S[0];let P=(0,a.useRef)(r),k=(0,a.useRef)(b.streamingPlayback??null),C=(0,a.useRef)(null);S[1]===Symbol.for("react.memo_cache_sentinel")?(u=new Map,S[1]=u):u=S[1];let I=(0,a.useRef)(u),B=(0,a.useRef)(null),[D,E]=(0,a.useState)(null);S[2]===Symbol.for("react.memo_cache_sentinel")?(d=e=>{if(e===B.current)return;B.current=e;let t=I.current,i=new Map,r=!1;for(let n of e.entities){let o=t.get(n.id);if(o&&o.className===(n.className??n.type)&&o.ghostIndex===n.ghostIndex&&o.dataBlockId===n.dataBlockId&&o.shapeHint===n.shapeHint&&o.shapeName===n.dataBlock&&("Player"===o.renderType||o.weaponShape===n.weaponShape)){var a=o;switch(a.renderType){case"Player":a.threads=n.threads,a.weaponShape=n.weaponShape,a.packShape=n.packShape,a.falling=n.falling,a.jetting=n.jetting,a.weaponImageState=n.weaponImageState,a.weaponImageStates=n.weaponImageStates,a.playerName=n.playerName,a.iffColor=n.iffColor,a.headPitch=n.headPitch,a.headYaw=n.headYaw,a.targetRenderFlags=n.targetRenderFlags;break;case"Shape":a.threads=n.threads,a.targetRenderFlags=n.targetRenderFlags,a.iffColor=n.iffColor}}else o=function(e,t){if(e.sceneData){let i={id:e.id,className:e.className??e.type,ghostIndex:e.ghostIndex,dataBlockId:e.dataBlockId,shapeHint:e.shapeHint,spawnTime:t};switch(e.sceneData.className){case"TerrainBlock":return{...i,renderType:"TerrainBlock",terrainData:e.sceneData};case"InteriorInstance":return{...i,renderType:"InteriorInstance",interiorData:e.sceneData};case"Sky":return{...i,renderType:"Sky",skyData:e.sceneData};case"Sun":return{...i,renderType:"Sun",sunData:e.sceneData};case"WaterBlock":return{...i,renderType:"WaterBlock",waterData:e.sceneData};case"MissionArea":return{...i,renderType:"MissionArea",missionAreaData:e.sceneData};case"TSStatic":return{...Y(e,t),renderType:"Shape",shapeName:e.sceneData.shapeName,shapeType:"TSStatic",dataBlock:e.dataBlock}}}return e.visual?.kind==="tracer"?{...Y(e,t),renderType:"Tracer",visual:e.visual,dataBlock:e.dataBlock,direction:e.direction}:e.visual?.kind==="sprite"?{...Y(e,t),renderType:"Sprite",visual:e.visual}:"Player"===e.type?{...Y(e,t),renderType:"Player",shapeName:e.dataBlock,dataBlock:e.dataBlock,weaponShape:e.weaponShape,packShape:e.packShape,falling:e.falling,jetting:e.jetting,playerName:e.playerName,iffColor:e.iffColor,threads:e.threads,weaponImageState:e.weaponImageState,weaponImageStates:e.weaponImageStates,headPitch:e.headPitch,headYaw:e.headYaw,targetRenderFlags:e.targetRenderFlags}:"Explosion"===e.type?{...Y(e,t),renderType:"Explosion",shapeName:e.dataBlock,dataBlock:e.dataBlock,explosionDataBlockId:e.explosionDataBlockId,faceViewer:e.faceViewer}:"ForceFieldBare"===e.className?{...Y(e,t),renderType:"ForceFieldBare"}:"AudioEmitter"===e.className?{...Y(e,t),renderType:"AudioEmitter",audioFileName:e.audioFileName,audioVolume:e.audioVolume,audioIs3D:e.audioIs3D,audioIsLooping:e.audioIsLooping??!0,audioMinDistance:e.audioMinDistance,audioMaxDistance:e.audioMaxDistance,audioMinLoopGap:e.audioMinLoopGap,audioMaxLoopGap:e.audioMaxLoopGap}:"WayPoint"===e.className?{...Y(e,t),renderType:"WayPoint",label:e.label}:"Camera"===e.className?{...Y(e,t),renderType:"Camera"}:{...Y(e,t),renderType:"Shape",shapeName:e.dataBlock,shapeType:"Turret"===e.className?"Turret":"Item"===e.className?"Item":"StaticShape",dataBlock:e.dataBlock,weaponShape:e.weaponShape,threads:e.threads,targetRenderFlags:e.targetRenderFlags,iffColor:e.iffColor}}(n,e.timeSec),r=!0;if(i.set(n.id,o),(0,Q.isSceneEntity)(o)||"None"===o.renderType)continue;let l=o.keyframes;0===l.length&&l.push({time:e.timeSec,position:n.position??[0,0,0],rotation:n.rotation??[0,0,0,1]});let s=l[0];s.time=e.timeSec,n.position&&(s.position=n.position),n.rotation&&(s.rotation=n.rotation),s.velocity=n.velocity,s.health=n.health,s.energy=n.energy,s.actionAnim=n.actionAnim,s.actionAtEnd=n.actionAtEnd,s.damageState=n.damageState}for(let[a,n]of t)if(!i.has(a)){if("Explosion"===n.renderType&&n.shapeName&&null!=n.spawnTime&&e.timeSec-n.spawnTime<5){i.set(a,n);continue}r=!0}i.size!==t.size&&(r=!0),I.current=i,r&&$.gameEntityStore.getState().setAllStreamEntities(Array.from(i.values()));let n=null;if(e.camera?.mode==="first-person"&&e.camera.controlEntityId){let t=i.get(e.camera.controlEntityId),r=t?t.shapeName:void 0;r&&(n=r)}E(e=>e===n?e:n)},S[2]=d):d=S[2];let R=d;return S[3]!==v||S[4]!==b.source||S[5]!==b.streamingPlayback?(m=()=>{(0,A.stopAllTrackedSounds)(),k.current=b.streamingPlayback??null,I.current=new Map,B.current=null,C.current=null,(0,K.resetStreamPlayback)(),M.current=0,x.current=null,w.current=null;let e=k.current;if(K.streamPlaybackStore.setState({playback:e}),$.gameEntityStore.getState().beginStreaming(),!e)return void v.getState().setPlaybackStreamSnapshot(null);for(let t of("live"!==b.source&&e.reset(),e.getEffectShapes()))o.useGLTF.preload((0,c.shapeToUrl)(t));let t=e.getSnapshot();return K.streamPlaybackStore.setState({time:t.timeSec}),M.current=t.timeSec,x.current=t,w.current=t,R(t),v.getState().setPlaybackStreamSnapshot(t),C.current=t,()=>{(0,A.stopAllTrackedSounds)(),$.gameEntityStore.getState().endStreaming(),(0,K.resetStreamPlayback)(),v.getState().setPlaybackStreamSnapshot(null)}},S[3]=v,S[4]=b.source,S[5]=b.streamingPlayback,S[6]=m):m=S[6],S[7]!==v||S[8]!==b?(p=[b,v,R],S[7]=v,S[8]=b,S[9]=p):p=S[9],(0,a.useEffect)(m,p),S[10]!==v||S[11]!==b.source?(f=(e,t)=>{let i=k.current;if(!i)return;let r=v.getState(),a=r.playback,n="playing"===a.status,o=a.timeMs/1e3,l=!n&&Math.abs(o-M.current)>5e-4,c=n&&Math.abs(o-K.streamPlaybackStore.getState().time)>.05,u=l||c;u&&(M.current=o),n&&((0,T.advanceEffectClock)(t,a.rate),M.current=M.current+t*a.rate);let d=Math.max(1,Math.ceil(1e3*t*Math.max(a.rate,.01)/32)+2),m=M.current+s.STREAM_TICK_SEC,p=i.stepToTime(m,n&&!u?d:1/0),f=w.current;!f||p.timeSec1.5*s.STREAM_TICK_SEC?(x.current=p,w.current=p):p.timeSec!==f.timeSec&&(x.current=f,w.current=p);let h=w.current??p,g=x.current??h,y=h.timeSec-s.STREAM_TICK_SEC,S=Math.max(0,Math.min(1,(M.current-y)/s.STREAM_TICK_SEC));K.streamPlaybackStore.setState({time:M.current}),p.exhausted&&n&&(M.current=Math.min(M.current,p.timeSec)),R(h),K.streamPlaybackStore.getState().entities=I.current,h!==C.current&&(C.current=h,r.setPlaybackStreamSnapshot(h));let A=h.camera,B=A&&g.camera&&g.camera.mode===A.mode&&g.camera.controlEntityId===A.controlEntityId&&g.camera.orbitTargetId===A.orbitTargetId?g.camera:null,D=K.streamPlaybackStore.getState().freeFlyCamera,E="live"===b.source;if(A&&!D){if(B){let t=B.position[0],i=B.position[1],r=B.position[2],a=A.position[0],n=A.position[1],o=A.position[2];e.camera.position.set(i+(n-i)*S,r+(o-r)*S,t+(a-t)*S),E||(ee.set(...B.rotation),et.set(...A.rotation),ee.slerp(et,S),e.camera.quaternion.copy(ee))}else e.camera.position.set(A.position[1],A.position[2],A.position[0]),E||e.camera.quaternion.set(...A.rotation);if(Number.isFinite(A.fov)&&"isPerspectiveCamera"in e.camera&&e.camera.isPerspectiveCamera){let t=e.camera,i=B&&Number.isFinite(B.fov)?B.fov+(A.fov-B.fov)*S:A.fov,r=(0,s.torqueHorizontalFovToThreeVerticalFov)(i,t.aspect);Math.abs(t.fov-r)>.01&&(t.fov=r,t.updateProjectionMatrix())}}let V=J(h),F=J(g),N=I.current,_=K.streamPlaybackStore.getState().root;if(_)for(let t of _.children){let i=N.get(t.name);if(i&&(0,Q.isSceneEntity)(i))continue;let r=V.get(t.name);if(!r){let e=i&&"keyframes"in i?i.keyframes:void 0;if(e?.[0]?.position){let i=e[0];t.visible=!0,t.position.set(i.position[1],i.position[2],i.position[0]);continue}}if(!r?.position){t.visible=!1;continue}t.visible=!0;let a=F.get(t.name);if(a?.position){let e=a.position[0],i=a.position[1],n=a.position[2],o=r.position[0],l=r.position[1],s=r.position[2],c=e+(o-e)*S,u=i+(l-i)*S,d=n+(s-n)*S;t.position.set(u,d,c)}else t.position.set(r.position[1],r.position[2],r.position[0]);r.faceViewer?t.quaternion.copy(e.camera.quaternion).multiply(ei):r.visual?.kind==="tracer"?t.quaternion.identity():r.rotation&&(a?.rotation?(ee.set(...a.rotation),et.set(...r.rotation),ee.slerp(et,S),t.quaternion.copy(ee)):t.quaternion.set(...r.rotation))}let O=A?.mode;if(!D&&!E&&"third-person"===O&&_&&A?.orbitTargetId){let t=_.children.find(e=>e.name===A.orbitTargetId);if(t){let i=V.get(A.orbitTargetId);ea.copy(t.position),i?.type==="Player"&&(ea.y=ea.y+1);let r=!1;if(A.orbitDirection)er.set(A.orbitDirection[0],A.orbitDirection[1],A.orbitDirection[2]),r=er.lengthSq()>1e-8;else if("number"==typeof A.yaw&&"number"==typeof A.pitch){let e=Math.sin(A.pitch),t=Math.cos(A.pitch),i=Math.sin(A.yaw),a=Math.cos(A.yaw);er.set(-a*t,-e,-i*t),r=er.lengthSq()>1e-8}if(r||(er.copy(e.camera.position).sub(ea),r=er.lengthSq()>1e-8),r){er.normalize();let t=Math.max(.1,A.orbitDistance??4);en.copy(ea).addScaledVector(er,t),e.camera.position.copy(en),e.camera.lookAt(ea)}}}if(!D&&"first-person"===O&&_&&A?.controlEntityId){let t=_.children.find(e=>e.name===A.controlEntityId);t?(Z.copy(P.current).applyQuaternion(t.quaternion),e.camera.position.add(Z)):e.camera.position.y=e.camera.position.y+P.current.y}n&&p.exhausted&&r.setPlaybackStatus("paused");let z=1e3*M.current;Math.abs(z-a.timeMs)>.5&&r.setPlaybackTime(z)},S[10]=v,S[11]=b.source,S[12]=f):f=S[12],(0,n.useFrame)(f),S[13]!==b.streamingPlayback?(h=(0,t.jsx)(q,{playback:b.streamingPlayback,snapshotRef:w}),S[13]=b.streamingPlayback,S[14]=h):h=S[14],S[15]!==D?(g=D&&(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(H.PlayerEyeOffset,{shapeName:D,eyeOffsetRef:P})}),S[15]=D,S[16]=g):g=S[16],S[17]!==h||S[18]!==g?(y=(0,t.jsxs)(t.Fragment,{children:[h,g]}),S[17]=h,S[18]=g,S[19]=y):y=S[19],y}function el(){let e,a=(0,i.c)(2),n=(0,r.useRecording)();return n?(a[0]!==n?(e=(0,t.jsx)(eo,{recording:n}),a[0]=n,a[1]=e):e=a[1],e):null}e.s(["StreamPlayback",()=>el],53272)}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/463a5d636c02e0db.js b/docs/_next/static/chunks/463a5d636c02e0db.js new file mode 100644 index 00000000..a3a74480 --- /dev/null +++ b/docs/_next/static/chunks/463a5d636c02e0db.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,29055,e=>{"use strict";var t=e.i(43476),n=e.i(71645),a=e.i(15080),i=e.i(71753),r=e.i(90072),o=e.i(12979),l=e.i(51434),s=e.i(79123),c=e.i(89887);e.i(13876);var u=e.i(58647);let m=new Map,f=new Map;function d(e,t=1){f.set(e,t)}function p(e){f.delete(e)}let h=0;function S(){return h}function g(){for(let[e]of(h++,f)){try{e.stop()}catch{}try{e.disconnect()}catch{}}f.clear()}function y(e,t){let n=t(e),a=n?.filename;if(!a)return null;let i=a.endsWith(".wav")?a:`${a}.wav`,r=n.description,o=null!=r?t(r):void 0,l=o?.is3D??!0,s=o?.isLooping??!1,c=o?.referenceDistance??20;return{filename:i,is3D:l,isLooping:s,refDist:c,maxDist:o?.maxDistance??100,volume:o?.volume??1}}function T(e,t,n,a,i){let l;try{l=(0,o.audioToUrl)(e.filename)}catch{return}let s=u.engineStore.getState().playback.rate,c=h;I(l,n,n=>{if(c===h)try{if(e.is3D&&i){let o=new r.PositionalAudio(t);o.setBuffer(n),o.setDistanceModel("inverse"),o.setRefDistance(e.refDist),o.setMaxDistance(e.maxDist),o.setRolloffFactor(1),o.setVolume(e.volume),o.setPlaybackRate(s),a&&o.position.copy(a),i.add(o),f.set(o,1),o.play(),o.source.onended=()=>{f.delete(o);try{o.disconnect()}catch{}i.remove(o)}}else{let a=new r.Audio(t);a.setBuffer(n),a.setVolume(e.volume),a.setPlaybackRate(s),f.set(a,1),a.play(),a.source.onended=()=>{f.delete(a);try{a.disconnect()}catch{}}}}catch{}})}function I(e,t,n){m.has(e)?n(m.get(e)):t.load(e,t=>{m.set(e,t),n(t)},void 0,t=>{console.error("Audio load error",e,t)})}u.engineStore.subscribe(e=>e.playback.rate,e=>{for(let[t,n]of f)try{t.setPlaybackRate(n*e)}catch{}});let w=(0,n.memo)(function({entity:e}){let{debugMode:u}=(0,s.useDebug)(),m=e.audioFileName??"",f=e.audioVolume??1,d=e.audioMinDistance??1,p=e.audioMaxDistance??1,h=e.audioMinLoopGap??0,S=e.audioMaxLoopGap??0,g=e.audioIs3D??!0?1:0,y=e.audioIsLooping??!0,[T,w,k]=e.position??[0,0,0],{scene:A,camera:M}=(0,a.useThree)(),{audioLoader:N,audioListener:v}=(0,l.useAudio)(),{audioEnabled:b}=(0,s.useSettings)(),x=(0,n.useRef)(null),R=(0,n.useRef)(null),_=(0,n.useRef)(null),L=(0,n.useRef)(!1),C=(0,n.useRef)(!1),E=(0,n.useRef)(new r.Vector3(T,w,k)),O=(0,n.useRef)(0),D=()=>{null!=R.current&&(clearTimeout(R.current),R.current=null),null!=_.current&&(clearTimeout(_.current),_.current=null)};(0,n.useEffect)(()=>{let e;if(N&&v){if(O.current++,g){let t=new r.PositionalAudio(v);t.position.copy(E.current),t.setDistanceModel("inverse"),t.setRefDistance(d),t.setMaxDistance(p),t.setRolloffFactor(1),t.setVolume(f),e=t,A.add(e)}else(e=new r.Audio(v)).setVolume(f);return x.current=e,()=>{D();try{e.stop()}catch{}try{e.disconnect()}catch{}g&&A.remove(e),x.current=null,L.current=!1,C.current=!1}}},[N,v,g,d,p,f,A]);let P=(e,t)=>{if(y)if(h>0||S>0){let n=Math.max(0,h),a=Math.max(n,S),i=n===a?n:Math.random()*(a-n)+n;e.loop=!1;let r=()=>{t===O.current&&(!1===e.isPlaying?R.current=setTimeout(()=>{if(t===O.current)try{e.play(),P(e,t)}catch{}},i):_.current=setTimeout(r,100))};_.current=setTimeout(r,100)}else e.setLoop(!0)},F=e=>{if(!N)return;let t=O.current;if(L.current)try{e.isPlaying||(e.play(),P(e,t))}catch{}else{let n;try{n=(0,o.audioToUrl)(m)}catch{return}I(n,N,n=>{if(t===O.current&&!e.buffer){e.setBuffer(n),L.current=!0;try{e.play(),P(e,t)}catch{}}})}};return(0,n.useEffect)(()=>{let e=x.current;e&&!g&&b&&m&&F(e)},[b,g,m,N,v]),(0,i.useFrame)(()=>{let e=x.current;if(!e||!g||!b||!m)return;let t=M.position.distanceTo(E.current),n=C.current,a=t<=p;if(a&&!n)C.current=!0,F(e);else if(!a&&n){C.current=!1,D();try{e.stop()}catch{}}}),(0,n.useEffect)(()=>{let e=x.current;if(e&&!b){D();try{e.stop()}catch{}C.current=!1}},[b]),u?(0,t.jsxs)("mesh",{position:E.current,children:[(0,t.jsx)("sphereGeometry",{args:[d,12,12]}),(0,t.jsx)("meshBasicMaterial",{color:"#00ff00",wireframe:!0,opacity:.05,transparent:!0,toneMapped:!1}),(0,t.jsx)(c.FloatingLabel,{color:"#00ff00",position:[0,d+1,0],children:m})]}):null});e.s(["AudioEmitter",0,w,"audioBufferCache",0,m,"getCachedAudioBuffer",()=>I,"getSoundGeneration",()=>S,"playOneShotSound",()=>T,"resolveAudioProfile",()=>y,"stopAllTrackedSounds",()=>g,"trackSound",()=>d,"untrackSound",()=>p])},9721,e=>{"use strict";var t=e.i(43476),n=e.i(932),a=e.i(71645),i=e.i(71753),r=e.i(90072),o=e.i(82816),l=e.i(85557);class s{states;seqIndexToName;currentStateIndex=0;delayTime=0;lastFireCount=-1;spinTimeScale=0;constructor(e,t){this.states=e,this.seqIndexToName=t,e.length>0&&(this.delayTime=e[0].timeoutValue??0)}get stateIndex(){return this.currentStateIndex}reset(){this.currentStateIndex=0,this.delayTime=this.states.length>0?this.states[0].timeoutValue??0:0,this.lastFireCount=-1}tick(e,t){if(0===this.states.length)return{sequenceName:null,isFiring:!1,spinTimeScale:0,reverse:!1,scaleAnimation:!1,timeoutValue:0,transitioned:!1,soundDataBlockIds:[],stateIndex:-1};let n=this.lastFireCount>=0&&t.fireCount!==this.lastFireCount;this.lastFireCount=t.fireCount;let a=[];if(n){let e=this.states.findIndex(e=>e.fire);if(e>=0&&e!==this.currentStateIndex){this.currentStateIndex=e,this.delayTime=this.states[e].timeoutValue??0;let t=this.states[e].soundDataBlockId;t>=0&&a.push(t)}}this.delayTime-=e;let i=n,r=this.evaluateTickTransitions(t),o=0;for(;r>=0&&o<32;){if(o++,i=!0,r===this.currentStateIndex){this.delayTime=this.states[r].timeoutValue??0;break}let e=this.states[this.currentStateIndex].spin,n=this.delayTime;this.currentStateIndex=r;let l=this.states[r].timeoutValue??0;this.delayTime=l;let s=this.states[r].soundDataBlockId;switch(s>=0&&a.push(s),this.states[r].spin){case 1:this.spinTimeScale=0;break;case 4:this.spinTimeScale=1;break;case 2:3===e&&l>0&&(this.delayTime*=1-n/l);break;case 3:2===e&&l>0&&(this.delayTime*=1-n/l)}r=this.evaluateEntryTransitions(t)}let l=this.states[this.currentStateIndex],s=l.timeoutValue??0;switch(l.spin){case 1:this.spinTimeScale=0;break;case 2:this.spinTimeScale=s>0?Math.max(0,1-this.delayTime/s):1;break;case 4:this.spinTimeScale=1;break;case 3:this.spinTimeScale=s>0?Math.max(0,this.delayTime/s):0}return{sequenceName:this.resolveSequenceName(l),isFiring:l.fire,spinTimeScale:this.spinTimeScale,reverse:!l.direction,scaleAnimation:l.scaleAnimation,timeoutValue:l.timeoutValue??0,transitioned:i,soundDataBlockIds:a,stateIndex:this.currentStateIndex}}evaluateTickTransitions(e){let t=this.states[this.currentStateIndex],n=this.delayTime<=0;if(!(n||!t.waitForTimeout))return -1;let a=this.evaluateConditions(t,e);if(-1!==a)return a;if(n){let e=t.transitionOnTimeout;if(-1!==e)return e}return -1}evaluateEntryTransitions(e){let t=this.states[this.currentStateIndex];return this.evaluateConditions(t,e)}evaluateConditions(e,t){let n=t.loaded?e.transitionOnLoaded:e.transitionOnNotLoaded;if(-1!==n)return n;let a=t.ammo?e.transitionOnAmmo:e.transitionOnNoAmmo;if(-1!==a)return a;let i=t.target?e.transitionOnTarget:e.transitionOnNoTarget;if(-1!==i)return i;let r=t.wet?e.transitionOnWet:e.transitionOnNotWet;if(-1!==r)return r;let o=t.triggerDown?e.transitionOnTriggerDown:e.transitionOnTriggerUp;return -1!==o?o:-1}resolveSequenceName(e){return null==e.sequence||e.sequence<0?null:this.seqIndexToName[e.sequence]??null}}var c=e.i(43595),u=e.i(91907),m=e.i(87297),f=e.i(51434),d=e.i(29055),p=e.i(12979),h=e.i(79123);e.i(13876);var S=e.i(58647),g=e.i(93784);let y=["root","run","back","side","fall","jet","jump","land"];function T(e,t,n){let a=e.current;if(a){(0,d.untrackSound)(a);try{a.stop()}catch{}try{a.disconnect()}catch{}n?.remove(a),e.current=null,t.current=-1}}function I(e){let s,f,d,p,h,T,I,b,x,R,L,C,E,O,D,P,F,B,j,q,V,W,U=(0,n.c)(56),{entity:G}=e,z=(0,S.useEngineStoreApi)(),Y=G.shapeName??G.dataBlock,K=(0,u.useStaticShape)(Y);U[0]!==Y?(s=e=>{let t=Y?.toLowerCase();return t?e.runtime.sequenceAliases.get(t):void 0},U[0]=Y,U[1]=s):s=U[1];let H=(0,S.useEngineSelector)(s);U[2]!==K.scene?(T=o.clone(K.scene),f=(0,l.processShapeScene)(T),T.traverse(N),h=new r.AnimationMixer(T),d=null,p=null,T.traverse(e=>{d||"Mount0"!==e.name||(d=e),p||"Mount1"!==e.name||(p=e)}),U[2]=K.scene,U[3]=f,U[4]=d,U[5]=p,U[6]=h,U[7]=T):(f=U[3],d=U[4],p=U[5],h=U[6],T=U[7]),U[8]!==f||U[9]!==d||U[10]!==p||U[11]!==h||U[12]!==T?(I={clonedScene:T,mixer:h,mount0:d,mount1:p,iflInitializers:f},U[8]=f,U[9]=d,U[10]=p,U[11]=h,U[12]=T,U[13]=I):I=U[13];let{clonedScene:Q,mixer:$,mount0:J,mount1:X,iflInitializers:Z}=I;U[14]===Symbol.for("react.memo_cache_sentinel")?(b=new Map,U[14]=b):b=U[14];let ee=(0,a.useRef)(b);U[15]===Symbol.for("react.memo_cache_sentinel")?(x={head:null,headside:null},U[15]=x):x=U[15];let et=(0,a.useRef)(x);U[16]===Symbol.for("react.memo_cache_sentinel")?(R=new Map,U[16]=R):R=U[16];let en=(0,a.useRef)(R),ea=(0,a.useRef)(null);U[17]===Symbol.for("react.memo_cache_sentinel")?(L={name:"root",timeScale:1},U[17]=L):L=U[17];let ei=(0,a.useRef)(L),er=(0,a.useRef)(!1),eo=(0,a.useRef)(void 0);if(U[18]!==z||U[19]!==Y){e:{let e=z.getState().playback,t=e.recording?.streamingPlayback,n=Y?.toLowerCase();if(!t||!n){let e;U[21]===Symbol.for("react.memo_cache_sentinel")?(e=new Map,U[21]=e):e=U[21],C=e;break e}let a=t.getShapeConstructorSequences(n);if(!a){let e;U[22]===Symbol.for("react.memo_cache_sentinel")?(e=new Map,U[22]=e):e=U[22],C=e;break e}C=function(e,t){let n=new Map,a=[];for(let n of e){let e=n.indexOf(" ");if(-1===e)continue;let i=n.slice(0,e).toLowerCase(),r=n.slice(e+1).trim().toLowerCase();if(!r||!i.startsWith(t)||!i.endsWith(".dsq"))continue;let o=i.slice(t.length,-4);o&&a.push({clipName:o,alias:r})}let i=new Set;for(let e=0;e{let e=(0,c.getAliasedActions)(K.animations,$,H);ee.current=e;let t=e.get("root");t&&t.play(),ei.current={name:"root",timeScale:1};let n={head:null,headside:null};for(let{key:e,names:t}of[{key:"head",names:["head"]},{key:"headside",names:["headside"]}]){let a=K.animations.find(e=>t.includes(e.name.toLowerCase()));if(!a)continue;let i=a.clone(),o=Math.round(30*a.duration/2);r.AnimationUtils.makeClipAdditive(i,o,a,30);let l=$.clipAction(i);l.blendMode=r.AdditiveAnimationBlendMode,l.timeScale=0,l.weight=1,l.play(),n[e]=l}et.current=n;let a=new Map,i=K.animations.find(M),o=i?Math.round(30*i.duration/2):0;for(let e of["lookde","lookms","looksn"]){let t=K.animations.find(t=>t.name.toLowerCase()===e);if(!t)continue;let n=t.clone(),l=i??t;r.AnimationUtils.makeClipAdditive(n,o,l,30);let s=$.clipAction(n);s.blendMode=r.AdditiveAnimationBlendMode,s.timeScale=0,s.weight=0,s.play(),a.set(e,s)}en.current=a;let l=a.get("lookde");return l&&(l.weight=1,ea.current="lookde"),$.update(0),()=>{$.stopAllAction(),ee.current=new Map,et.current={head:null,headside:null},en.current=new Map,ea.current=null}},O=[$,K.animations,H],U[23]=K.animations,U[24]=$,U[25]=H,U[26]=E,U[27]=O):(E=U[26],O=U[27]),(0,a.useEffect)(E,O),U[28]!==Z?(D=()=>{let e=[];for(let{mesh:t,initialize:n}of Z)n(t,A).then(t=>e.push(t)).catch(k);return()=>e.forEach(w)},P=[Z],U[28]=Z,U[29]=D,U[30]=P):(D=U[29],P=U[30]),(0,a.useEffect)(D,P);let es=(0,a.useRef)(G.weaponShape),[ec,eu]=(0,a.useState)(G.weaponShape),em=(0,a.useRef)(G.packShape),[ef,ed]=(0,a.useState)(G.packShape);return U[31]!==el||U[32]!==z||U[33]!==G.falling||U[34]!==G.headPitch||U[35]!==G.headYaw||U[36]!==G.jetting||U[37]!==G.keyframes||U[38]!==G.packShape||U[39]!==G.weaponShape||U[40]!==$?(F=(e,t)=>{G.weaponShape!==es.current&&(es.current=G.weaponShape,eu(G.weaponShape)),G.packShape!==em.current&&(em.current=G.packShape,ed(G.packShape));let n=z.getState().playback,a="playing"===n.status,i=g.streamPlaybackStore.getState().time,o=(0,l.getKeyframeAtTime)(G.keyframes??[],i),s=o?.damageState!=null&&o.damageState>=1,c=ee.current;if(s&&!er.current){er.current=!0;let e=null!=o.actionAnim?el.get(o.actionAnim):void 0;if(e){let t=c.get(e.clipName);if(t){let n=c.get(ei.current.name.toLowerCase());n&&n.fadeOut(l.ANIM_TRANSITION_TIME),t.setLoop(r.LoopOnce,1),t.clampWhenFinished=!0,t.reset().fadeIn(l.ANIM_TRANSITION_TIME).play(),ei.current={name:e.clipName,timeScale:1},eo.current=o.actionAnim}}}if(!s&&er.current){er.current=!1,eo.current=void 0;let e=c.get(ei.current.name.toLowerCase());e&&(e.stop(),e.setLoop(r.LoopRepeat,1/0),e.clampWhenFinished=!1),ei.current={name:"root",timeScale:1};let t=c.get("root");t&&t.reset().play()}let u=o?.actionAnim,m=eo.current;if(!er.current&&u!==m){eo.current=u;let e=null!=m&&m>=8;if(null!=u&&u>=8){let e=el.get(u);if(e){let t=c.get(e.clipName);if(t){let n=c.get(ei.current.name.toLowerCase());n&&n.fadeOut(l.ANIM_TRANSITION_TIME),t.setLoop(r.LoopOnce,1),t.clampWhenFinished=!0,t.reset().fadeIn(l.ANIM_TRANSITION_TIME).play(),ei.current={name:e.clipName,timeScale:1}}}}else if(e){let e=el.get(m);if(e){let t=c.get(e.clipName);t&&(t.fadeOut(l.ANIM_TRANSITION_TIME),t.setLoop(r.LoopRepeat,1/0),t.clampWhenFinished=!1)}ei.current={name:"root",timeScale:1};let t=c.get("root");t&&t.reset().fadeIn(l.ANIM_TRANSITION_TIME).play()}}if(null!=u&&u>=8&&o?.actionAtEnd){let e=el.get(u);if(e){let t=c.get(e.clipName);t&&(t.paused=!0)}}let f=null!=eo.current&&eo.current>=8;if(!er.current&&!f){let e=function(e,t,n,a){if(n)return{animation:"fall",timeScale:1};if(!e)return a?{animation:"jet",timeScale:1}:{animation:"root",timeScale:1};let[i,r,o]=e,l=-2*Math.atan2(t[1],t[3]),s=Math.cos(l),c=Math.sin(l),u=i*s+r*c,m=-i*c+r*s,f=-m,d=-u,p=Math.max(m,f,d,u);return p<.1?a?{animation:"jet",timeScale:1}:{animation:"root",timeScale:1}:p===m?{animation:"run",timeScale:1}:p===f?{animation:"back",timeScale:1}:p===d?{animation:"side",timeScale:1}:{animation:"side",timeScale:-1}}(o?.velocity,o?.rotation??[0,0,0,1],G.falling,G.jetting),t=ei.current;if(e.animation!==t.name||e.timeScale!==t.timeScale){let n=c.get(t.name.toLowerCase()),i=c.get(e.animation.toLowerCase());i&&(a&&n&&n!==i?(n.fadeOut(l.ANIM_TRANSITION_TIME),i.reset().fadeIn(l.ANIM_TRANSITION_TIME).play()):(n&&n!==i&&n.stop(),i.reset().play()),i.timeScale=e.timeScale,ei.current={name:e.animation,timeScale:e.timeScale})}}let d=function(e){if(!e)return"lookde";let t=e.toLowerCase();return t.includes("missile")?"lookms":t.includes("sniper")?"looksn":"lookde"}(G.weaponShape);if(d!==ea.current){let e=en.current,t=ea.current?e.get(ea.current):null,n=e.get(d);n&&(t&&(t.weight=0),n.weight=+!s,ea.current=d)}let{head:p,headside:h}=et.current,S=ea.current?en.current.get(ea.current):null,y=+!s,T=G.headPitch??0,I=G.headYaw??0,w=(T+1)/2;S&&(S.time=w*S.getClip().duration,S.weight=y),p&&(p.time=w*p.getClip().duration,p.weight=y),h&&(h.time=(I+1)/2*h.getClip().duration,h.weight=y),a?$.update(t*n.rate):$.update(0)},U[31]=el,U[32]=z,U[33]=G.falling,U[34]=G.headPitch,U[35]=G.headYaw,U[36]=G.jetting,U[37]=G.keyframes,U[38]=G.packShape,U[39]=G.weaponShape,U[40]=$,U[41]=F):F=U[41],(0,i.useFrame)(F),U[42]===Symbol.for("react.memo_cache_sentinel")?(B=[0,Math.PI/2,0],U[42]=B):B=U[42],U[43]!==Q?(j=(0,t.jsx)("group",{rotation:B,children:(0,t.jsx)("primitive",{object:Q})}),U[43]=Q,U[44]=j):j=U[44],U[45]!==ec||U[46]!==G||U[47]!==J?(q=ec&&J&&(0,t.jsx)(m.ShapeErrorBoundary,{fallback:null,children:(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(v,{entity:G,weaponShape:ec,mount0:J})})},ec),U[45]=ec,U[46]=G,U[47]=J,U[48]=q):q=U[48],U[49]!==ef||U[50]!==X?(V=ef&&X&&(0,t.jsx)(m.ShapeErrorBoundary,{fallback:null,children:(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(_,{packShape:ef,mountBone:X})})},ef),U[49]=ef,U[50]=X,U[51]=V):V=U[51],U[52]!==j||U[53]!==q||U[54]!==V?(W=(0,t.jsxs)(t.Fragment,{children:[j,q,V]}),U[52]=j,U[53]=q,U[54]=V,U[55]=W):W=U[55],W}function w(e){return e()}function k(){}function A(){return g.streamPlaybackStore.getState().time}function M(e){return"lookde"===e.name.toLowerCase()}function N(e){if(e.isMesh&&e.material)for(let t of Array.isArray(e.material)?e.material:[e.material])t.side=r.FrontSide}function v(e){let t,c,m,g,y,I,w,k,A,M,N,v,_,L,C=(0,n.c)(38),{entity:E,weaponShape:O,mount0:D}=e,P=(0,S.useEngineStoreApi)(),F=(0,u.useStaticShape)(O);if(C[0]!==F.animations||C[1]!==F.scene){t=o.clone(F.scene),c=(0,l.processShapeScene)(t);let e=(0,l.getPosedNodeTransform)(F.scene,F.animations,"Mountpoint");if(e){let n=e.quaternion.clone().invert(),a=e.position.clone().negate().applyQuaternion(n);t.position.copy(a),t.quaternion.copy(n)}g=new Map,t.traverse(e=>{if(!e.isMesh)return;let t=e.userData,n=(t?.vis_sequence??"").toLowerCase();if(!n)return;let a=g.get(n);a||(a=[],g.set(n,a)),a.push(e)}),m=new r.AnimationMixer(t),C[0]=F.animations,C[1]=F.scene,C[2]=t,C[3]=c,C[4]=m,C[5]=g}else t=C[2],c=C[3],m=C[4],g=C[5];let B=m,j=F.scene;C[6]!==j||C[7]!==F.animations?(y=function(e,t){let n=e.userData?.dts_sequence_names;if("string"==typeof n)try{return JSON.parse(n).map(e=>e.toLowerCase())}catch{}return t.map(e=>e.name.toLowerCase())}(j,F.animations),C[6]=j,C[7]=F.animations,C[8]=y):y=C[8];let q=y;C[9]!==t||C[10]!==c||C[11]!==B||C[12]!==q||C[13]!==g?(I={weaponClone:t,weaponMixer:B,seqIndexToName:q,visNodesBySequence:g,weaponIflInitializers:c},C[9]=t,C[10]=c,C[11]=B,C[12]=q,C[13]=g,C[14]=I):I=C[14];let{weaponClone:V,weaponMixer:W,seqIndexToName:U,visNodesBySequence:G,weaponIflInitializers:z}=I;C[15]===Symbol.for("react.memo_cache_sentinel")?(w=new Map,C[15]=w):w=C[15];let Y=(0,a.useRef)(w),K=(0,a.useRef)(null);C[16]!==F.animations||C[17]!==W?(k=()=>{let e=new Map;for(let t of F.animations)e.set(t.name.toLowerCase(),W.clipAction(t));Y.current=e;let t=e.get("spin");return t&&(t.setLoop(r.LoopRepeat,1/0),t.timeScale=0,t.play()),K.current=t??null,W.update(0),()=>{W.stopAllAction(),Y.current=new Map,K.current=null,T(et,en)}},A=[W,F.animations],C[16]=F.animations,C[17]=W,C[18]=k,C[19]=A):(k=C[18],A=C[19]),(0,a.useEffect)(k,A),C[20]!==z?(M=()=>{let e=[];for(let{mesh:t,initialize:n}of z)n(t,R).then(t=>e.push(t)).catch(x);return()=>e.forEach(b)},N=[z],C[20]=z,C[21]=M,C[22]=N):(M=C[21],N=C[22]),(0,a.useEffect)(M,N);let{audioLoader:H,audioListener:Q}=(0,f.useAudio)(),$=(0,h.useSettings)(),J=$?.audioEnabled??!1,X=(0,a.useRef)(null),Z=(0,a.useRef)(null),ee=(0,a.useRef)(E.weaponImageStates),et=(0,a.useRef)(null),en=(0,a.useRef)(-1);return C[23]!==D||C[24]!==V?(v=()=>(D.add(V),()=>{D.remove(V)}),_=[V,D],C[23]=D,C[24]=V,C[25]=v,C[26]=_):(v=C[25],_=C[26]),(0,a.useEffect)(v,_),C[27]!==J||C[28]!==Q||C[29]!==H||C[30]!==P||C[31]!==E.weaponImageState||C[32]!==E.weaponImageStates||C[33]!==U||C[34]!==G||C[35]!==V||C[36]!==W?(L=(e,t)=>{let n=P.getState().playback,a="playing"===n.status,i=Y.current,o=E.weaponImageState,c=E.weaponImageStates;c!==ee.current&&(ee.current=c,c&&c.length>0?X.current=new s(c,U):X.current=null,Z.current=null,T(et,en,V)),!X.current&&c&&c.length>0&&(X.current=new s(c,U));let u=X.current;if(u&&o&&a){let e=t*n.rate,a=u.tick(e,o);if(function(e,t,n,a){let i=e.sequenceName,o=n.current;if(i===o&&!e.transitioned)return;if(i!==o){if(o){let e=a.get(o);if(e)for(let t of e)t.visible=!1}if(i){let e=a.get(i);if(e)for(let t of e)t.visible=!0}}if(!i){if(o){let e=t.get(o);e&&e.fadeOut(l.ANIM_TRANSITION_TIME),n.current=null}return}let s=t.get(i);if(s&&(e.transitioned||i!==o)){let a=o?t.get(o):null;if(e.isFiring||e.timeoutValue>0?(s.setLoop(r.LoopOnce,1),s.clampWhenFinished=!0):(s.setLoop(r.LoopRepeat,1/0),s.clampWhenFinished=!1),e.scaleAnimation&&e.timeoutValue>0){let t=s.getClip().duration;s.timeScale=t>0?t/e.timeoutValue:1}else s.timeScale=e.reverse?-1:1;a&&a!==s?(a.fadeOut(l.ANIM_TRANSITION_TIME),s.reset().fadeIn(l.ANIM_TRANSITION_TIME).play()):s.reset().play(),n.current=i}}(a,i,Z,G),et.current&&a.stateIndex!==en.current&&T(et,en,V),J&&H&&Q&&a.soundDataBlockIds.length>0){let e=n.recording?.streamingPlayback.getDataBlockData.bind(n.recording.streamingPlayback);if(e)for(let t of a.soundDataBlockIds){let a=(0,d.resolveAudioProfile)(t,e);if(a)if(a.isLooping){if(!et.current)try{let e=(0,p.audioToUrl)(a.filename),t=(0,d.getSoundGeneration)();(0,d.getCachedAudioBuffer)(e,H,e=>{if(t!==(0,d.getSoundGeneration)()||et.current)return;let i=u.stateIndex,o=new r.PositionalAudio(Q);o.setBuffer(e),o.setDistanceModel("inverse"),o.setRefDistance(a.refDist),o.setMaxDistance(a.maxDist),o.setRolloffFactor(1),o.setVolume(a.volume),o.setPlaybackRate(n.rate),o.setLoop(!0),V.add(o),(0,d.trackSound)(o),o.play(),et.current=o,en.current=i})}catch{}}else(0,d.playOneShotSound)(a,Q,H,void 0,V)}}K.current&&(K.current.timeScale=a.spinTimeScale)}a?W.update(t*n.rate):W.update(0)},C[27]=J,C[28]=Q,C[29]=H,C[30]=P,C[31]=E.weaponImageState,C[32]=E.weaponImageStates,C[33]=U,C[34]=G,C[35]=V,C[36]=W,C[37]=L):L=C[37],(0,i.useFrame)(L),null}function b(e){return e()}function x(){}function R(){return g.streamPlaybackStore.getState().time}function _(e){let t,i,r,s,c,m,f,d=(0,n.c)(14),{packShape:p,mountBone:h}=e,S=(0,u.useStaticShape)(p);if(d[0]!==S.animations||d[1]!==S.scene){t=o.clone(S.scene),i=(0,l.processShapeScene)(t);let e=(0,l.getPosedNodeTransform)(S.scene,S.animations,"Mountpoint");if(e){let n=e.quaternion.clone().invert(),a=e.position.clone().negate().applyQuaternion(n);t.position.copy(a),t.quaternion.copy(n)}d[0]=S.animations,d[1]=S.scene,d[2]=t,d[3]=i}else t=d[2],i=d[3];d[4]!==t||d[5]!==i?(r={packClone:t,packIflInitializers:i},d[4]=t,d[5]=i,d[6]=r):r=d[6];let{packClone:g,packIflInitializers:y}=r;return d[7]!==h||d[8]!==g?(s=()=>(h.add(g),()=>{h.remove(g)}),c=[g,h],d[7]=h,d[8]=g,d[9]=s,d[10]=c):(s=d[9],c=d[10]),(0,a.useEffect)(s,c),d[11]!==y?(m=()=>{let e=[];for(let{mesh:t,initialize:n}of y)n(t,E).then(t=>e.push(t)).catch(C);return()=>e.forEach(L)},f=[y],d[11]=y,d[12]=m,d[13]=f):(m=d[12],f=d[13]),(0,a.useEffect)(m,f),null}function L(e){return e()}function C(){}function E(){return g.streamPlaybackStore.getState().time}function O(e){let t,i,r=(0,n.c)(7),{shapeName:o,eyeOffsetRef:s}=e,c=(0,u.useStaticShape)(o);return r[0]!==s||r[1]!==c.animations||r[2]!==c.scene?(t=()=>{let e=(0,l.getPosedNodeTransform)(c.scene,c.animations,"Eye");e?s.current.set(e.position.z,e.position.y,-e.position.x):s.current.set(0,l.DEFAULT_EYE_HEIGHT,0)},r[0]=s,r[1]=c.animations,r[2]=c.scene,r[3]=t):t=r[3],r[4]!==s||r[5]!==c?(i=[c,s],r[4]=s,r[5]=c,r[6]=i):i=r[6],(0,a.useEffect)(t,i),null}e.s(["PlayerEyeOffset",()=>O,"PlayerModel",()=>I],9721)}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/49bf5eb2ca42014f.js b/docs/_next/static/chunks/49bf5eb2ca42014f.js deleted file mode 100644 index 71a00783..00000000 --- a/docs/_next/static/chunks/49bf5eb2ca42014f.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,12631,e=>{"use strict";var t=e.i(71645),a=e.i(8155);let r=e=>{let r=(0,a.createStore)(e),n=e=>(function(e,a=e=>e){let r=t.default.useSyncExternalStore(e.subscribe,t.default.useCallback(()=>a(e.getState()),[e,a]),t.default.useCallback(()=>a(e.getInitialState()),[e,a]));return t.default.useDebugValue(r),r})(r,e);return Object.assign(n,r),n};var n=e.i(79473);let i=t.createContext(null);function o({map:e,children:a,onChange:o,domElement:s}){let l=e.map(e=>e.name+e.keys).join("-"),d=t.useMemo(()=>{let t;return(t=(0,n.subscribeWithSelector)(()=>e.reduce((e,t)=>({...e,[t.name]:!1}),{})))?r(t):r},[l]),c=t.useMemo(()=>[d.subscribe,d.getState,d],[l]),u=d.setState;return t.useEffect(()=>{let t=e.map(({name:e,keys:t,up:a})=>({keys:t,up:a,fn:t=>{u({[e]:t}),o&&o(e,t,c[1]())}})).reduce((e,{keys:t,fn:a,up:r=!0})=>(t.forEach(t=>e[t]={fn:a,pressed:!1,up:r}),e),{}),a=({key:e,code:a})=>{let r=t[e]||t[a];if(!r)return;let{fn:n,pressed:i,up:o}=r;r.pressed=!0,(o||!i)&&n(!0)},r=({key:e,code:a})=>{let r=t[e]||t[a];if(!r)return;let{fn:n,up:i}=r;r.pressed=!1,i&&n(!1)},n=s||window;return n.addEventListener("keydown",a,{passive:!0}),n.addEventListener("keyup",r,{passive:!0}),()=>{n.removeEventListener("keydown",a),n.removeEventListener("keyup",r)}},[s,l]),t.createElement(i.Provider,{value:c,children:a})}function s(e){let[a,r,n]=t.useContext(i);return e?n(e):[a,r]}e.s(["KeyboardControls",()=>o,"useKeyboardControls",()=>s],12631)},5729,e=>{"use strict";var t,a=e.i(43476),r=e.i(932),n=e.i(71645),i=e.i(90072),o=e.i(71753),s=e.i(15080),l=e.i(12631),d=e.i(85413),c=Object.defineProperty,u=(e,t,a)=>{let r;return(r="symbol"!=typeof t?t+"":t)in e?c(e,r,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[r]=a,a};let h=new i.Euler(0,0,0,"YXZ"),g=new i.Vector3,p={type:"change"},m={type:"lock"},f={type:"unlock"},F=Math.PI/2;class v extends d.EventDispatcher{constructor(e,t){super(),u(this,"camera"),u(this,"domElement"),u(this,"isLocked"),u(this,"minPolarAngle"),u(this,"maxPolarAngle"),u(this,"pointerSpeed"),u(this,"onMouseMove",e=>{this.domElement&&!1!==this.isLocked&&(h.setFromQuaternion(this.camera.quaternion),h.y-=.002*e.movementX*this.pointerSpeed,h.x-=.002*e.movementY*this.pointerSpeed,h.x=Math.max(F-this.maxPolarAngle,Math.min(F-this.minPolarAngle,h.x)),this.camera.quaternion.setFromEuler(h),this.dispatchEvent(p))}),u(this,"onPointerlockChange",()=>{this.domElement&&(this.domElement.ownerDocument.pointerLockElement===this.domElement?(this.dispatchEvent(m),this.isLocked=!0):(this.dispatchEvent(f),this.isLocked=!1))}),u(this,"onPointerlockError",()=>{console.error("THREE.PointerLockControls: Unable to use Pointer Lock API")}),u(this,"connect",e=>{this.domElement=e||this.domElement,this.domElement&&(this.domElement.ownerDocument.addEventListener("mousemove",this.onMouseMove),this.domElement.ownerDocument.addEventListener("pointerlockchange",this.onPointerlockChange),this.domElement.ownerDocument.addEventListener("pointerlockerror",this.onPointerlockError))}),u(this,"disconnect",()=>{this.domElement&&(this.domElement.ownerDocument.removeEventListener("mousemove",this.onMouseMove),this.domElement.ownerDocument.removeEventListener("pointerlockchange",this.onPointerlockChange),this.domElement.ownerDocument.removeEventListener("pointerlockerror",this.onPointerlockError))}),u(this,"dispose",()=>{this.disconnect()}),u(this,"getObject",()=>this.camera),u(this,"direction",new i.Vector3(0,0,-1)),u(this,"getDirection",e=>e.copy(this.direction).applyQuaternion(this.camera.quaternion)),u(this,"moveForward",e=>{g.setFromMatrixColumn(this.camera.matrix,0),g.crossVectors(this.camera.up,g),this.camera.position.addScaledVector(g,e)}),u(this,"moveRight",e=>{g.setFromMatrixColumn(this.camera.matrix,0),this.camera.position.addScaledVector(g,e)}),u(this,"lock",()=>{this.domElement&&this.domElement.requestPointerLock()}),u(this,"unlock",()=>{this.domElement&&this.domElement.ownerDocument.exitPointerLock()}),this.camera=e,this.domElement=t,this.isLocked=!1,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.pointerSpeed=1,t&&this.connect(t)}}var y=e.i(79123),S=e.i(68294),k=e.i(93784);(t={}).forward="forward",t.backward="backward",t.left="left",t.right="right",t.up="up",t.down="down",t.lookUp="lookUp",t.lookDown="lookDown",t.lookLeft="lookLeft",t.lookRight="lookRight",t.camera1="camera1",t.camera2="camera2",t.camera3="camera3",t.camera4="camera4",t.camera5="camera5",t.camera6="camera6",t.camera7="camera7",t.camera8="camera8",t.camera9="camera9";let b=Math.PI/2-.01;function P(){let e,t,a,d,c,u,h,g,p,m,f,F,P,x=(0,r.c)(26),{speedMultiplier:I,setSpeedMultiplier:D}=(0,y.useControls)(),[C,E]=(0,l.useKeyboardControls)(),{camera:w,gl:M}=(0,s.useThree)(),{nextCamera:B,setCameraIndex:T,cameraCount:R}=(0,S.useCameras)(),N=(0,n.useRef)(null);x[0]===Symbol.for("react.memo_cache_sentinel")?(e=new i.Vector3,x[0]=e):e=x[0];let G=(0,n.useRef)(e);x[1]===Symbol.for("react.memo_cache_sentinel")?(t=new i.Vector3,x[1]=t):t=x[1];let A=(0,n.useRef)(t);x[2]===Symbol.for("react.memo_cache_sentinel")?(a=new i.Vector3,x[2]=a):a=x[2];let U=(0,n.useRef)(a);x[3]===Symbol.for("react.memo_cache_sentinel")?(d=new i.Euler(0,0,0,"YXZ"),x[3]=d):d=x[3];let j=(0,n.useRef)(d);return x[4]!==w||x[5]!==M.domElement?(c=()=>{let e=new v(w,M.domElement);return N.current=e,()=>{e.dispose()}},u=[w,M.domElement],x[4]=w,x[5]=M.domElement,x[6]=c,x[7]=u):(c=x[6],u=x[7]),(0,n.useEffect)(c,u),x[8]!==w||x[9]!==M.domElement||x[10]!==B?(h=()=>{let e=M.domElement,t=new i.Euler(0,0,0,"YXZ"),a=!1,r=!1,n=0,o=0,s=t=>{N.current?.isLocked||t.target===e&&(a=!0,r=!1,n=t.clientX,o=t.clientY)},l=e=>{!a||!r&&3>Math.abs(e.clientX-n)&&3>Math.abs(e.clientY-o)||(r=!0,t.setFromQuaternion(w.quaternion,"YXZ"),t.y=t.y-.003*e.movementX,t.x=t.x-.003*e.movementY,t.x=Math.max(-b,Math.min(b,t.x)),w.quaternion.setFromEuler(t))},d=()=>{a=!1},c=t=>{let a=N.current;!a||a.isLocked?B():t.target!==e||r||a.lock()};return e.addEventListener("mousedown",s),document.addEventListener("mousemove",l),document.addEventListener("mouseup",d),document.addEventListener("click",c),()=>{e.removeEventListener("mousedown",s),document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",d),document.removeEventListener("click",c)}},g=[w,M.domElement,B],x[8]=w,x[9]=M.domElement,x[10]=B,x[11]=h,x[12]=g):(h=x[11],g=x[12]),(0,n.useEffect)(h,g),x[13]!==R||x[14]!==T||x[15]!==C?(p=()=>{let e=["camera1","camera2","camera3","camera4","camera5","camera6","camera7","camera8","camera9"];return C(t=>{for(let a=0;a{let e=e=>{e.preventDefault();let t=e.deltaY>0?-1:1,a=Math.max(.05,Math.min(.5,Math.abs(.01*e.deltaY)))*t;D(e=>Math.max(.1,Math.min(5,Math.round((e+a)*20)/20)))},t=M.domElement;return t.addEventListener("wheel",e,{passive:!1}),()=>{t.removeEventListener("wheel",e)}},F=[M.domElement,D],x[18]=M.domElement,x[19]=D,x[20]=f,x[21]=F):(f=x[20],F=x[21]),(0,n.useEffect)(f,F),x[22]!==w||x[23]!==E||x[24]!==I?(P=(e,t)=>{let a=k.streamPlaybackStore.getState();if(a.playback&&!a.freeFlyCamera)return;let{forward:r,backward:n,left:i,right:o,up:s,down:l,lookUp:d,lookDown:c,lookLeft:u,lookRight:h}=E();if((d||c||u||h)&&(j.current.setFromQuaternion(w.quaternion,"YXZ"),u&&(j.current.y=j.current.y+ +t),h&&(j.current.y=j.current.y-t),d&&(j.current.x=j.current.x+ +t),c&&(j.current.x=j.current.x-t),j.current.x=Math.max(-b,Math.min(b,j.current.x)),w.quaternion.setFromEuler(j.current)),!r&&!n&&!i&&!o&&!s&&!l)return;let g=80*I;w.getWorldDirection(G.current),G.current.normalize(),A.current.crossVectors(w.up,G.current).normalize(),U.current.set(0,0,0),r&&U.current.add(G.current),n&&U.current.sub(G.current),i&&U.current.add(A.current),o&&U.current.sub(A.current),s&&(U.current.y=U.current.y+1),l&&(U.current.y=U.current.y-1),U.current.lengthSq()>0&&(U.current.normalize().multiplyScalar(g*t),w.position.add(U.current))},x[22]=w,x[23]=E,x[24]=I,x[25]=P):P=x[25],(0,o.useFrame)(P),null}function x(){let e,t,i=(0,r.c)(2);return i[0]===Symbol.for("react.memo_cache_sentinel")?(e=[],i[0]=e):e=i[0],(0,n.useEffect)(I,e),i[1]===Symbol.for("react.memo_cache_sentinel")?(t=(0,a.jsx)(P,{}),i[1]=t):t=i[1],t}function I(){return window.addEventListener("keydown",D,{capture:!0}),window.addEventListener("keyup",D,{capture:!0}),()=>{window.removeEventListener("keydown",D,{capture:!0}),window.removeEventListener("keyup",D,{capture:!0})}}function D(e){(e.metaKey||e.ctrlKey)&&"k"===e.key||e.metaKey&&e.stopImmediatePropagation()}e.s(["ARROW_LOOK_SPEED",0,1,"KEYBOARD_CONTROLS",0,[{name:"forward",keys:["KeyW"]},{name:"backward",keys:["KeyS"]},{name:"left",keys:["KeyA"]},{name:"right",keys:["KeyD"]},{name:"up",keys:["Space"]},{name:"down",keys:["ShiftLeft","ShiftRight"]},{name:"lookUp",keys:["ArrowUp"]},{name:"lookDown",keys:["ArrowDown"]},{name:"lookLeft",keys:["ArrowLeft"]},{name:"lookRight",keys:["ArrowRight"]},{name:"camera1",keys:["Digit1"]},{name:"camera2",keys:["Digit2"]},{name:"camera3",keys:["Digit3"]},{name:"camera4",keys:["Digit4"]},{name:"camera5",keys:["Digit5"]},{name:"camera6",keys:["Digit6"]},{name:"camera7",keys:["Digit7"]},{name:"camera8",keys:["Digit8"]},{name:"camera9",keys:["Digit9"]}],"MOUSE_SENSITIVITY",0,.003,"ObserverControls",()=>x],5729)},76775,(e,t,a)=>{function r(e,t,a,r){return Math.round(e/a)+" "+r+(t>=1.5*a?"s":"")}t.exports=function(e,t){t=t||{};var a,n,i,o,s=typeof e;if("string"===s&&e.length>0){var l=e;if(!((l=String(l)).length>100)){var d=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(l);if(d){var c=parseFloat(d[1]);switch((d[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*c;case"weeks":case"week":case"w":return 6048e5*c;case"days":case"day":case"d":return 864e5*c;case"hours":case"hour":case"hrs":case"hr":case"h":return 36e5*c;case"minutes":case"minute":case"mins":case"min":case"m":return 6e4*c;case"seconds":case"second":case"secs":case"sec":case"s":return 1e3*c;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:break}}}return}if("number"===s&&isFinite(e)){return t.long?(n=Math.abs(a=e))>=864e5?r(a,n,864e5,"day"):n>=36e5?r(a,n,36e5,"hour"):n>=6e4?r(a,n,6e4,"minute"):n>=1e3?r(a,n,1e3,"second"):a+" ms":(o=Math.abs(i=e))>=864e5?Math.round(i/864e5)+"d":o>=36e5?Math.round(i/36e5)+"h":o>=6e4?Math.round(i/6e4)+"m":o>=1e3?Math.round(i/1e3)+"s":i+"ms"}throw Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},7003,(e,t,a)=>{t.exports=function(t){function a(e){let t,n,i,o=null;function s(...e){if(!s.enabled)return;let r=Number(new Date);s.diff=r-(t||r),s.prev=t,s.curr=r,t=r,e[0]=a.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let n=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,(t,r)=>{if("%%"===t)return"%";n++;let i=a.formatters[r];if("function"==typeof i){let a=e[n];t=i.call(s,a),e.splice(n,1),n--}return t}),a.formatArgs.call(s,e),(s.log||a.log).apply(s,e)}return s.namespace=e,s.useColors=a.useColors(),s.color=a.selectColor(e),s.extend=r,s.destroy=a.destroy,Object.defineProperty(s,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(n!==a.namespaces&&(n=a.namespaces,i=a.enabled(e)),i),set:e=>{o=e}}),"function"==typeof a.init&&a.init(s),s}function r(e,t){let r=a(this.namespace+(void 0===t?":":t)+e);return r.log=this.log,r}function n(e,t){let a=0,r=0,n=-1,i=0;for(;a"-"+e)].join(",");return a.enable(""),e},a.enable=function(e){for(let t of(a.save(e),a.namespaces=e,a.names=[],a.skips=[],("string"==typeof e?e:"").trim().replace(/\s+/g,",").split(",").filter(Boolean)))"-"===t[0]?a.skips.push(t.slice(1)):a.names.push(t)},a.enabled=function(e){for(let t of a.skips)if(n(e,t))return!1;for(let t of a.names)if(n(e,t))return!0;return!1},a.humanize=e.r(76775),a.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(t).forEach(e=>{a[e]=t[e]}),a.names=[],a.skips=[],a.formatters={},a.selectColor=function(e){let t=0;for(let a=0;a{let r;var n=e.i(47167);a.formatArgs=function(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+t.exports.humanize(this.diff),!this.useColors)return;let a="color: "+this.color;e.splice(1,0,a,"color: inherit");let r=0,n=0;e[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(r++,"%c"===e&&(n=r))}),e.splice(n,0,a)},a.save=function(e){try{e?a.storage.setItem("debug",e):a.storage.removeItem("debug")}catch(e){}},a.load=function(){let e;try{e=a.storage.getItem("debug")||a.storage.getItem("DEBUG")}catch(e){}return!e&&void 0!==n.default&&"env"in n.default&&(e=n.default.env.DEBUG),e},a.useColors=function(){let e;return"u">typeof window&&!!window.process&&("renderer"===window.process.type||!!window.process.__nwjs)||!("u">typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("u">typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"u">typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"u">typeof navigator&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||"u">typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},a.storage=function(){try{return localStorage}catch(e){}}(),r=!1,a.destroy=()=>{r||(r=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))},a.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],a.log=console.debug||console.log||(()=>{}),t.exports=e.r(7003)(a);let{formatters:i}=t.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},50593,17711,58281,45853,25311,89119,10244,e=>{"use strict";var t={},a=function(e,a,r,n,i){var o=new Worker(t[a]||(t[a]=URL.createObjectURL(new Blob([e+';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'],{type:"text/javascript"}))));return o.onmessage=function(e){var t=e.data,a=t.$e$;if(a){var r=Error(a[0]);r.code=a[1],r.stack=a[2],i(r,null)}else i(null,t)},o.postMessage(r,n),o},r=Uint8Array,n=Uint16Array,i=Int32Array,o=new r([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),s=new r([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),l=new r([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),d=function(e,t){for(var a=new n(31),r=0;r<31;++r)a[r]=t+=1<>1|(21845&F)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,f[F]=((65280&v)>>8|(255&v)<<8)>>1}for(var y=function(e,t,a){for(var r,i=e.length,o=0,s=new n(t);o>d]=c}else for(o=0,r=new n(i);o>15-e[o]);return r},S=new r(288),F=0;F<144;++F)S[F]=8;for(var F=144;F<256;++F)S[F]=9;for(var F=256;F<280;++F)S[F]=7;for(var F=280;F<288;++F)S[F]=8;for(var k=new r(32),F=0;F<32;++F)k[F]=5;var b=y(S,9,0),P=y(S,9,1),x=y(k,5,0),I=y(k,5,1),D=function(e){for(var t=e[0],a=1;at&&(t=e[a]);return t},C=function(e,t,a){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(7&t)&a},E=function(e,t){var a=t/8|0;return(e[a]|e[a+1]<<8|e[a+2]<<16)>>(7&t)},w=function(e){return(e+7)/8|0},M=function(e,t,a){return(null==t||t<0)&&(t=0),(null==a||a>e.length)&&(a=e.length),new r(e.subarray(t,a))},B=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],T=function(e,t,a){var r=Error(t||B[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,T),!a)throw r;return r},R=function(e,t,a,n){var i=e.length,d=n?n.length:0;if(!i||t.f&&!t.l)return a||new r(0);var c=!a,h=c||2!=t.i,g=t.i;c&&(a=new r(3*i));var m=function(e){var t=a.length;if(e>t){var n=new r(Math.max(2*t,e));n.set(a),a=n}},f=t.f||0,F=t.p||0,v=t.b||0,S=t.l,k=t.d,b=t.m,x=t.n,B=8*i;do{if(!S){f=C(e,F,1);var R=C(e,F+1,3);if(F+=3,R)if(1==R)S=P,k=I,b=9,x=5;else if(2==R){var N=C(e,F,31)+257,G=C(e,F+10,15)+4,A=N+C(e,F+5,31)+1;F+=14;for(var U=new r(A),j=new r(19),O=0;O>4;if(q<16)U[O++]=q;else{var $=0,H=0;for(16==q?(H=3+C(e,F,3),F+=2,$=U[O-1]):17==q?(H=3+C(e,F,7),F+=3):18==q&&(H=11+C(e,F,127),F+=7);H--;)U[O++]=$}}var W=U.subarray(0,N),X=U.subarray(N);b=D(W),x=D(X),S=y(W,b,1),k=y(X,x,1)}else T(1);else{var q=w(F)+4,Z=e[q-4]|e[q-3]<<8,Y=q+Z;if(Y>i){g&&T(0);break}h&&m(v+Z),a.set(e.subarray(q,Y),v),t.b=v+=Z,t.p=F=8*Y,t.f=f;continue}if(F>B){g&&T(0);break}}h&&m(v+131072);for(var J=(1<>4;if((F+=15&$)>B){g&&T(0);break}if($||T(2),ee<256)a[v++]=ee;else if(256==ee){Q=F,S=null;break}else{var et=ee-254;if(ee>264){var O=ee-257,ea=o[O];et=C(e,F,(1<>4;er||T(3),F+=15&er;var X=p[en];if(en>3){var ea=s[en];X+=E(e,F)&(1<B){g&&T(0);break}h&&m(v+131072);var ei=v+et;if(v>8},G=function(e,t,a){a<<=7&t;var r=t/8|0;e[r]|=a,e[r+1]|=a>>8,e[r+2]|=a>>16},A=function(e,t){for(var a=[],i=0;ip&&(p=s[i].s);var m=new n(p+1),f=U(a[h-1],m,0);if(f>t){var i=0,F=0,v=f-t,y=1<t)F+=y-(1<>=v;F>0;){var k=s[i].s;m[k]=0&&F;--i){var b=s[i].s;m[b]==t&&(--m[b],++F)}f=t}return{t:new r(m),l:f}},U=function(e,t,a){return -1==e.s?Math.max(U(e.l,t,a+1),U(e.r,t,a+1)):t[e.s]=a},j=function(e){for(var t=e.length;t&&!e[--t];);for(var a=new n(++t),r=0,i=e[0],o=1,s=function(e){a[r++]=e},l=1;l<=t;++l)if(e[l]==i&&l!=t)++o;else{if(!i&&o>2){for(;o>138;o-=138)s(32754);o>2&&(s(o>10?o-11<<5|28690:o-3<<5|12305),o=0)}else if(o>3){for(s(i),--o;o>6;o-=6)s(8304);o>2&&(s(o-3<<5|8208),o=0)}for(;o--;)s(i);o=1,i=e[l]}return{c:a.subarray(0,r),n:t}},O=function(e,t){for(var a=0,r=0;r>8,e[n+2]=255^e[n],e[n+3]=255^e[n+1];for(var i=0;i4&&!$[l[W-1]];--W);var X=g+5<<3,Z=O(i,S)+O(d,k)+c,Y=O(i,I)+O(d,E)+c+14+3*W+O(V,$)+2*V[16]+3*V[17]+7*V[18];if(h>=0&&X<=Z&&X<=Y)return z(t,p,e.subarray(h,h+g));if(N(t,p,1+(Y15&&(N(t,p,ee[_]>>5&127),p+=ee[_]>>12)}}else m=b,f=S,F=x,v=k;for(var _=0;_255){var et=ea>>18&31;G(t,p,m[et+257]),p+=f[et+257],et>7&&(N(t,p,ea>>23&31),p+=o[et]);var er=31&ea;G(t,p,F[er]),p+=v[er],er>3&&(G(t,p,ea>>5&8191),p+=s[er])}else G(t,p,m[ea]),p+=f[ea]}return G(t,p,m[256]),p+f[256]},V=new i([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),_=new r(0),q=function(e,t,a,l,d,c){var u=c.z||e.length,g=new r(l+u+5*(1+Math.ceil(u/7e3))+d),p=g.subarray(l,g.length-d),f=c.l,F=7&(c.r||0);if(t){F&&(p[0]=c.r>>3);for(var v=V[t-1],y=v>>13,S=8191&v,k=(1<7e3||G>24576)&&(q>423||!f)){F=L(e,p,0,C,E,B,R,G,U,N-U,F),G=T=R=0,U=N;for(var $=0;$<286;++$)E[$]=0;for(var $=0;$<30;++$)B[$]=0}var H=2,W=0,X=S,Z=O-_&32767;if(q>2&&j==D(N-Z))for(var Y=Math.min(y,q)-1,J=Math.min(32767,N),K=Math.min(258,q);Z<=J&&--X&&O!=_;){if(e[N+H]==e[N+H-Z]){for(var Q=0;QH){if(H=Q,W=Z,Q>Y)break;for(var ee=Math.min(Z,Q-2),et=0,$=0;$et&&(et=en,_=ea)}}}_=b[O=_],Z+=O-_&32767}if(W){C[G++]=0x10000000|h[H]<<18|m[W];var ei=31&h[H],eo=31&m[W];R+=o[ei]+s[eo],++E[257+ei],++B[eo],A=N+H,++T}else C[G++]=e[N],++E[e[N]]}}for(N=Math.max(N,A);N=u&&(p[F/8|0]=f,es=u),F=z(p,F+1,e.subarray(N,es))}c.i=u}return M(g,0,l+w(F)+d)},$=function(){for(var e=new Int32Array(256),t=0;t<256;++t){for(var a=t,r=9;--r;)a=(1&a&&-0x12477ce0)^a>>>1;e[t]=a}return e}(),H=function(){var e=-1;return{p:function(t){for(var a=e,r=0;r>>8;e=a},d:function(){return~e}}},W=function(){var e=1,t=0;return{p:function(a){for(var r=e,n=t,i=0|a.length,o=0;o!=i;){for(var s=Math.min(o+2655,i);o>16),n=(65535&n)+15*(n>>16)}e=r,t=n},d:function(){return e%=65521,t%=65521,(255&e)<<24|(65280&e)<<8|(255&t)<<8|t>>8}}},X=function(e,t,a,n,i){if(!i&&(i={l:1},t.dictionary)){var o=t.dictionary.subarray(-32768),s=new r(o.length+e.length);s.set(o),s.set(e,o.length),e=s,i.w=o.length}return q(e,null==t.level?6:t.level,null==t.mem?i.l?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(e.length)))):20:12+t.mem,a,n,i)},Z=function(e,t){var a={};for(var r in e)a[r]=e[r];for(var r in t)a[r]=t[r];return a},Y=function(e,t,a){for(var r=e(),n=e.toString(),i=n.slice(n.indexOf("[")+1,n.lastIndexOf("]")).replace(/\s+/g,"").split(","),o=0;o>>0},eu=function(e,t){return ec(e,t)+0x100000000*ec(e,t+4)},eh=function(e,t,a){for(;a;++t)e[t]=a,a>>>=8},eg=function(e,t){var a=t.filename;if(e[0]=31,e[1]=139,e[2]=8,e[8]=t.level<2?4:2*(9==t.level),e[9]=3,0!=t.mtime&&eh(e,4,Math.floor(new Date(t.mtime||Date.now())/1e3)),a){e[3]=8;for(var r=0;r<=a.length;++r)e[r+10]=a.charCodeAt(r)}},ep=function(e){(31!=e[0]||139!=e[1]||8!=e[2])&&T(6,"invalid gzip data");var t=e[3],a=10;4&t&&(a+=(e[10]|e[11]<<8)+2);for(var r=(t>>3&1)+(t>>4&1);r>0;r-=!e[a++]);return a+(2&t)},em=function(e){var t=e.length;return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0},ef=function(e){return 10+(e.filename?e.filename.length+1:0)},eF=function(e,t){var a=t.level;if(e[0]=120,e[1]=(0==a?0:a<6?1:9==a?3:2)<<6|(t.dictionary&&32),e[1]|=31-(e[0]<<8|e[1])%31,t.dictionary){var r=W();r.p(t.dictionary),eh(e,2,r.d())}},ev=function(e,t){return((15&e[0])!=8||e[0]>>4>7||(e[0]<<8|e[1])%31)&&T(6,"invalid zlib data"),(e[1]>>5&1)==+!t&&T(6,"invalid zlib data: "+(32&e[1]?"need":"unexpected")+" dictionary"),(e[1]>>3&4)+2};function ey(e,t){return"function"==typeof e&&(t=e,e={}),this.ondata=t,e}var eS=function(){function e(e,t){if("function"==typeof e&&(t=e,e={}),this.ondata=t,this.o=e||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new r(98304),this.o.dictionary){var a=this.o.dictionary.subarray(-32768);this.b.set(a,32768-a.length),this.s.i=32768-a.length}}return e.prototype.p=function(e,t){this.ondata(X(e,this.o,0,0,this.s),t)},e.prototype.push=function(e,t){this.ondata||T(5),this.s.l&&T(4);var a=e.length+this.s.z;if(a>this.b.length){if(a>2*this.b.length-32768){var n=new r(-32768&a);n.set(this.b.subarray(0,this.s.z)),this.b=n}var i=this.b.length-this.s.z;this.b.set(e.subarray(0,i),this.s.z),this.s.z=this.b.length,this.p(this.b,!1),this.b.set(this.b.subarray(-32768)),this.b.set(e.subarray(i),32768),this.s.z=e.length-i+32768,this.s.i=32766,this.s.w=32768}else this.b.set(e,this.s.z),this.s.z+=e.length;this.s.l=1&t,(this.s.z>this.s.w+8191||t)&&(this.p(this.b,t||!1),this.s.w=this.s.i,this.s.i-=2)},e.prototype.flush=function(){this.ondata||T(5),this.s.l&&T(4),this.p(this.b,!1),this.s.w=this.s.i,this.s.i-=2},e}(),ek=function(e,t){el([et,function(){return[es,eS]}],this,ey.call(this,e,t),function(e){onmessage=es(new eS(e.data))},6,1)};function eb(e,t){return X(e,t||{},0,0)}var eP=function(){function e(e,t){"function"==typeof e&&(t=e,e={}),this.ondata=t;var a=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:a?a.length:0},this.o=new r(32768),this.p=new r(0),a&&this.o.set(a)}return e.prototype.e=function(e){if(this.ondata||T(5),this.d&&T(4),this.p.length){if(e.length){var t=new r(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,a=R(this.p,this.s,this.o);this.ondata(M(a,t,this.s.b),this.d),this.o=M(a,this.s.b-32768),this.s.b=this.o.length,this.p=M(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}(),ex=function(e,t){el([ee,function(){return[es,eP]}],this,ey.call(this,e,t),function(e){onmessage=es(new eP(e.data))},7,0)};function eI(e,t){return R(e,{i:2},t&&t.out,t&&t.dictionary)}(function(){function e(e,t){this.c=H(),this.l=0,this.v=1,eS.call(this,e,t)}e.prototype.push=function(e,t){this.c.p(e),this.l+=e.length,eS.prototype.push.call(this,e,t)},e.prototype.p=function(e,t){var a=X(e,this.o,this.v&&ef(this.o),t&&8,this.s);this.v&&(eg(a,this.o),this.v=0),t&&(eh(a,a.length-8,this.c.d()),eh(a,a.length-4,this.l)),this.ondata(a,t)},e.prototype.flush=function(){eS.prototype.flush.call(this)}})();var eD=function(){function e(e,t){this.v=1,this.r=0,eP.call(this,e,t)}return e.prototype.push=function(e,t){if(eP.prototype.e.call(this,e),this.r+=e.length,this.v){var a=this.p.subarray(this.v-1),n=a.length>3?ep(a):4;if(n>a.length){if(!t)return}else this.v>1&&this.onmember&&this.onmember(this.r-a.length);this.p=a.subarray(n),this.v=0}eP.prototype.c.call(this,t),!this.s.f||this.s.l||t||(this.v=w(this.s.p)+9,this.s={i:0},this.o=new r(0),this.push(new r(0),t))},e}(),eC=function(e,t){var a=this;el([ee,ea,function(){return[es,eP,eD]}],this,ey.call(this,e,t),function(e){var t=new eD(e.data);t.onmember=function(e){return postMessage(e)},onmessage=es(t)},9,0,function(e){return a.onmember&&a.onmember(e)})},eE=(function(){function e(e,t){this.c=W(),this.v=1,eS.call(this,e,t)}e.prototype.push=function(e,t){this.c.p(e),eS.prototype.push.call(this,e,t)},e.prototype.p=function(e,t){var a=X(e,this.o,this.v&&(this.o.dictionary?6:2),t&&4,this.s);this.v&&(eF(a,this.o),this.v=0),t&&eh(a,a.length-4,this.c.d()),this.ondata(a,t)},e.prototype.flush=function(){eS.prototype.flush.call(this)}}(),function(){function e(e,t){eP.call(this,e,t),this.v=e&&e.dictionary?2:1}return e.prototype.push=function(e,t){if(eP.prototype.e.call(this,e),this.v){if(this.p.length<6&&!t)return;this.p=this.p.subarray(ev(this.p,this.v-1)),this.v=0}t&&(this.p.length<4&&T(6,"invalid zlib data"),this.p=this.p.subarray(0,-4)),eP.prototype.c.call(this,t)},e}()),ew=function(e,t){el([ee,er,function(){return[es,eP,eE]}],this,ey.call(this,e,t),function(e){onmessage=es(new eE(e.data))},11,0)},eM=function(){function e(e,t){this.o=ey.call(this,e,t)||{},this.G=eD,this.I=eP,this.Z=eE}return e.prototype.i=function(){var e=this;this.s.ondata=function(t,a){e.ondata(t,a)}},e.prototype.push=function(e,t){if(this.ondata||T(5),this.s)this.s.push(e,t);else{if(this.p&&this.p.length){var a=new r(this.p.length+e.length);a.set(this.p),a.set(e,this.p.length)}else this.p=e;this.p.length>2&&(this.s=31==this.p[0]&&139==this.p[1]&&8==this.p[2]?new this.G(this.o):(15&this.p[0])!=8||this.p[0]>>4>7||(this.p[0]<<8|this.p[1])%31?new this.I(this.o):new this.Z(this.o),this.i(),this.s.push(this.p,t),this.p=null)}},e}();function eB(e,t){eM.call(this,e,t),this.queuedSize=0,this.G=eC,this.I=ex,this.Z=ew}eB.prototype.i=function(){var e=this;this.s.ondata=function(t,a,r){e.ondata(t,a,r)},this.s.ondrain=function(t){e.queuedSize-=t,e.ondrain&&e.ondrain(t)}},eB.prototype.push=function(e,t){this.queuedSize+=e.length,eM.prototype.push.call(this,e,t)};var eT="u">typeof TextEncoder&&new TextEncoder,eR="u">typeof TextDecoder&&new TextDecoder,eN=0;try{eR.decode(_,{stream:!0}),eN=1}catch(e){}var eG=function(e){for(var t="",a=0;;){var r=e[a++],n=(r>127)+(r>223)+(r>239);if(a+n>e.length)return{s:t,r:M(e,a-1)};n?3==n?t+=String.fromCharCode(55296|(r=((15&r)<<18|(63&e[a++])<<12|(63&e[a++])<<6|63&e[a++])-65536)>>10,56320|1023&r):1&n?t+=String.fromCharCode((31&r)<<6|63&e[a++]):t+=String.fromCharCode((15&r)<<12|(63&e[a++])<<6|63&e[a++]):t+=String.fromCharCode(r)}};function eA(e,t){if(t){for(var a=new r(e.length),n=0;n>1)),s=0,l=function(e){o[s++]=e},n=0;no.length){var d=new r(s+8+(i-n<<1));d.set(o),o=d}var c=e.charCodeAt(n);c<128||t?l(c):(c<2048?l(192|c>>6):(c>55295&&c<57344?(l(240|(c=65536+(1047552&c)|1023&e.charCodeAt(++n))>>18),l(128|c>>12&63)):l(224|c>>12),l(128|c>>6&63)),l(128|63&c))}return M(o,0,s)}(function(e){this.ondata=e,eN?this.t=new TextDecoder:this.p=_}).prototype.push=function(e,t){if(this.ondata||T(5),t=!!t,this.t){this.ondata(this.t.decode(e,{stream:!0}),t),t&&(this.t.decode().length&&T(8),this.t=null);return}this.p||T(4);var a=new r(this.p.length+e.length);a.set(this.p),a.set(e,this.p.length);var n=eG(a),i=n.s,o=n.r;t?(o.length&&T(8),this.p=null):this.p=o,this.ondata(i,t)},(function(e){this.ondata=e}).prototype.push=function(e,t){this.ondata||T(5),this.d&&T(4),this.ondata(eA(e),this.d=t||!1)};var eU=function(e){return 1==e?3:e<6?2:+(9==e)},ej=function(e,t){for(;1!=ed(e,t);t+=4+ed(e,t+2));return[eu(e,t+12),eu(e,t+4),eu(e,t+20)]},eO=function(e){var t=0;if(e)for(var a in e){var r=e[a].length;r>65535&&T(9),t+=r+4}return t},ez=function(e,t,a,r,n,i,o,s){var l=r.length,d=a.extra,c=s&&s.length,u=eO(d);eh(e,t,null!=o?0x2014b50:0x4034b50),t+=4,null!=o&&(e[t++]=20,e[t++]=a.os),e[t]=20,t+=2,e[t++]=a.flag<<1|(i<0&&8),e[t++]=n&&8,e[t++]=255&a.compression,e[t++]=a.compression>>8;var h=new Date(null==a.mtime?Date.now():a.mtime),g=h.getFullYear()-1980;if((g<0||g>119)&&T(10),eh(e,t,g<<25|h.getMonth()+1<<21|h.getDate()<<16|h.getHours()<<11|h.getMinutes()<<5|h.getSeconds()>>1),t+=4,-1!=i&&(eh(e,t,a.crc),eh(e,t+4,i<0?-i-2:i),eh(e,t+8,a.size)),eh(e,t+12,l),eh(e,t+14,u),t+=16,null!=o&&(eh(e,t,c),eh(e,t+6,a.attrs),eh(e,t+10,o),t+=14),e.set(r,t),t+=l,u)for(var p in d){var m=d[p],f=m.length;eh(e,t,+p),eh(e,t+2,f),e.set(m,t+4),t+=4+f}return c&&(e.set(s,t),t+=c),t},eL=function(e,t,a,r,n){eh(e,t,0x6054b50),eh(e,t+8,a),eh(e,t+10,a),eh(e,t+12,r),eh(e,t+16,n)},eV=function(){function e(e){this.filename=e,this.c=H(),this.size=0,this.compression=0}return e.prototype.process=function(e,t){this.ondata(null,e,t)},e.prototype.push=function(e,t){this.ondata||T(5),this.c.p(e),this.size+=e.length,t&&(this.crc=this.c.d()),this.process(e,t||!1)},e}();function e_(e,t){var a=this;t||(t={}),eV.call(this,e),this.d=new eS(t,function(e,t){a.ondata(null,e,t)}),this.compression=8,this.flag=eU(t.level)}function eq(e,t){var a=this;t||(t={}),eV.call(this,e),this.d=new ek(t,function(e,t,r){a.ondata(e,t,r)}),this.compression=8,this.flag=eU(t.level),this.terminate=this.d.terminate}function e$(e){this.ondata=e,this.u=[],this.d=1}e_.prototype.process=function(e,t){try{this.d.push(e,t)}catch(e){this.ondata(e,null,t)}},e_.prototype.push=function(e,t){eV.prototype.push.call(this,e,t)},eq.prototype.process=function(e,t){this.d.push(e,t)},eq.prototype.push=function(e,t){eV.prototype.push.call(this,e,t)},e$.prototype.add=function(e){var t=this;if(this.ondata||T(5),2&this.d)this.ondata(T(4+(1&this.d)*8,0,1),null,!1);else{var a=eA(e.filename),n=a.length,i=e.comment,o=i&&eA(i),s=n!=e.filename.length||o&&i.length!=o.length,l=n+eO(e.extra)+30;n>65535&&this.ondata(T(11,0,1),null,!1);var d=new r(l);ez(d,0,e,a,s,-1);var c=[d],u=function(){for(var e=0,a=c;e0){var n=Math.min(this.c,e.length),i=e.subarray(0,n);if(this.c-=n,this.d?this.d.push(i,!this.c):this.k[0].push(i),(e=e.subarray(n)).length)return this.push(e,t)}else{var o=0,s=0,l=void 0,d=void 0;this.p.length?e.length?((d=new r(this.p.length+e.length)).set(this.p),d.set(e,this.p.length)):d=this.p:d=e;for(var c=d.length,u=this.c,h=u&&this.d,g=this;ss+30+i+h){var p,m,f=[];g.k.unshift(f),o=2;var F=ec(d,s+18),v=ec(d,s+22),y=function(e,t){if(t){for(var a="",r=0;r=0&&(S.size=F,S.originalSize=v),g.onfile(S)}return"break"}if(u){if(0x8074b50==e)return l=s+=12+(-2==u&&8),o=3,g.c=0,"break";else if(0x2014b50==e)return l=s-=4,o=3,g.c=0,"break"}}();++s);if(this.p=_,u<0){var p=o?d.subarray(0,l-12-(-2==u&&8)-(0x8074b50==ec(d,l-16)&&4)):d.subarray(0,s);h?h.push(p,!!o):this.k[+(2==o)].push(p)}if(2&o)return this.push(d.subarray(s),t);this.p=d.subarray(s)}t&&(this.c&&T(13),this.p=null)},eZ.prototype.register=function(e){this.o[e.compression]=e},"function"==typeof queueMicrotask&&queueMicrotask;var eY=e.i(48450);let eJ=[0,0,0,0,0,0,0,0,0,329,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2809,68,0,27,0,58,3,62,4,7,0,0,15,65,554,3,394,404,189,117,30,51,27,15,34,32,80,1,142,3,142,39,0,144,125,44,122,275,70,135,61,127,8,12,113,246,122,36,185,1,149,309,335,12,11,14,54,151,0,0,2,0,0,211,0,2090,344,736,993,2872,701,605,646,1552,328,305,1240,735,1533,1713,562,3,1775,1149,1469,979,407,553,59,279,31,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];function eK(e){return e.node?e.node.pop:e.leaf.pop}let eQ=new class{nodes=[];leaves=[];tablesBuilt=!1;buildTables(){if(this.tablesBuilt)return;this.tablesBuilt=!0,this.leaves=[];for(let t=0;t<256;t++){var e;this.leaves.push({pop:eJ[t]+ +((e=t)>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122)+1,symbol:t,numBits:0,code:0})}this.nodes=[{pop:0,index0:0,index1:0}];let t=256,a=[];for(let e=0;e<256;e++)a.push({node:null,leaf:this.leaves[e]});for(;1!==t;){let e=0xfffffffe,r=0xffffffff,n=-1,i=-1;for(let o=0;oi?n:i;a[s]={node:o,leaf:null},l!==t-1&&(a[l]=a[t-1]),t--}this.nodes[0]=a[0].node,this.generateCodes(0,0,0)}determineIndex(e){return null!==e.leaf?-(this.leaves.indexOf(e.leaf)+1):this.nodes.indexOf(e.node)}generateCodes(e,t,a){if(t<0){let r=this.leaves[-(t+1)];r.code=e,r.numBits=a}else{let r=this.nodes[t];this.generateCodes(e,r.index0,a+1),this.generateCodes(e|1<=0)t=e.readFlag()?this.nodes[t].index1:this.nodes[t].index0;else{a.push(this.leaves[-(t+1)].symbol);break}}return String.fromCharCode(...a)}{let t=e.readInt(8);return String.fromCharCode(...e.readBytes(t))}}};class e0{data;bitNum;maxReadBitNum;error;stringBuffer=null;constructor(e,t=0){this.data=e,this.bitNum=t,this.maxReadBitNum=e.length<<3,this.error=!1}getCurPos(){return this.bitNum}setCurPos(e){this.bitNum=e}getBytePosition(){return this.bitNum+7>>3}isError(){return this.error}isFull(){return this.bitNum>this.maxReadBitNum}getRemainingBits(){return this.maxReadBitNum-this.bitNum}getMaxPos(){return this.maxReadBitNum}readFlag(){if(this.bitNum>=this.maxReadBitNum)return this.error=!0,!1;let e=1<<(7&this.bitNum),t=(this.data[this.bitNum>>3]&e)!=0;return this.bitNum++,t}readInt(e){if(0===e)return 0;if(this.bitNum+e>this.maxReadBitNum)return this.error=!0,0;let t=this.bitNum>>3,a=7&this.bitNum;if(this.bitNum+=e,e+a<=32){let r=0,n=e+a+7>>3;for(let e=0;e>>=a,32===e)?r>>>0:r&(1<>3;for(let e=0;e>>0:r&(1<>3,a=new Uint8Array(t),r=this.bitNum>>3,n=7&this.bitNum,i=8-n;if(0===n)a.set(this.data.subarray(r,r+t));else{let e=this.data[r];for(let o=0;o>n|t<this.maxReadBitNum)return this.error=!0,0;let e=this.bitNum>>3,t=7&this.bitNum,a=e0.f32U8;if(0===t)a[0]=this.data[e],a[1]=this.data[e+1],a[2]=this.data[e+2],a[3]=this.data[e+3];else{let r=8-t;for(let n=0;n<4;n++){let i=this.data[e+n],o=e+n+1>t|o<>>0)}getCompressionPoint(){return this.compressionPoint}getDataBlockDataMap(){return this.dataBlockDataMap}getConnectionContext(){let e=this.dataBlockDataMap;return{compressionPoint:this.compressionPoint,ghostTracker:this.ghostTracker,getDataBlockParser:e=>this.registry.getDataBlockParser(e),getDataBlockData:e?t=>e.get(t):void 0,getGhostParser:e=>this.registry.getGhostParser(e)}}_setNextRecvEventSeq(e){this.nextRecvEventSeq=e>>>0}setConnectionProtocolState(e){for(this.lastSeqRecvdAtSend=e.lastSeqRecvdAtSend.slice(0,32);this.lastSeqRecvdAtSend.length<32;)this.lastSeqRecvdAtSend.push(0);this.lastSeqRecvd=e.lastSeqRecvd>>>0,this.highestAckedSeq=e.highestAckedSeq>>>0,this.lastSendSeq=e.lastSendSeq>>>0,this.recvAckMask=e.ackMask>>>0,this.connectSequence=e.connectSequence>>>0,this.lastRecvAckAck=e.lastRecvAckAck>>>0,this._connectionEstablished=e.connectionEstablished}onSendPacketTrigger(){this.lastSendSeq=this.lastSendSeq+1>>>0,this.lastSeqRecvdAtSend[31&this.lastSendSeq]=this.lastSeqRecvd>>>0}applyProtocolHeader(e){if(e.connectSeqBit!==(1&this.connectSequence)||e.ackByteCount>4||e.packetType>2)return{accepted:!1,dispatchData:!1};let t=(e.seqNumber|0xfffffe00&this.lastSeqRecvd)>>>0;if(t>>0),this.lastSeqRecvd+31>>0;if(a>>0),this.lastSendSeq>>0,0===e.packetType&&(this.recvAckMask=(1|this.recvAckMask)>>>0);for(let t=this.highestAckedSeq+1;t<=a;t++)(e.ackMask&1<<(a-t&31))!=0&&(this.lastRecvAckAck=this.lastSeqRecvdAtSend[31&t]>>>0);t-this.lastRecvAckAck>32&&(this.lastRecvAckAck=t-32),this.highestAckedSeq=a;let n=this.lastSeqRecvd!==t&&0===e.packetType;return this.lastSeqRecvd=t,{accepted:!0,dispatchData:n}}parsePacket(e){let t=new e0(e),a=this.readDnetHeader(t),r=this.applyProtocolHeader(a);if(this.packetsParsed++,!r.accepted)return this.protocolRejected++,{dnetHeader:a,rateInfo:{},gameState:this.emptyGameState(),events:[],ghosts:[]};if(!r.dispatchData)return this.protocolNoDispatch++,{dnetHeader:a,rateInfo:{},gameState:this.emptyGameState(),events:[],ghosts:[]};let n=this.readRateInfo(t);t.setStringBuffer(!0);let i=this.readGameState(t),o=void 0===i.controlObjectDataStart||void 0!==i.controlObjectData,s=o?this.readEvents(t):[],l=s[s.length-1],d=!l||l.dataBitsEnd!==l.dataBitsStart,c=o&&d?t.getCurPos():void 0,u=o&&d?this.readGhosts(t,a.seqNumber):[];return t.setStringBuffer(!1),{dnetHeader:a,rateInfo:n,gameState:i,events:s,ghosts:u,ghostSectionStart:c}}readDnetHeader(e){let t=e.readFlag(),a=e.readInt(1),r=e.readInt(9),n=e.readInt(9),i=e.readInt(2),o=e.readInt(3),s=o>0?e.readInt(8*o):0;return{gameFlag:t,connectSeqBit:a,seqNumber:r,highestAck:n,packetType:i,ackByteCount:o,ackMask:s}}readRateInfo(e){let t={};return e.readFlag()&&(t.updateDelay=e.readInt(10),t.packetSize=e.readInt(10)),e.readFlag()&&(t.maxUpdateDelay=e.readInt(10),t.maxPacketSize=e.readInt(10)),t}readGameState(e){let t,a,r,n,i,o,s,l,d,c,u,h,g,p,m,f=e.readInt(32);e.readFlag()&&(e.readFlag()&&(t=e.readFloat(7)),e.readFlag()&&(a=1.5*e.readFloat(7))),e.readFlag()&&(r=e.readFlag(),n=e.readFlag()),e.readFlag()&&((i=e.readFlag())&&(o={x:e.readF32(),y:e.readF32(),z:e.readF32()}),1===(s=e.readRangedU32(0,2))?e.readFlag()&&(l=e.readRangedU32(0,1023)):2===s&&(d={x:e.readF32(),y:e.readF32(),z:e.readF32()}));let F=e.readFlag(),v=e.readFlag();if(e.readFlag())if(e.readFlag()){let m=e.readInt(10);c=m,u=e.getCurPos();let y=e.savePos(),S=this.ghostTracker.getGhost(m),k=S?this.registry.getGhostParser(S.classId):void 0,b=this.controlParserByGhostIndex.get(m),P=this.registry.getGhostParser(25),x=this.registry.getGhostParser(4),I=[],D=new Set,C=e=>{!e?.readPacketData||D.has(e.name)||(D.add(e.name),I.push(e))};C(k),C(b),C(P),C(x);let E=!1;for(let t of I){e.restorePos(y);try{let a=this.getConnectionContext(),r=t.readPacketData(e,a);if(e.getCurPos()-u<=0||e.isError())continue;g=r,h=e.getCurPos(),this.controlParserByGhostIndex.set(m,t),a.compressionPoint!==this.compressionPoint&&(this.compressionPoint=a.compressionPoint,p=this.compressionPoint),this.controlObjectParsed++,E=!0;break}catch{}}if(!E)return e.restorePos(y),h=u,this.controlObjectFailed++,{lastMoveAck:f,damageFlash:t,whiteOut:a,selfLocked:r,selfHomed:n,seekerTracking:i,seekerTrackingPos:o,seekerMode:s,seekerObjectGhostIndex:l,targetPos:d,pinged:F,jammed:v,controlObjectGhostIndex:c,controlObjectDataStart:u,controlObjectDataEnd:h,controlObjectData:g,targetVisibility:[]}}else p={x:e.readF32(),y:e.readF32(),z:e.readF32()},this.compressionPoint=p;let y=[];for(;e.readFlag();)y.push({index:e.readInt(4),mask:e.readInt(32)});return e.readFlag()&&(m=e.readInt(8)),{lastMoveAck:f,damageFlash:t,whiteOut:a,selfLocked:r,selfHomed:n,seekerTracking:i,seekerTrackingPos:o,seekerMode:s,seekerObjectGhostIndex:l,targetPos:d,pinged:F,jammed:v,controlObjectGhostIndex:c,controlObjectDataStart:u,controlObjectDataEnd:h,controlObjectData:g,compressionPoint:p,targetVisibility:y.length>0?y:void 0,cameraFov:m}}readEvents(e){let t=[],a=!0,r=-2;for(;;){let n,i,o,s=e.readFlag();if(a&&!s){if(a=!1,!e.readFlag()){this.dispatchGuaranteedEvents(t);break}}else if(a||s){if(!s)break}else{this.dispatchGuaranteedEvents(t);break}!a&&(r=n=e.readFlag()?r+1&127:e.readInt(7),(i=n|0xffffff80&this.nextRecvEventSeq)0&&this.pendingGuaranteedEvents[0].absoluteSequenceNumber===this.nextRecvEventSeq;){let t=this.pendingGuaranteedEvents.shift();if(!t)break;this.nextRecvEventSeq=this.nextRecvEventSeq+1>>>0,e.push(t.event),t.event.parsedData&&this.applyEventSideEffects(t.event.parsedData)}}applyEventSideEffects(e){let t=e.type;if("GhostingMessageEvent"===t){let t=e.message;"number"==typeof t&&2===t&&this.ghostTracker.clear();return}if("GhostAlwaysObjectEvent"===t){let t=e.ghostIndex,a=e.classId;if("number"==typeof t&&"number"==typeof a){let e=this.registry.getGhostParser(a);this.ghostTracker.createGhost(t,a,e?.name??`unknown_${a}`)}}"SimDataBlockEvent"===t&&this.dataBlockDataMap&&e.dataBlockData&&"number"==typeof e.objectId&&this.dataBlockDataMap.set(e.objectId,e.dataBlockData)}readGhosts(e,t){let a=[];if(!e.readFlag())return a;let r=e.readInt(3)+3;for(;e.readFlag();){let n;if(e.isError())break;let i=e.readInt(r);if(e.isError())break;if(e.readFlag()){this.ghostTracker.deleteGhost(i),this.ghostDeletes++,a.push({index:i,type:"delete",updateBitsStart:e.getCurPos(),updateBitsEnd:e.getCurPos()});continue}let o=!this.ghostTracker.hasGhost(i);n=o?e.readInt(7)+0:this.ghostTracker.getGhost(i)?.classId;let s=e.getCurPos(),l=void 0!==n?this.registry.getGhostParser(n):void 0;if(o&&!l){this.ghostsTrackerDiverged++,e5("DIVERGED pkt=%d seq=%d idx=%d classId=%d bit=%d/%d trackerSize=%d (server sent UPDATE for ghost not in our tracker; 7-bit classId is actually update data)",this.packetsParsed,t,i,n,s,e.getMaxPos(),this.ghostTracker.size()),a.push({index:i,type:"create",classId:n,updateBitsStart:s,updateBitsEnd:s});break}let d=!1;if(l)try{let t=this.getConnectionContext();t.currentGhostIndex=i;let r=l.unpackUpdate(e,o,t),c=e.getCurPos();o&&void 0!==n?(this.ghostTracker.createGhost(i,n,l.name),this.ghostCreatesParsed++):this.ghostUpdatesParsed++,a.push({index:i,type:o?"create":"update",classId:n,updateBitsStart:s,updateBitsEnd:c,parsedData:r}),d=!0}catch(c){this.ghostsFailed++;let r=o?"create":"update",d=c instanceof Error?c.message:String(c);e5("FAIL pkt=%d seq=%d #%d idx=%d op=%s classId=%d parser=%s bit=%d/%d trackerSize=%d err=%s",this.packetsParsed,t,a.length,i,r,n,l.name,s,e.getMaxPos(),this.ghostTracker.size(),d)}if(!d){e5("STOP pkt=%d seq=%d idx=%d op=%s classId=%d parser=%s bit=%d/%d",this.packetsParsed,t,i,o?"create":"update",n,l?.name??"NONE",s,e.getMaxPos()),a.push({index:i,type:o?"create":"update",classId:n,updateBitsStart:s,updateBitsEnd:s});break}}return a}emptyGameState(){return{lastMoveAck:0,pinged:!1,jammed:!1}}}class e8{eventParsers=new Map;ghostParsers=new Map;dataBlockParsers=new Map;eventCatalog=new Map;ghostCatalog=new Map;dataBlockCatalog=new Map;catalogEvent(e){this.eventCatalog.set(e.name,e)}catalogGhost(e){this.ghostCatalog.set(e.name,e)}catalogDataBlock(e){this.dataBlockCatalog.set(e.name,e)}bindDeterministicDataBlocks(e,t){let a=0,r=[];for(let n=0;n0&&(r.sounds=t)}if(e.readFlag()){let t=[];for(let a=0;a<4;a++)e.readFlag()&&t.push({index:a,sequence:e.readInt(5),state:e.readInt(2),forward:e.readFlag(),atEnd:e.readFlag()});t.length>0&&(r.threads=t)}let n=!1;if(e.readFlag()){let a=[];for(let r=0;r<8;r++)if(e.readFlag()){let i={index:r};e.readFlag()?i.dataBlockId=e9(e):i.dataBlockId=0,e.readFlag()&&(e.readFlag()?i.skinTagIndex=e.readInt(10):i.skinName=e.readString(),n=!0),i.triggerDown=e.readFlag(),i.loaded=e.readFlag(),i.ammo=e.readFlag(),i.wet=e.readFlag(),i.target=e.readFlag(),i.fireCount=e.readInt(3),t&&(i.imageExtraFlag=e.readFlag()),a.push(i)}a.length>0&&(r.images=a)}if(e.readFlag()){if(e.readFlag()){r.stateAEnabled=e.readFlag(),r.stateB=e.readFlag();let t=e.readFlag();r.hasInvulnerability=t,t?(r.invulnerabilityVisual=e.readFlag(),r.invulnerabilityTicks=e.readU32()):r.binaryCloak=e.readFlag()}if(e.readFlag())if(e.readFlag()){let t=e.readFlag();r.stateBMode=t,t?r.energyPackOn=!0:r.energyPackOn=!1}else r.shieldNormal=e.readNormalVector(8),r.energyPercent=e.readFloat(5);e.readFlag()&&(r.stateValue1=e.readU32(),r.stateValue2=e.readU32())}return n&&(r.imageSkinDirty=!0),e.readFlag()&&(e.readFlag()?(r.mountObject=e.readInt(10),r.mountNode=e.readInt(5)):r.mountObject=-1),r}function ta(e,t,a){let r=tt(e,t,a);if(e.readFlag()&&(r.impactSound=e.readInt(3)),e.readFlag()&&(r.action=e.readInt(8),r.actionHoldAtEnd=e.readFlag(),r.actionAtEnd=e.readFlag(),r.actionFirstPerson=e.readFlag(),!r.actionAtEnd&&e.readFlag()&&(r.actionAnimPos=e.readSignedFloat(6))),e.readFlag()&&(r.armAction=e.readInt(8)),e.readFlag())return r;if(e.readFlag()){if(r.actionState=e.readInt(3),e.readFlag()&&(r.recoverTicks=e.readInt(7)),r.moveFlag0=e.readFlag(),r.moveFlag1=e.readFlag(),r.position=e.readCompressedPoint(a.compressionPoint),e.readFlag()){let t=e.readInt(13)/32,a=e.readNormalVector(10);r.velocity={x:a.x*t,y:a.y*t,z:a.z*t}}else r.velocity={x:0,y:0,z:0};r.headX=e.readSignedFloat(6),r.headZ=e.readSignedFloat(6),r.rotationZ=2*e.readFloat(7)*Math.PI,r.move=e7(e),r.allowWarp=e.readFlag()}return r.energy=e.readFloat(5),r}function tr(e,t){let a={};if(a.energyLevel=e.readF32(),a.rechargeRate=e.readF32(),a.actionState=e.readInt(3),e.readFlag()&&(a.recoverTicks=e.readInt(7)),e.readFlag()&&(a.jumpDelay=e.readInt(7)),e.readFlag()){let r={x:e.readF32(),y:e.readF32(),z:e.readF32()};a.position=r,t.compressionPoint=r,a.velocity={x:e.readF32(),y:e.readF32(),z:e.readF32()},a.jumpSurfaceLastContact=e.readInt(4)}if(a.headX=e.readF32(),a.headZ=e.readF32(),a.rotationZ=e.readF32(),e.readFlag()){let r=e.readInt(10);a.controlObjectGhost=r;let n=t.ghostTracker.getGhost(r),i=n?t.getGhostParser?.(n.classId):void 0;if(i?.readPacketData){let n=t.currentGhostIndex;t.currentGhostIndex=r,a.controlObjectData=i.readPacketData(e,t),t.currentGhostIndex=n}}return a.disableMove=e.readFlag(),a.pilot=e.readFlag(),a}function tn(e,t,a){let r=tt(e,t,a);return(r.jetting=e.readFlag(),e.readFlag())?r._controlledEarlyReturn=!0:(r.steeringYaw=e.readFloat(9),r.steeringPitch=e.readFloat(9),r.move=e7(e),r.frozen=e.readFlag(),e.readFlag()&&(r.position=e.readCompressedPoint(a.compressionPoint),r.angPosition={x:e.readF32(),y:e.readF32(),z:e.readF32(),w:e.readF32()},r.linMomentum=e.readPoint3F(),r.angMomentum=e.readPoint3F()),e.readFlag()&&(r.energy=e.readFloat(8))),r}function ti(e,t){let a={};a.energyLevel=e.readF32(),a.rechargeRate=e.readF32(),a.steering={x:e.readF32(),y:e.readF32()};let r={x:e.readF32(),y:e.readF32(),z:e.readF32()};return a.linPosition=r,a.angPosition={x:e.readF32(),y:e.readF32(),z:e.readF32(),w:e.readF32()},a.linMomentum=e.readPoint3F(),a.angMomentum=e.readPoint3F(),a.disableMove=e.readFlag(),a.frozen=e.readFlag(),t.compressionPoint=r,a}function to(e,t){let a=ti(e,t);a.braking=e.readFlag();let r=4,n=t.currentGhostIndex;if(void 0!==n){let e=tX.get(n);void 0!==e&&(r=e)}let i=[];for(let t=0;t64)throw Error(`Invalid Sky fogVolumeCount: ${t}`);r.fogVolumeCount=t,r.useSkyTextures=e.readBool(),r.renderBottomTexture=e.readBool(),r.skySolidColor={r:e.readF32(),g:e.readF32(),b:e.readF32()},r.windEffectPrecipitation=e.readBool();let a=[];for(let r=0;r3)throw Error(`Invalid precipitation colorCount: ${t}`);let a=[];for(let r=0;rMath.floor(e.getRemainingBits()/96))throw Error(`Invalid physicalZone point count: ${t}`);let a=[];for(let r=0;rMath.floor(e.getRemainingBits()/128))throw Error(`Invalid physicalZone plane count: ${n}`);let i=[];for(let t=0;tMath.floor(e.getRemainingBits()/128))throw Error(`Invalid physicalZone edge count: ${o}`);let s=[];for(let t=0;t0&&(a.audioData=e.readBitsBuffer(8*r)),a}function ad(e,t){return{type:"GhostingMessageEvent",sequence:e.readU32(),message:e.readInt(3),ghostCount:e.readInt(11)}}function ac(e,t){let a={type:"GhostAlwaysObjectEvent"};a.ghostIndex=e.readInt(10);let r=e.readFlag();if(a._hasObjectData=r,r){let r=e.readInt(7);a.classId=r;let n=t.getGhostParser?.(r);if(!n)throw Error(`No ghost parser for GhostAlwaysObjectEvent classId=${r}`);a.objectData=n.unpackUpdate(e,!0,t)}return a}function au(e,t){let a={type:"PathManagerEvent"};if(e.readFlag()){a.messageType="NewPaths";let t=e.readU32(),r=[];for(let a=0;a0&&(t.hudImages=a),t}function aE(e){let t={};e.readFlag()&&(t.crc=e.readU32()),t.shapeName=e.readString(),t.mountPoint=e.readU32(),e.readFlag()||(t.offset=e.readAffineTransform()),t.firstPerson=e.readFlag(),t.mass=e.readF32(),t.usesEnergy=e.readFlag(),t.minEnergy=e.readF32(),t.hasFlash=e.readFlag(),t.projectile=ab(e),t.muzzleFlash=ab(e),t.isSeeker=e.readFlag(),t.isSeeker&&(t.seekerRadius=e.readF32(),t.maxSeekAngle=e.readF32(),t.seekerLockTime=e.readF32(),t.seekerFreeTime=e.readF32(),t.isTargetLockRequired=e.readFlag(),t.maxLockRange=e.readF32()),t.cloakable=e.readFlag(),t.lightType=e.readRangedU32(0,3),0!==t.lightType&&(t.lightRadius=e.readF32(),t.lightTime=e.readS32(),t.lightColor={r:e.readFloat(7),g:e.readFloat(7),b:e.readFloat(7),a:e.readFloat(7)}),t.shellExitDir={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.shellExitVariance=e.readF32(),t.shellVelocity=e.readF32(),t.casing=ab(e),t.accuFire=e.readFlag();let a=[];for(let t=0;t<31;t++){if(!e.readFlag())continue;let t={};t.name=e.readString(),t.transitionOnAmmo=e.readInt(5),t.transitionOnNoAmmo=e.readInt(5),t.transitionOnTarget=e.readInt(5),t.transitionOnNoTarget=e.readInt(5),t.transitionOnWet=e.readInt(5),t.transitionOnNotWet=e.readInt(5),t.transitionOnTriggerUp=e.readInt(5),t.transitionOnTriggerDown=e.readInt(5),t.transitionOnTimeout=e.readInt(5),t.transitionGeneric0In=e.readInt(5),t.transitionGeneric0Out=e.readInt(5),e.readFlag()&&(t.timeoutValue=e.readF32()),t.waitForTimeout=e.readFlag(),t.fire=e.readFlag(),t.ejectShell=e.readFlag(),t.scaleAnimation=e.readFlag(),t.direction=e.readFlag(),t.reload=e.readFlag(),e.readFlag()&&(t.energyDrain=e.readF32()),t.loaded=e.readInt(3),t.spin=e.readInt(3),t.recoil=e.readInt(3),e.readFlag()&&(t.sequence=e.readSignedInt(16)),e.readFlag()&&(t.sequenceVis=e.readSignedInt(16)),t.flashSequence=e.readFlag(),t.ignoreLoadedForReady=e.readFlag(),t.emitter=ab(e),null!==t.emitter&&(t.emitterTime=e.readF32(),t.emitterNode=e.readS32()),t.sound=ab(e),a.push(t)}return t.states=a,t}function aw(e){let t=aC(e);t.renderFirstPerson=e.readFlag(),t.minLookAngle=e.readF32(),t.maxLookAngle=e.readF32(),t.maxFreelookAngle=e.readF32(),t.maxTimeScale=e.readF32(),t.maxStepHeight=e.readF32(),t.runForce=e.readF32(),t.runEnergyDrain=e.readF32(),t.minRunEnergy=e.readF32(),t.maxForwardSpeed=e.readF32(),t.maxBackwardSpeed=e.readF32(),t.maxSideSpeed=e.readF32(),t.maxUnderwaterForwardSpeed=e.readF32(),t.maxUnderwaterBackwardSpeed=e.readF32(),t.maxUnderwaterSideSpeedRef=ab(e),e.readFlag()&&(t.runSurfaceAngleRef=e.readInt(11)),t.runSurfaceAngle=e.readF32(),t.recoverDelay=e.readF32(),t.recoverRunForceScale=e.readF32(),t.jumpForce=e.readF32(),t.jumpEnergyDrain=e.readF32(),t.minJumpEnergy=e.readF32(),t.minJumpSpeed=e.readF32(),t.maxJumpSpeed=e.readF32(),t.jumpSurfaceAngle=e.readF32(),t.minJetEnergy=e.readF32(),t.splashVelocity=e.readF32(),t.splashAngle=e.readF32(),t.splashFreqMod=e.readF32(),t.splashVelEpsilon=e.readF32(),t.bubbleEmitTime=e.readF32(),t.medSplashSoundVel=e.readF32(),t.hardSplashSoundVel=e.readF32(),t.exitSplashSoundVel=e.readF32(),t.jumpDelay=e.readInt(7),t.horizMaxSpeed=e.readF32(),t.horizResistSpeed=e.readF32(),t.horizResistFactor=e.readF32(),t.upMaxSpeed=e.readF32(),t.upResistSpeed=e.readF32(),t.upResistFactor=e.readF32(),t.jetEnergyDrain=e.readF32(),t.canJet=e.readF32(),t.maxJetHorizontalPercentage=e.readF32(),t.maxJetForwardSpeed=e.readF32(),t.jetForce=e.readF32(),t.minJetSpeed=e.readF32(),t.maxDamage=e.readF32(),t.minImpactDamageSpeed=e.readF32(),t.impactDamageScale=e.readF32(),t.footSplashHeight=e.readF32();let a=[];for(let t=0;t<32;t++)e.readFlag()?a.push(e.readInt(11)):a.push(null);t.sounds=a,t.boxSize={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.footPuffEmitter=ab(e),t.footPuffNumParts=e.readF32(),t.footPuffRadius=e.readF32(),t.decalData=ab(e),t.decalOffset=e.readF32(),t.dustEmitter=ab(e),t.splash=ab(e);let r=[];for(let t=0;t<3;t++)r.push(ab(e));return t.splashEmitters=r,t.groundImpactMinSpeed=e.readF32(),t.groundImpactShakeFreq={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.groundImpactShakeAmp={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.groundImpactShakeDuration=e.readF32(),t.groundImpactShakeFalloff=e.readF32(),t.boundingRadius=e.readF32(),t.moveBubbleSize=e.readF32(),t}function aM(e){let t=aC(e);t.bodyRestitution=e.readF32(),t.bodyFriction=e.readF32();let a=[];for(let t=0;t<2;t++)a.push(ab(e));t.impactSounds=a,t.minImpactSpeed=e.readF32(),t.softImpactSpeed=e.readF32(),t.hardImpactSpeed=e.readF32(),t.minRollSpeed=e.readF32(),t.maxSteeringAngle=e.readF32(),t.maxDrag=e.readF32(),t.minDrag=e.readF32(),t.cameraOffset=e.readF32(),t.cameraLag=e.readF32(),t.jetForce=e.readF32(),t.jetEnergyDrain=e.readF32(),t.minJetEnergy=e.readF32(),t.integration=e.readF32(),t.collisionTol=e.readF32(),t.massCenter=e.readF32(),t.exitSplashSoundVelocity=e.readF32(),t.softSplashSoundVelocity=e.readF32(),t.mediumSplashSoundVelocity=e.readF32(),t.hardSplashSoundVelocity=e.readF32();let r=[];for(let t=0;t<5;t++)r.push(ab(e));t.waterSounds=r,t.dustEmitter=ab(e);let n=[];for(let t=0;t<3;t++)n.push(ab(e));t.damageEmitters=n;let i=[];for(let t=0;t<2;t++)i.push(ab(e));return t.splashEmitters=i,t.damageEmitterOffset0={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.damageEmitterOffset1={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.damageLevelTolerance0=e.readF32(),t.damageLevelTolerance1=e.readF32(),t.splashFreqMod=e.readF32(),t.splashVelEpsilon=e.readF32(),t.collDamageThresholdVel=e.readF32(),t.collDamageMultiplier=e.readF32(),t}function aB(e){let t=aM(e);t.jetActivateSound=ab(e),t.jetDeactivateSound=ab(e);let a=[];for(let t=0;t<4;t++)a.push(ab(e));return t.jetEmitters=a,t.maneuveringForce=e.readF32(),t.horizontalSurfaceForce=e.readF32(),t.verticalSurfaceForce=e.readF32(),t.autoInputDamping=e.readF32(),t.steeringForce=e.readF32(),t.steeringRollForce=e.readF32(),t.rollForce=e.readF32(),t.autoAngularForce=e.readF32(),t.rotationalDrag=e.readF32(),t.maxAutoSpeed=e.readF32(),t.autoLinearForce=e.readF32(),t.hoverHeight=e.readF32(),t.createHoverHeight=e.readF32(),t.minTrailSpeed=e.readF32(),t.vertThrustMultiple=e.readF32(),t.maxForwardSpeed=e.readF32(),t}function aT(e){let t=aM(e);t.dragForce=e.readF32(),t.mainThrustForce=e.readF32(),t.reverseThrustForce=e.readF32(),t.strafeThrustForce=e.readF32(),t.turboFactor=e.readF32(),t.stabLenMin=e.readF32(),t.stabLenMax=e.readF32(),t.stabSpringConstant=e.readF32(),t.stabDampingConstant=e.readF32(),t.gyroDrag=e.readF32(),t.normalForce=e.readF32(),t.restorativeForce=e.readF32(),t.steeringForce=e.readF32(),t.rollForce=e.readF32(),t.pitchForce=e.readF32(),t.floatingThrustFactor=e.readF32(),t.brakingForce=e.readF32(),t.dustTrailOffset={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.dustTrailFreqMod=e.readF32(),t.triggerTrailHeight=e.readF32(),t.floatSound=ab(e),t.thrustSound=ab(e),t.turboSound=ab(e);let a=[];for(let t=0;t<3;t++)a.push(ab(e));return t.jetEmitters=a,t.dustTrailEmitter=ab(e),t.mainThrustEmitterFactor=e.readF32(),t.strafeThrustEmitterFactor=e.readF32(),t.reverseThrustEmitterFactor=e.readF32(),t}function aR(e){let t=aM(e);return t.tireRadius=e.readF32(),t.tireStaticFriction=e.readF32(),t.tireKineticFriction=e.readF32(),t.tireRestitution=e.readF32(),t.tireLateralForce=e.readF32(),t.tireLateralDamping=e.readF32(),t.tireLateralRelaxation=e.readF32(),t.tireLongitudinalForce=e.readF32(),t.tireLongitudinalDamping=e.readF32(),t.tireEmitter=ab(e),t.jetSound=ab(e),t.engineSound=ab(e),t.squealSound=ab(e),t.wadeSound=ab(e),t.spring=e.readF32(),t.springDamping=e.readF32(),t.springLength=e.readF32(),t.brakeTorque=e.readF32(),t.engineTorque=e.readF32(),t.engineBrake=e.readF32(),t.maxWheelSpeed=e.readF32(),t.steeringAngle=e.readF32(),t.steeringReturn=e.readF32(),t.steeringDamping=e.readF32(),t.powerSteeringFactor=e.readF32(),t}function aN(e){let t=aC(e);return t.noIndividualDamage=e.readFlag(),t.dynamicTypeField=e.readS32(),t}function aG(e){let t=aN(e);return t.thetaMin=e.readF32(),t.thetaMax=e.readF32(),t.thetaNull=e.readF32(),t.neverUpdateControl=e.readFlag(),t.primaryAxis=e.readRangedU32(0,3),t.maxCapacitorEnergy=e.readF32(),t.capacitorRechargeRate=e.readF32(),t}function aA(e){let t=aE(e);return t.activationMS=e.readInt(8),t.deactivateDelayMS=e.readInt(8),t.degPerSecTheta=e.readRangedU32(0,1080),t.degPerSecPhi=e.readRangedU32(0,1080),t.dontFireInsideDamageRadius=e.readFlag(),t.damageRadius=e.readF32(),t.useCapacitor=e.readFlag(),t}function aU(e){let t=aC(e);return t.friction=e.readFloat(10),t.elasticity=e.readFloat(10),t.sticky=e.readFlag(),e.readFlag()&&(t.gravityMod=e.readFloat(10)),e.readFlag()&&(t.maxVelocity=e.readF32()),e.readFlag()&&(t.lightType=e.readInt(2),t.lightColor={r:e.readFloat(7),g:e.readFloat(7),b:e.readFloat(7),a:e.readFloat(7)},t.lightTime=e.readS32(),t.lightRadius=e.readF32(),t.lightOnlyStatic=e.readFlag()),t}function aj(e){let t={};t.projectileShapeName=e.readString(),t.faceViewerLinkTime=e.readS32(),t.lifetime=e.readS32(),t.faceViewer=e.readFlag(),e.readFlag()&&(t.scale={x:e.readF32(),y:e.readF32(),z:e.readF32()}),t.baseEmitter=ab(e),t.delayEmitter=ab(e),t.bubbleEmitter=ab(e),t.explosion=ab(e),t.underwaterExplosion=ab(e),t.splash=ab(e),t.sound=ab(e),t.wetFireSound=ab(e),t.fireSound=ab(e);let a=[];for(let t=0;t<6;t++)a.push(ab(e));return t.decals=a,e.readFlag()&&(t.lightRadius=e.readFloat(8),t.lightColor={r:e.readFloat(7),g:e.readFloat(7),b:e.readFloat(7)}),e.readFlag()&&(t.underwaterLightColor={r:e.readFloat(7),g:e.readFloat(7),b:e.readFloat(7)}),t.explodeOnWaterImpact=aI(e),t.depthTolerance=e.readF32(),t}function aO(e){let t=aj(e);return t.dryVelocity=e.readF32(),t.wetVelocity=e.readF32(),t.fizzleTime=e.readU32(),t.fizzleType=e.readU32(),t.hardRetarget=e.readFlag(),t.inheritedVelocityScale=e.readRangedU32(0,90),t.lifetimeMS=e.readRangedU32(0,90),t.collideWithOwnerTimeMS=e.readU32(),t.proximityRadius=e.readU32(),t.tracerProjectile=e.readFlag(),t}function az(e){let t=aj(e);return t.armingDelayMS=e.readS32(),t.muzzleVelocity=e.readF32(),t.grenadeElasticity=e.readF32(),t.grenadeFriction=e.readF32(),t.drag=e.readF32(),t.density=e.readF32(),t.gravityMod=e.readF32(),t.lifetimeMS=e.readS32(),t}function aL(e){let t=aj(e);return t.lifetimeMS=e.readS32(),t.muzzleVelocity=e.readF32(),t.turningSpeed=e.readF32(),t.proximityRadius=e.readF32(),t.terrainAvoidanceSpeed=e.readF32(),t.terrainScanAhead=e.readF32(),t.terrainHeightFail=e.readF32(),t.terrainAvoidanceRadius=e.readF32(),t.flareDistance=e.readF32(),t.flareAngle=e.readF32(),t.useFlechette=aI(e),t.maxVelocity=e.readF32(),t.acceleration=e.readF32(),t.flechetteDelayMs=e.readS32(),t.exhaustTimeMs=e.readS32(),t.exhaustNodeName=e.readString(),t.casingShapeName=e.readString(),t.casingDebris=ab(e),t.puffEmitter=ab(e),t.exhaustEmitter=ab(e),t}function aV(e){let t=aj(e);t.maxRifleRange=e.readF32(),t.rifleHeadMultiplier=e.readF32(),t.beamColor=ax(e),t.fadeTime=e.readF32(),t.startBeamWidth=e.readF32(),t.endBeamWidth=e.readF32(),t.pulseBeamWidth=e.readF32(),t.beamFlareAngle=e.readF32(),t.minFlareSize=e.readF32(),t.maxFlareSize=e.readF32(),t.pulseSpeed=e.readF32(),t.pulseLength=e.readF32(),t.lightColor=ax(e),t.lightRadius=e.readF32();let a=[];for(let t=0;t<12;t++)a.push(e.readString());return t.textures=a,t}function a_(e){let t=aj(e);t.zapDuration=e.readF32(),t.boltLength=e.readF32(),t.numParts=e.readF32(),t.lightningFreq=e.readF32(),t.lightningDensity=e.readF32(),t.lightningAmp=e.readF32(),t.lightningWidth=e.readF32(),t.shockwave=ab(e);let a=[],r=[],n=[],i=[];for(let t=0;t<2;t++)a.push(e.readF32()),r.push(e.readF32()),n.push(e.readF32()),i.push(e.readF32());t.startWidth=a,t.endWidth=r,t.boltSpeed=n,t.texWrap=i;let o=[];for(let t=0;t<4;t++)o.push(e.readString());return t.textures=o,t.emitter=ab(e),t}function aq(e){let t=aj(e);return t.beamRange=e.readF32(),t.beamDrainRate=e.readF32(),t.muzzleVelocity=e.readF32(),t.proximityRadius=e.readF32(),t.startWidth=e.readF32(),t.endWidth=e.readF32(),t.mainBeamTexture=e.readString(),t.innerBeamTexture=e.readString(),t.flareTexture=e.readString(),t.hitEmitter=ab(e),t}function a$(e){let t=aj(e);return t.beamRange=e.readF32(),t.beamRepairRate=e.readF32(),t.muzzleVelocity=e.readF32(),t.proximityRadius=e.readF32(),t.startWidth=e.readF32(),t.endWidth=e.readF32(),t.startBeamWidth=e.readF32(),t.endBeamWidth=e.readF32(),t.mainBeamTexture=e.readString(),t.innerBeamTexture=e.readString(),t}function aH(e){let t=aj(e);t.maxRifleRange=e.readF32(),t.beamColor=ax(e),t.startBeamWidth=e.readF32(),t.pulseBeamWidth=e.readF32(),t.beamFlareAngle=e.readF32(),t.minFlareSize=e.readF32(),t.maxFlareSize=e.readF32(),t.pulseSpeed=e.readF32(),t.pulseLength=e.readF32();let a=[];for(let t=0;t<4;t++)a.push(e.readString());return t.textures=a,t}function aW(e){let t=aO(e);return t.tracerLength=e.readF32(),t.tracerAlpha=e.readF32(),t.tracerMinPixels=e.readF32(),t.crossViewFraction=aI(e),t.tracerColor=ax(e),t.tracerWidth=e.readF32(),t.muzzleVelocity=e.readF32(),t.proximityRadius=aI(e),t.textureName0=e.readString(),t.textureName1=e.readString(),t}function aX(e){let t=az(e);return t.energyDrainPerSecond=e.readF32(),t.energyMinDrain=e.readF32(),t.beamWidth=e.readF32(),t.beamRange=e.readF32(),t.numSegments=e.readF32(),t.texRepeat=e.readF32(),t.beamFlareAngle=e.readF32(),t.beamTexture=e.readString(),t.flareTexture=e.readString(),t}function aZ(e){let t=aO(e);return t.numFlares=e.readF32(),t.flareColor=ax(e),t.flareTexture=e.readString(),t.smokeTexture=e.readString(),t.size=e.readF32(),t.flareModTexture=e.readF32(),t.smokeSize=e.readF32(),t}function aY(e){let t=az(e);return t.smokeDist=e.readF32(),t.noSmoke=e.readF32(),t.boomTime=e.readF32(),t.casingDist=e.readF32(),t.smokeCushion=e.readF32(),t.noSmokeCounter=e.readF32(),t.smokeTexture=e.readString(),t.bombTexture=e.readString(),t}function aJ(e){let t=az(e);return t.size=e.readF32(),t.useLensFlare=aI(e),t.flareTexture=e.readString(),t.lensFlareTexture=e.readString(),t}function aK(e){let t={};t.dtsFileName=e.readString(),t.soundProfile=ab(e),t.particleEmitter=ab(e),t.particleDensity=e.readInt(14),t.particleRadius=e.readF32(),t.faceViewer=e.readFlag(),e.readFlag()&&(t.explosionScale={x:e.readInt(16),y:e.readInt(16),z:e.readInt(16)}),t.playSpeed=e.readInt(14),t.debrisThetaMin=e.readRangedU32(0,180),t.debrisThetaMax=e.readRangedU32(0,180),t.debrisPhiMin=e.readRangedU32(0,360),t.debrisPhiMax=e.readRangedU32(0,360),t.debrisMinVelocity=e.readRangedU32(0,1e3),t.debrisMaxVelocity=e.readRangedU32(0,1e3),t.debrisNum=e.readInt(14),t.debrisVariance=e.readRangedU32(0,1e4),t.delayMS=e.readInt(16),t.delayVariance=e.readInt(16),t.lifetimeMS=e.readInt(16),t.lifetimeVariance=e.readInt(16),t.offset=e.readF32(),t.shakeCamera=e.readFlag(),t.hasLight=e.readFlag(),t.camShakeFreq={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.camShakeAmp={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.camShakeDuration=e.readF32(),t.camShakeRadius=e.readF32(),t.camShakeFalloff=e.readF32(),t.shockwave=ab(e),t.debris=ab(e);let a=[];for(let t=0;t<4;t++)a.push(ab(e));t.emitters=a;let r=[];for(let t=0;t<5;t++)r.push(ab(e));t.subExplosions=r;let n=e.readRangedU32(0,4),i=[];for(let t=0;t0&&ry("DataBlock binding: %d/%d bound, missing parsers: %s",t,e2.length,a.join(", "));const{bound:r,missing:n}=this.registry.bindDeterministicGhosts(e3,0);n.length>0&&ry("Ghost binding: %d/%d bound, missing parsers: %s",r,e3.length,n.join(", "));const{bound:i,missing:o}=this.registry.bindDeterministicEvents(e1,255);o.length>0&&ry("Event binding: %d/%d bound, missing parsers: %s",i,e1.length,o.join(", ")),this.packetParser=new e6(this.registry,this.ghostTracker)}getRegistry(){return this.registry}getGhostTracker(){return this.ghostTracker}getPacketParser(){return this.packetParser}get loaded(){return this._loaded}get header(){if(!this._loaded)throw Error("must call load() first");return this._header}get initialBlock(){if(!this._loaded)throw Error("must call load() first");return this._initialBlock}get blockCount(){if(!this._loaded)throw Error("must call load() first");if(void 0===this._blockCount){let e=this._decompressedData,t=this._decompressedView,a=0,r=0;for(;r+2<=e.length;){let n=4095&t.getUint16(r,!0);if((r+=2+n)>e.length)break;a++}this._blockCount=a}return this._blockCount}get blockCursor(){if(!this._loaded)throw Error("must call load() first");return this._blockCursor}async load(){if(this._loaded)return{header:this._header,initialBlock:this._initialBlock};let e=this.readHeader();ry('header: "%s" version=0x%s length=%dms (%smin) initialBlockSize=%d',e.identString,e.protocolVersion.toString(16),e.demoLengthMs,(e.demoLengthMs/1e3/60).toFixed(1),e.initialBlockSize);let t=this.buffer.subarray(this.offset,this.offset+e.initialBlockSize),a=this.readInitialBlock(t);this.offset+=e.initialBlockSize;let r=this.buffer.subarray(this.offset);ry("compressed block stream: %d bytes",r.length);let n=await new Promise((e,t)=>{var a,n;a=(a,r)=>{a?t(a):e(r)},n||(n=a,a={}),"function"!=typeof n&&T(7),eo(r,a,[ee],function(e){return en(eI(e.data[0],ei(e.data[1])))},1,n)});return ry("decompressed block stream: %d bytes",n.length),this._decompressedData=n,this._decompressedView=new DataView(n.buffer,n.byteOffset,n.byteLength),this.setupPacketParser(a),this._header=e,this._initialBlock=a,this._blockStreamOffset=0,this._blockCursor=0,this._loaded=!0,{header:e,initialBlock:a}}nextBlock(){if(!this._loaded)throw Error("must call load() first");let e=this._decompressedData,t=this._decompressedView,a=this._blockStreamOffset;if(a+2>e.length)return;let r=t.getUint16(a,!0),n=r>>12,i=4095&r;if(a+2+i>e.length)return void rk("block %d: size %d would exceed decompressed data (offset=%d remaining=%d), stopping",this._blockCursor,i,a+2,e.length-a-2);let o=e.subarray(a+2,a+2+i);this._blockStreamOffset=a+2+i;let s={index:this._blockCursor,type:n,size:i,data:o};if(this._blockCursor++,0===n)try{s.parsed=this.packetParser.parsePacket(o)}catch{}else if(1===n)this.packetParser.onSendPacketTrigger();else if(2===n&&64===i)try{s.parsed=this.readRawMove(o)}catch{}else if(3===n&&8===i)try{s.parsed=this.readInfoBlock(o)}catch{}return s}reset(){if(!this._loaded)throw Error("must call load() first");this._blockStreamOffset=0,this._blockCursor=0,this._blockCount=void 0,this.setupPacketParser(this._initialBlock)}processBlocks(e){if(!this._loaded)throw Error("must call load() first");let t=0;for(let a=0;a=128&&t<128+e2.length?e2[t-128]:`unknown(${t})`;throw Error(`No parser for DataBlock classId ${t} (${e}) at bit ${i}`)}}ry("all %d/%d DataBlocks parsed (%d payloads), bit position after DataBlocks: %d",l,i,s.size,r.getCurPos());let d=r.readU8(),c=[];for(let e=0;e<6;e++)c.push(r.readU32());let u=[];for(let e=0;e<16;e++)u.push(r.readU32());let h=r.readU32(),g=[];for(let e=0;e>3<<3),this.readSimpleTargetManager(r),this.readSimpleTargetManager(r),rS('after sequential tail bit=%d mission="%s" CRC=0x%s',r.getCurPos(),M,B.toString(16))}catch(e){a=e instanceof Error?e.message:String(e)}finally{this.ghostTracker=x}let T=b-r.getCurPos(),R=M.length>0?M.split("").filter(e=>{let t=e.charCodeAt(0);return t>=32&&t<=126}).length/M.length:1,N=M.length>0&&R>=.8&&void 0===a;return ry('initial block: events=%d ghosts=%d ghostingSeq=%d controlObj=%d mission="%s" CRC=0x%s valid=%s%s',I.length,E.length,C,w,M,B.toString(16),N,a?` error=${a}`:""),{taggedStrings:n,dataBlockHeaders:o,dataBlockCount:l,dataBlocks:s,demoSetting:d,connectionFields:c,stateArray:u,scoreEntries:g,demoValues:p,sensorGroupColors:m,targetEntries:f,connectionState:F,roundTripTime:v,packetLoss:y,pathManager:S,notifyCount:k,nextRecvEventSeq:D,ghostingSequence:C,initialGhosts:E,initialEvents:I,controlObjectGhostIndex:w,controlObjectData:t,missionName:M,missionCRC:B,phase2TrailingBits:T,phase2Valid:N,phase2Error:a}}readScoreEntry(e){let t=e.readFlag()?e.readInt(16):0,a=e.readFlag()?e.readInt(16):0,r=e.readFlag()?e.readInt(16):0,n=e.readInt(6),i=e.readInt(6),o=e.readInt(6),s=e.readFlag(),l=[];for(let t=0;t<6;t++)l.push(e.readFlag());return{clientId:t,teamId:a,score:r,field0:n,field1:i,field2:o,isBot:s,triggerFlags:l}}readDemoValues(e){let t=[];for(;e.readFlag();)t.push(e.readString());return t}readComplexTargetManager(e){e.readU8(),e.readU8(),e.readU8(),e.readU8();let t=[];for(let a=0;a<32;a++)for(let r=0;r<32;r++)e.readFlag()&&t.push({group:a,targetGroup:r,r:e.readU8(),g:e.readU8(),b:e.readU8(),a:e.readU8()});let a=[];for(let t=0;t<512;t++){if(!e.readFlag())continue;let r={targetId:t,sensorGroup:0,targetData:0,damageLevel:0};e.readFlag()&&(r.sensorData=e.readU32()),e.readFlag()&&(r.voiceMapData=e.readU32()),e.readFlag()&&(r.name=e.readString()),e.readFlag()&&(r.skin=e.readString()),e.readFlag()&&(r.skinPref=e.readString()),e.readFlag()&&(r.voice=e.readString()),e.readFlag()&&(r.typeDescription=e.readString()),r.sensorGroup=e.readInt(5),r.targetData=e.readInt(9),t>=32&&e.readFlag()&&(r.dataBlockRef=e.readInt(11)),r.damageLevel=e.readFloat(7),a.push(r)}return{sensorGroupColors:t,targets:a}}readPathManager(e){let t=[],a=e.readU32();for(let r=0;rthis.registry.getDataBlockParser(e)};t=i.unpack(e,a)}catch{a.push({classId:r,guaranteed:!0,dataBitsStart:n,dataBitsEnd:n});break}else{a.push({classId:r,guaranteed:!0,dataBitsStart:n,dataBitsEnd:n});break}a.push({classId:r,guaranteed:!0,dataBitsStart:n,dataBitsEnd:e.getCurPos(),parsedData:t}),rS(" event classId=%d bits=%d",r,e.getCurPos()-n)}return{nextRecvEventSeq:t,events:a}}readGhostStartBlock(e,t){let a=e.readU32(),r=[];rS("ghost block: seq=%d bit=%d",a,e.getCurPos());let n=this.registry.getGhostCatalog(),i=8*e.getBuffer().length,o=new Map;for(let[e,a]of t)o.set(e,a.data);for(;e.readFlag()&&!e.isError();){let a=e.readInt(10),s=e.readInt(7)+0,l=e.getCurPos(),d=[],c=new Set,{entry:u}=this.identifyGhostViaDataBlock(e,t,n),h=this.registry.getGhostParser(s);h&&(d.push({entry:h,method:"registry"}),c.add(h)),u&&!c.has(u)&&(d.push({entry:u,method:"datablock"}),c.add(u));let g={getDataBlockData:e=>o.get(e),getDataBlockParser:e=>this.registry.getDataBlockParser(e)},p=!1;for(let{entry:t,method:n}of d){let o="registry"===n,d=this.tryGhostParser(e,t,l,i,!1,g,o);if(!1!==d){this.ghostTracker.createGhost(a,s,t.name),rS(" ghost idx=%d classId=%d parser=%s bits=%d via=%s",a,s,t.name,e.getCurPos()-l,n),r.push({index:a,type:"create",classId:s,updateBitsStart:l,updateBitsEnd:e.getCurPos(),parsedData:d}),p=!0;break}}if(!p){rS(" ghost idx=%d classId=%d NO PARSER (stopping at bit=%d, remaining=%d)",a,s,l,i-l);break}}return rS("ghost loop ended at bit=%d remaining=%d count=%d",e.getCurPos(),i-e.getCurPos(),r.length),{ghostingSequence:a,ghosts:r}}tryGhostParser(e,t,a,r,n=!1,i,o=!1){let s=e.savePos();n||rS(" try %s: startBit=%d",t.name,a);try{let l=t.unpackUpdate(e,!0,{compressionPoint:{x:0,y:0,z:0},ghostTracker:this.ghostTracker,...i}),d=e.getCurPos()-a,c=r-e.getCurPos();if(e.isError()||!o&&d<3)return n||rS(" reject %s: bits=%d isError=%s",t.name,d,e.isError()),e.restorePos(s),!1;if(c>1e3){let a=e.getCurPos(),r=e.readFlag();if(e.setCurPos(a),!r)return n||rS(" reject %s: bits=%d misaligned (remaining=%d)",t.name,d,c),e.restorePos(s),!1}return l??{}}catch(a){return n||rS(" reject %s: error at bit=%d: %s",t.name,e.getCurPos(),a instanceof Error?a.message:String(a)),e.restorePos(s),!1}}identifyGhostViaDataBlock(e,t,a){let r;if(!t)return{entry:void 0,dbFlag:!1};let n=e.savePos(),i=!1;try{if(i=e.readFlag()){let n=e.readInt(11),i=t.get(n);if(i){let e=i.className.replace(/Data$/,"");(r=a.get(e))||rS(" identifyGhostViaDataBlock: dbId=%d className=%s ghostName=%s (no ghost parser)",n,i.className,e)}else rS(" identifyGhostViaDataBlock: dbId=%d (no DataBlock found)",n)}else rS(" identifyGhostViaDataBlock: DataBlock flag=0")}catch{}return e.restorePos(n),{entry:r,dbFlag:i}}readRawMove(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),a=t.getInt32(0,!0),r=t.getInt32(4,!0),n=t.getInt32(8,!0),i=t.getUint32(12,!0),o=t.getUint32(16,!0),s=t.getUint32(20,!0),l=t.getFloat32(24,!0),d=t.getFloat32(28,!0),c=t.getFloat32(32,!0),u=t.getFloat32(36,!0),h=t.getFloat32(40,!0),g=t.getFloat32(44,!0),p=t.getUint32(48,!0),m=t.getUint32(52,!0),f=0!==e[56],F=[];for(let t=0;t<6;t++)F.push(0!==e[57+t]);return{px:a,py:r,pz:n,pyaw:i,ppitch:o,proll:s,x:l,y:d,z:c,yaw:u,pitch:h,roll:g,id:p,sendCount:m,freeLook:f,trigger:F}}readInfoBlock(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength);return{value1:t.getUint32(0,!0),value2:t.getFloat32(4,!0)}}}function rP(){let e=new e8,t=new e4;ak(e),t2(e),rv(e),e.bindDeterministicDataBlocks(e2,128),e.bindDeterministicGhosts(e3,0),e.bindDeterministicEvents(e1,255);let a=new e6(e,t,{dataBlockDataMap:new Map});return{registry:e,ghostTracker:t,packetParser:a}}e.s(["DemoParser",()=>rb],58281),e.s(["createLiveParser",()=>rP],45853),e.s([],50593);var rx=e.i(90072);let rI=new Set(["FlyingVehicle","HoverVehicle","WheeledVehicle"]),rD=new Set(["BombProjectile","EnergyProjectile","FlareProjectile","GrenadeProjectile","LinearFlareProjectile","LinearProjectile","Projectile","SeekerProjectile","TracerProjectile"]),rC=new Set(["LinearProjectile","TracerProjectile","LinearFlareProjectile","Projectile"]),rE=new Set(["GrenadeProjectile","EnergyProjectile","FlareProjectile","BombProjectile"]),rw=new Set(["SeekerProjectile"]),rM=new Set(["StaticShape","ScopeAlwaysShape","Turret","BeaconObject","ForceFieldBare"]);function rB(e){return"Player"===e?"Player":rI.has(e)?"Vehicle":"Item"===e?"Item":rD.has(e)?"Projectile":rM.has(e)?"Deployable":"Ghost"}function rT(e,t){return`${e}_${t}`}let rR=Object.freeze({r:0,g:255,b:0}),rN=Object.freeze({r:255,g:0,b:0});e.s(["IFF_GREEN",0,rR,"IFF_RED",0,rN,"TICK_DURATION_MS",0,32,"ballisticProjectileClassNames",0,rE,"linearProjectileClassNames",0,rC,"projectileClassNames",0,rD,"seekerProjectileClassNames",0,rw,"toEntityId",()=>rT,"toEntityType",()=>rB],25311);let rG=new rx.Matrix4,rA=new rx.Quaternion;function rU(e,t,a){return ea?a:e}let rj=.494*Math.PI;function rO(e,t){let a=Math.sin(t),r=Math.cos(t),n=Math.sin(e),i=Math.cos(e);return rG.set(-n,i*a,-i*r,0,0,r,a,0,i,n*a,-n*r,0,0,0,0,1),rA.setFromRotationMatrix(rG),[rA.x,rA.y,rA.z,rA.w]}function rz(e){let t=-e/2;return[0,Math.sin(t),0,Math.cos(t)]}function rL(e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.z)||!Number.isFinite(e.w))return null;let t=-e.y,a=-e.z,r=-e.x,n=e.w,i=t*t+a*a+r*r+n*n;if(i<=1e-12)return null;let o=1/Math.sqrt(i);return[t*o,a*o,r*o,n*o]}function rV(e){return null!=e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z)}function r_(e){return!!e&&"object"==typeof e&&"number"==typeof e.x&&"number"==typeof e.y&&"number"==typeof e.z}function rq(e){return!!e&&"object"==typeof e&&"number"==typeof e.x&&"number"==typeof e.y&&"number"==typeof e.z&&"number"==typeof e.w}function r$(e,t){let a;if(t)return"string"==typeof(a=rD.has(e)||e.endsWith("ProjectileData")?t.projectileShapeName:"DebrisData"===e?t.shapeFileName:t.shapeName)&&a.length>0?a:void 0}function rH(e,t){if(e)for(let a of t){let t=e[a];if("number"==typeof t&&Number.isFinite(t))return t}}function rW(e,t){if(e)for(let a of t){let t=e[a];if("string"==typeof t&&t.length>0)return t}}function rX(e,t){if(!t)return;let a=rW(t,["tracerTex0","textureName0","texture0"])??"";if(!("TracerProjectile"===e||a.length>0&&null!=rH(t,["tracerLength"]))||!a)return;let r=rW(t,["tracerTex1","textureName1","texture1"]),n=rH(t,["tracerLength"])??10,i=rH(t,["tracerWidth"]),o=rH(t,["tracerAlpha"]),s=null!=i&&(null!=rH(t,["crossViewAng"])||i<=.7)?i:o??i??.5,l=rH(t,["crossViewAng","crossViewFraction"])??("number"==typeof t.tracerWidth&&t.tracerWidth>.7?t.tracerWidth:.98);return{kind:"tracer",texture:a,crossTexture:r,tracerLength:n,tracerWidth:s,crossViewAng:l,crossSize:rH(t,["crossSize","muzzleVelocity"])??.45,renderCross:function(e,t){if(e)for(let a of t){let t=e[a];if("boolean"==typeof t)return t}}(t,["renderCross","proximityRadius"])??!0}}function rZ(e,t){if(t){if("LinearFlareProjectile"===e){let e=rW(t,["smokeTexture","flareTexture"]);if(!e)return;let a=t.flareColor,r=rH(t,["size"])??.5;return{kind:"sprite",texture:e,color:a?{r:a.r,g:a.g,b:a.b}:{r:1,g:1,b:1},size:r}}if("FlareProjectile"===e){let e=rW(t,["flareTexture"]);if(!e)return;return{kind:"sprite",texture:e,color:{r:1,g:.9,b:.5},size:rH(t,["size"])??4}}}}function rY(e){let t=e.states;if(Array.isArray(t)&&0!==t.length)return t.map(e=>{let t=e=>null==e?-1:e-1;return{name:e.name??"",transitionOnNotLoaded:t(e.transitionOnAmmo),transitionOnLoaded:t(e.transitionOnNoAmmo),transitionOnNoAmmo:t(e.transitionOnTarget),transitionOnAmmo:t(e.transitionOnNoTarget),transitionOnNoTarget:t(e.transitionOnWet),transitionOnTarget:t(e.transitionOnNotWet),transitionOnNotWet:t(e.transitionOnTriggerUp),transitionOnWet:t(e.transitionOnTriggerDown),transitionOnTriggerUp:t(e.transitionOnTimeout),transitionOnTriggerDown:t(e.transitionGeneric0In),transitionOnTimeout:t(e.transitionGeneric0Out),timeoutValue:e.timeoutValue,waitForTimeout:e.waitForTimeout??!1,fire:e.fire??!1,sequence:e.sequence,spin:e.spin??0,direction:e.direction??!0,scaleAnimation:e.scaleAnimation??!1,loaded:e.loaded??0,soundDataBlockId:e.sound??-1}})}function rJ(e){let t="";for(let a=0;a=32&&(t+=e[a]);return t}let rK={2:0,3:1,4:2,5:3,6:4,7:5,8:6,11:7,12:8,14:9};function rQ(e){for(let t=0;t=32)break}}function r0(e){let t=[],a=0,r="",n=!1;for(let i=0;i=32&&(r+=e[i]);continue}let s=rK[o];void 0!==s?(r&&(t.push({text:r,colorCode:a}),r=""),a=s):15===o?(r&&(t.push({text:r,colorCode:a}),r=""),a=0):o>=32&&(r+=e[i])}return r&&t.push({text:r,colorCode:a}),t}function r2(e){let t=e.indexOf("~w");return -1===t?{text:e,wavPath:null}:{text:e.substring(0,t),wavPath:e.substring(t+2)}}function r3(e){return e?"number"==typeof e.cameraMode?"camera":"number"==typeof e.rotationZ?"player":null:null}let r1=new Map([["gui/hud_new_packammo",0],["gui/hud_new_packcloak",1],["gui/hud_new_packenergy",2],["gui/hud_new_packrepair",3],["gui/hud_new_packsatchel",4],["gui/hud_new_packshield",5],["gui/hud_new_packinventory",6],["gui/hud_new_packmotionsens",7],["gui/hud_new_packradar",8],["gui/hud_new_packturretout",9],["gui/hud_new_packturretin",10],["gui/hud_new_packsensjam",11],["gui/hud_new_packturret",12],["gui/hud_satchel_unarmed",18]]);function r5(e){let t=e.toLowerCase();for(let[e,a]of r1)if(e===t)return a;return -1}e.s(["CameraMode_OrbitObject",0,3,"MAX_PITCH",0,rj,"backpackBitmapToIndex",()=>r5,"clamp",()=>rU,"detectColorCode",()=>rQ,"detectControlObjectType",()=>r3,"extractWavTag",()=>r2,"getNumberField",()=>rH,"isQuatLike",()=>rq,"isValidPosition",()=>rV,"isVec3Like",()=>r_,"parseColorSegments",()=>r0,"parseWeaponImageStates",()=>rY,"playerYawToQuaternion",()=>rz,"resolveShapeName",()=>r$,"resolveSpriteVisual",()=>rZ,"resolveTracerVisual",()=>rX,"stripTaggedStringMarkup",()=>rJ,"torqueQuatToThreeJS",()=>rL,"yawPitchToQuaternion",()=>rO],89119),e.i(70847);var r6=e.i(47566),r8=e.i(8328);class r4{registry;ghostTracker;entities=new Map;entityIdByGhostIndex=new Map;tickCount=0;camera=null;chatMessages=[];audioEvents=[];netStrings=new Map;targetNames=new Map;targetTeams=new Map;targetRenderFlags=new Map;pendingNameTags=new Map;sensorGroupColors=new Map;playerSensorGroup=0;lastStatus={health:1,energy:1};latestControl={ghostIndex:-1};controlPlayerGhostId;lastControlType="camera";isPiloting=!1;lastCameraMode;lastOrbitGhostIndex;lastOrbitDistance;latestFov=90;weaponsHud={slots:new Map,activeIndex:-1};backpackHud={packIndex:-1,active:!1,text:""};inventoryHud={slots:new Map,activeSlot:-1};teamScores=[];playerRoster=new Map;nextExplosionId=0;resolveGhostClassName(e,t){if("number"==typeof t){let e=this.registry.getGhostParser(t)?.name;if(e)return e}let a=this.entityIdByGhostIndex.get(e);if(a){let e=this.entities.get(a);if(e?.className)return e.className}let r=this.ghostTracker.getGhost(e);if(r?.className)return r.className}resolveEntityIdForGhostIndex(e){let t=this.entityIdByGhostIndex.get(e);if(t)return t;let a=this.ghostTracker.getGhost(e);if(a)return rT(a.className,e)}resetSharedState(){this.entities.clear(),this.entityIdByGhostIndex.clear(),this.tickCount=0,this.camera=null,this.chatMessages=[],this.audioEvents=[],this.netStrings.clear(),this.targetNames.clear(),this.targetTeams.clear(),this.targetRenderFlags.clear(),this.sensorGroupColors.clear(),this.playerSensorGroup=0,this.lastStatus={health:1,energy:1},this.latestControl={ghostIndex:-1},this.controlPlayerGhostId=void 0,this.lastControlType="camera",this.isPiloting=!1,this.lastCameraMode=void 0,this.lastOrbitGhostIndex=void 0,this.lastOrbitDistance=void 0,this.latestFov=90,this.weaponsHud={slots:new Map,activeIndex:-1},this.backpackHud={packIndex:-1,active:!1,text:""},this.inventoryHud={slots:new Map,activeSlot:-1},this.teamScores=[],this.playerRoster.clear(),this.nextExplosionId=0}resolveNetString(e){if(e.length>=2&&1===e.charCodeAt(0)){let t=parseInt(e.slice(1),10);if(Number.isFinite(t))return this.netStrings.get(t)??e}return e}formatRemoteArgs(e,t){let a=this.resolveNetString(e);for(let e=0;e0&&(this.playerSensorGroup=t.sensorGroup)}if(t){let e=r3(t);if(e&&(this.lastControlType=e),"player"===this.lastControlType)this.isPiloting=!!(t.pilot||null!=t.controlObjectGhost);else if(this.isPiloting=!1,"number"==typeof t.cameraMode)if(this.lastCameraMode=t.cameraMode,3===t.cameraMode){"number"==typeof t.orbitObjectGhostIndex&&(this.lastOrbitGhostIndex=t.orbitObjectGhostIndex);let e=t.minOrbitDist,a=t.maxOrbitDist,r=t.curOrbitDist;"number"==typeof e&&"number"==typeof a&&Number.isFinite(e)&&Number.isFinite(a)?this.lastOrbitDistance=Math.max(0,a-e):"number"==typeof r&&Number.isFinite(r)&&(this.lastOrbitDistance=Math.max(0,r))}else this.lastOrbitGhostIndex=void 0,this.lastOrbitDistance=void 0}void 0!==e.cameraFov&&(this.latestFov=e.cameraFov)}processEvent(e,t){let a=e.parsedData;if(!a)return;let r=a.type;if("GhostAlwaysObjectEvent"===r){let e=a.ghostIndex,t=a.classId,r=a.objectData;null!=e&&null!=t&&this.processGhostUpdate({index:e,type:"create",classId:t,parsedData:r});return}if("NetStringEvent"===r||"NetStringEvent"===t){let e=a.id,t=a.value;if(null!=e&&"string"==typeof t){this.netStrings.set(e,t);let a=this.pendingNameTags.get(e);if(null!=a){this.pendingNameTags.delete(e);let r=rJ(t);for(let e of(this.targetNames.set(a,r),this.entities.values()))e.targetId===a&&(e.playerName=r)}}return}if("TargetInfoEvent"===r||"TargetInfoEvent"===t){let e=a.targetId,t=a.nameTag;if(null!=e&&null!=t){let a=this.netStrings.get(t);a?this.targetNames.set(e,rJ(a)):this.pendingNameTags.set(t,e)}let r=a.sensorGroup;null!=e&&null!=r&&this.targetTeams.set(e,r);let n=a.renderFlags;if(null!=e&&null!=n&&this.targetRenderFlags.set(e,n),null!=e){let t=this.targetNames.get(e),a=this.targetTeams.get(e),r=this.targetRenderFlags.get(e);for(let n of this.entities.values())n.targetId===e&&(t&&(n.playerName=t),null!=a&&(n.sensorGroup=a),null!=r&&(n.targetRenderFlags=r))}return}if("SetSensorGroupEvent"===r||"SetSensorGroupEvent"===t){let e=a.sensorGroup;null!=e&&(this.playerSensorGroup=e);return}if("SensorGroupColorEvent"===r||"SensorGroupColorEvent"===t){let e=a.sensorGroup,t=a.colors;if(t){let a=this.sensorGroupColors.get(e);for(let r of(a||(a=new Map,this.sensorGroupColors.set(e,a)),t))r.default?a.delete(r.index):a.set(r.index,{r:r.r??0,g:r.g??0,b:r.b??0})}return}if("RemoteCommandEvent"===r||"RemoteCommandEvent"===t){let e=this.resolveNetString(a.funcName),t=a.args,r=this.getTimeSec();if("ChatMessage"===e&&t.length>=4){let e=rQ(this.resolveNetString(t[3])),a=t[4]?rJ(this.resolveNetString(t[4])):"",n=this.formatRemoteArgs(t[3],t.slice(4));if(n){let i,o,s=n.indexOf(": "),{text:l,wavPath:d}=r2(s>=0?n.slice(s+2):n);if(d){let e=this.resolveNetString(t[1]);i=e?`voice/${e}/${d}.wav`:d;let a=this.resolveNetString(t[2]);if(a){let e=parseFloat(a);Number.isFinite(e)&&(o=Math.max(.5,Math.min(2,e)))}}let c=e??0;this.pushChatMessage({timeSec:r,sender:a,text:l,kind:"chat",colorCode:c,segments:[{text:a?`${a}: ${l}`:l,colorCode:c}],soundPath:i,soundPitch:o})}}else if("CannedChatMessage"===e&&t.length>=6){let e=rQ(this.resolveNetString(t[1])),a=rJ(this.resolveNetString(t[2])),n=rJ(this.resolveNetString(t[4])),i=this.formatRemoteArgs(t[1],t.slice(2));if(i){let o,s,{wavPath:l}=r2(i),d=r2(rJ(this.resolveNetString(t[3]))).text;if(l){let e=this.resolveNetString(t[5]);if(o=e?`voice/${e}/${l}.wav`:l,t[6]){let e=parseFloat(this.resolveNetString(t[6]));Number.isFinite(e)&&(s=Math.max(.5,Math.min(2,e)))}}let c=e??0,u=[];n&&u.push({text:`[${n}] `,colorCode:0}),u.push({text:a?`${a}: ${d}`:d,colorCode:c}),this.pushChatMessage({timeSec:r,sender:a,text:d,kind:"chat",colorCode:c,segments:u,soundPath:o,soundPitch:s})}}else if("ServerMessage"===e&&t.length>=2){this.handleServerMessage(t);let e=rQ(this.resolveNetString(t[1])),a=this.formatRemoteArgs(t[1],t.slice(2));if(a){let{text:t,wavPath:n}=r2(a),i=e??0;this.pushChatMessage({timeSec:r,sender:"",text:t,kind:"server",colorCode:i,segments:[{text:t,colorCode:i}],soundPath:n??void 0})}}else this.handleHudRemoteCommand(e,t);return}if("Sim3DAudioEvent"===r||"Sim2DAudioEvent"===r||"Sim3DAudioEvent"===t||"Sim2DAudioEvent"===t){let e=a.profileId;if("number"==typeof e){let n=this.getTimeSec(),i="Sim3DAudioEvent"===r||"Sim3DAudioEvent"===t?a.position:void 0;this.audioEvents.push({profileId:e,position:i,timeSec:n}),this.audioEvents.length>100&&this.audioEvents.splice(0,this.audioEvents.length-100)}}}processGhostUpdate(e){let t,a=e.index,r=this.entityIdByGhostIndex.get(a);if(r){let t=this.entities.get(r);t&&"Projectile"===t.type&&!t.hasExploded&&null!=t.explosionDataBlockId&&t.position&&("delete"===e.type||"create"===e.type)&&this.spawnExplosion(t,[...t.position])}if("delete"===e.type){r&&(this.removeSoundSlotEntities(r),this.entities.delete(r),this.entityIdByGhostIndex.delete(a));return}let n=this.resolveGhostClassName(a,e.classId);if(!n){if("create"===e.type)throw Error(`No ghost parser for classId ${e.classId} (ghost index ${a})`);return}let i=rT(n,a);r&&r!==i&&(this.removeSoundSlotEntities(r),this.entities.delete(r));let o=this.entities.get(i);if(o&&"create"===e.type?(this.removeSoundSlotEntities(i),o.spawnTick=this.tickCount,this.resetEntity(o),t=o):o?t=o:(t={id:i,ghostIndex:a,className:n,spawnTick:this.tickCount,type:rB(n),rotation:[0,0,0,1]},this.entities.set(i,t)),t.ghostIndex=a,t.className=n,t.type=rB(n),this.entityIdByGhostIndex.set(a,i),this.applyGhostData(t,e.parsedData),"create"===e.type&&e.parsedData){let r=(0,r6.ghostToSceneObject)(n,a,e.parsedData);r&&(t.sceneData=r)}}resetEntity(e){e.rotation=[0,0,0,1],e.hasExploded=void 0,e.explosionShape=void 0,e.explosionLifetimeTicks=void 0,e.faceViewer=void 0,e.simulatedVelocity=void 0,e.projectilePhysics=void 0,e.gravityMod=void 0,e.direction=void 0,e.velocity=void 0,e.position=void 0,e.dataBlock=void 0,e.dataBlockId=void 0,e.shapeHint=void 0,e.visual=void 0,e.targetId=void 0,e.targetRenderFlags=void 0,e.carryingFlag=void 0,e.sensorGroup=void 0,e.playerName=void 0,e.weaponShape=void 0,e.weaponImageState=void 0,e.weaponImageStates=void 0,e.weaponImageStatesDbId=void 0,e.itemPhysics=void 0,e.threads=void 0,e.headPitch=void 0,e.headYaw=void 0,e.health=void 0,e.energy=void 0,e.maxEnergy=void 0,e.damageState=void 0,e.actionAnim=void 0,e.actionAtEnd=void 0,e.explosionDataBlockId=void 0,e.maintainEmitterId=void 0}applyGhostData(e,t){if(!t)return;let a=t.dataBlockId;if(null!=a){e.dataBlockId=a;let t=this.getDataBlockData(a),r=r$(e.className,t);if(e.visual=rX(e.className,t)??rZ(e.className,t),"string"==typeof r&&(e.shapeHint=r,e.dataBlock=r),"Player"===e.type&&"number"==typeof t?.maxEnergy&&(e.maxEnergy=t.maxEnergy),"Projectile"===e.type&&(rC.has(e.className)?e.projectilePhysics="linear":rE.has(e.className)?(e.projectilePhysics="ballistic",e.gravityMod=rH(t,["gravityMod"])??1):rw.has(e.className)&&(e.projectilePhysics="seeker")),"Projectile"===e.type&&null==e.explosionDataBlockId){let t=this.resolveExplosionInfo(a);t&&(e.explosionShape=t.shape,e.faceViewer=t.faceViewer,e.explosionLifetimeTicks=t.lifetimeTicks,e.explosionDataBlockId=t.explosionDataBlockId)}if("Projectile"===e.type&&null==e.maintainEmitterId){let a=t?.baseEmitter;"number"==typeof a&&a>0&&(e.maintainEmitterId=a)}}if("Player"===e.type){let a=t.images;if(Array.isArray(a)&&a.length>0){let t=a.find(e=>0===e.index);if(t?.dataBlockId&&t.dataBlockId>0){let a=this.getDataBlockData(t.dataBlockId),r=r$("ShapeBaseImageData",a);if(r){let t=a?.mountPoint;(null==t||t<=0)&&!/pack_/i.test(r)&&(e.weaponShape=r)}let n=e.weaponImageState;e.weaponImageState={dataBlockId:t.dataBlockId,triggerDown:t.triggerDown??n?.triggerDown??!1,ammo:t.ammo??n?.ammo??!0,loaded:t.loaded??n?.loaded??!0,target:t.target??n?.target??!1,wet:t.wet??n?.wet??!1,fireCount:t.fireCount??n?.fireCount??0},a&&e.weaponImageStatesDbId!==t.dataBlockId&&(e.weaponImageStates=rY(a),e.weaponImageStatesDbId=t.dataBlockId)}else t&&!t.dataBlockId&&(e.weaponShape=void 0,e.weaponImageState=void 0,e.weaponImageStates=void 0);let r=a.find(e=>3===e.index);if(r){let t=!!r.dataBlockId&&r.dataBlockId>0;if(e.carryingFlag=t,null!=e.targetId&&e.targetId>=0){let a=this.targetRenderFlags.get(e.targetId)??0,r=t?2|a:-3&a;r!==a&&(this.targetRenderFlags.set(e.targetId,r),e.targetRenderFlags=r)}}}}let r=rV(t.position)?t.position:rV(t.initialPosition)?t.initialPosition:rV(t.explodePosition)?t.explodePosition:rV(t.endPoint)?t.endPoint:rV(t.transform?.position)?t.transform.position:void 0;r&&(e.position=[r.x,r.y,r.z],this.updateSoundSlotPositions(e));let n=r_(t.direction)?t.direction:void 0;if(n&&(e.direction=[n.x,n.y,n.z]),"Player"===e.type&&"number"==typeof t.rotationZ&&(e.rotation=rz(t.rotationZ)),"Player"===e.type&&("number"==typeof t.headX&&(e.headPitch=t.headX),"number"==typeof t.headZ&&(e.headYaw=t.headZ)),rq(t.angPosition)){let a=rL(t.angPosition);a&&(e.rotation=a)}else if(rq(t.transform?.rotation)){let a=rL(t.transform.rotation);a&&(e.rotation=a)}else if("Item"===e.type&&"number"==typeof t.rotation?.angle){let a=t.rotation;e.rotation=rz((a.zSign??1)*a.angle)}else if("Projectile"===e.type){let a=t.velocity??t.direction??(rV(t.initialPosition)&&rV(t.endPos)?{x:t.endPos.x-t.initialPosition.x,y:t.endPos.y-t.initialPosition.y,z:t.endPos.z-t.initialPosition.z}:void 0);r_(a)&&(0!==a.x||0!==a.y)&&(e.rotation=rz(Math.atan2(a.x,a.y)))}if(r_(t.velocity)&&(e.velocity=[t.velocity.x,t.velocity.y,t.velocity.z],e.direction||(e.direction=[t.velocity.x,t.velocity.y,t.velocity.z])),"Item"===e.type){let a=t.atRest;if(!1===a&&r_(t.velocity)){let a=null!=e.dataBlockId?this.getDataBlockData(e.dataBlockId):void 0;e.itemPhysics={velocity:[t.velocity.x,t.velocity.y,t.velocity.z],atRest:!1,elasticity:rH(a,["elasticity"])??.2,friction:rH(a,["friction"])??.6,gravityMod:rH(a,["gravityMod"])??1}}else!0===a&&(e.itemPhysics=void 0)}if(e.projectilePhysics){if("linear"===e.projectilePhysics){let a=rH(null!=e.dataBlockId?this.getDataBlockData(e.dataBlockId):void 0,["dryVelocity","muzzleVelocity","bulletVelocity"])??80,r=e.direction??[0,1,0],n=r[0]*a,i=r[1]*a,o=r[2]*a,s=t.excessVel,l=t.excessDir;"number"==typeof s&&s>0&&r_(l)&&(n+=l.x*s,i+=l.y*s,o+=l.z*s),e.simulatedVelocity=[n,i,o]}else r_(t.velocity)&&(e.simulatedVelocity=[t.velocity.x,t.velocity.y,t.velocity.z]);let a=t.currTick;if("number"==typeof a&&a>0&&e.simulatedVelocity&&e.position){let t=.032*a,r=e.simulatedVelocity;if(e.position[0]+=r[0]*t,e.position[1]+=r[1]*t,e.position[2]+=r[2]*t,"ballistic"===e.projectilePhysics){let a=-9.81*(e.gravityMod??1);e.position[2]+=.5*a*t*t,r[2]+=a*t}}}let i=rV(t.explodePosition)?t.explodePosition:rV(t.explodePoint)?t.explodePoint:void 0;if("Projectile"===e.type&&!e.hasExploded&&i&&null!=e.explosionDataBlockId&&this.spawnExplosion(e,[i.x,i.y,i.z]),"number"==typeof t.damageLevel&&(e.health=rU(1-t.damageLevel,0,1)),"number"==typeof t.damageState&&(e.damageState=t.damageState),"number"==typeof t.action&&(e.actionAnim=t.action,e.actionAtEnd=!!t.actionAtEnd),Array.isArray(t.threads)){let a=t.threads;if(e.threads){let t=[...e.threads];for(let e of a){let a=t.findIndex(t=>t.index===e.index);a>=0?t[a]=e:t.push(e)}e.threads=t}else e.threads=a}if("number"==typeof t.energy&&(e.energy=rU(t.energy,0,1)),"number"==typeof t.targetId){e.targetId=t.targetId;let a=this.targetNames.get(t.targetId);a&&(e.playerName=a);let r=this.targetTeams.get(t.targetId);null!=r&&(e.sensorGroup=r,e.ghostIndex===this.latestControl.ghostIndex&&"player"===this.lastControlType&&(this.playerSensorGroup=r));let n=this.targetRenderFlags.get(t.targetId);null!=n&&(e.targetRenderFlags=n)}let o=t.sounds;Array.isArray(o)&&this.syncSoundSlotEntities(e,o),"WayPoint"===e.className&&"string"==typeof t.name&&(e.label=t.name),"AudioEmitter"===e.className&&("string"==typeof t.filename&&(e.audioFileName=t.filename),"number"==typeof t.volume&&(e.audioVolume=t.volume),"boolean"==typeof t.is3D&&(e.audioIs3D=t.is3D),"boolean"==typeof t.isLooping&&(e.audioIsLooping=t.isLooping),"number"==typeof t.minDistance&&(e.audioMinDistance=t.minDistance),"number"==typeof t.maxDistance&&(e.audioMaxDistance=t.maxDistance),"number"==typeof t.minLoopGap&&(e.audioMinLoopGap=t.minLoopGap),"number"==typeof t.maxLoopGap&&(e.audioMaxLoopGap=t.maxLoopGap))}syncSoundSlotEntities(e,t){for(let a of t){let t=`${e.id}:sound:${a.index}`;if(a.playing&&"number"==typeof a.profileId){let r=this.getDataBlockData(a.profileId),n=r?.filename;if(!n)continue;let i=n.endsWith(".wav")?n:`${n}.wav`,o=r.description,s=null!=o?this.getDataBlockData(o):void 0,l=this.entities.get(t);l?l.position=e.position:this.entities.set(t,{id:t,ghostIndex:e.ghostIndex,className:"AudioEmitter",type:"AudioEmitter",spawnTick:this.tickCount,position:e.position,rotation:[0,0,0,1],audioFileName:i,audioVolume:s?.volume??1,audioIs3D:s?.is3D??!0,audioIsLooping:s?.isLooping??!1,audioMinDistance:s?.referenceDistance??20,audioMaxDistance:s?.maxDistance??100,audioMinLoopGap:s?.minLoopGap??0,audioMaxLoopGap:s?.maxLoopGap??0})}else this.entities.delete(t)}}updateSoundSlotPositions(e){for(let t=0;t<4;t++){let a=this.entities.get(`${e.id}:sound:${t}`);a&&(a.position=e.position)}}removeSoundSlotEntities(e){for(let t=0;t<4;t++)this.entities.delete(`${e}:sound:${t}`)}resolveExplosionInfo(e){let t=this.getDataBlockData(e);if(!t)return;let a=t.explosion;if(null==a)return;let r=this.getDataBlockData(a);if(!r)return;let n=r.dtsFileName||void 0,i=r.lifetimeMS??31;return{shape:n,faceViewer:!1!==r.faceViewer&&0!==r.faceViewer,lifetimeTicks:i,explosionDataBlockId:a}}spawnExplosion(e,t){e.hasExploded=!0;let a=e.explosionLifetimeTicks??31,r=`fx_${this.nextExplosionId++}`,n={id:r,ghostIndex:-1,className:"Explosion",spawnTick:this.tickCount,type:"Explosion",dataBlock:e.explosionShape,explosionDataBlockId:e.explosionDataBlockId,position:t,rotation:[0,0,0,1],isExplosion:!0,faceViewer:!1!==e.faceViewer,expiryTick:this.tickCount+a};if(this.entities.set(r,n),null!=e.explosionDataBlockId){let a=this.getDataBlockData(e.explosionDataBlockId),r=a?.subExplosions;if(Array.isArray(r))for(let e of r){if(null==e)continue;let a=this.getDataBlockData(e);if(!a)continue;let r=a.dtsFileName||void 0;if(!r)continue;let n=a.lifetimeMS??31,i=a.offset??0,o=Math.random()*Math.PI*2,s=[t[0]+Math.cos(o)*i,t[1]+Math.sin(o)*i,t[2]],l=`fx_${this.nextExplosionId++}`,d={id:l,ghostIndex:-1,className:"Explosion",spawnTick:this.tickCount,type:"Explosion",dataBlock:r,explosionDataBlockId:e,position:s,rotation:[0,0,0,1],isExplosion:!0,faceViewer:!1!==a.faceViewer&&0!==a.faceViewer,expiryTick:this.tickCount+n};this.entities.set(l,d)}}e.position=void 0,e.simulatedVelocity=void 0}advanceProjectiles(){for(let e of this.entities.values()){if(!e.simulatedVelocity||!e.position)continue;let t=e.simulatedVelocity,a=e.position;"ballistic"===e.projectilePhysics&&(t[2]+=-9.81*(e.gravityMod??1)*.032),a[0]+=.032*t[0],a[1]+=.032*t[1],a[2]+=.032*t[2],(0!==t[0]||0!==t[1])&&(e.rotation=rz(Math.atan2(t[0],t[1])))}}advanceItems(){for(let e of this.entities.values()){let t=e.itemPhysics;if(!t||t.atRest||!e.position)continue;let a=t.velocity,r=e.position;a[2]+=-20*t.gravityMod*.032,r[0]+=.032*a[0],r[1]+=.032*a[1],r[2]+=.032*a[2];let n=(0,r8.getTerrainHeightAt)(r[0],r[1]);if(null!=n&&r[2]0){let e=Math.max(0,1-i/o);a[0]*=e,a[1]*=e}.15>Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])&&(a[0]=a[1]=a[2]=0,t.atRest=!0)}}}removeExpiredExplosions(){for(let[e,t]of this.entities)t.isExplosion&&null!=t.expiryTick&&this.tickCount>=t.expiryTick&&this.entities.delete(e)}updateCameraAndHud(){let e=this.latestControl,t=this.getTimeSec(),a=e.data,r=this.lastControlType;if(this.removeExpiredExplosions(),e.position){let{yaw:n,pitch:i}=this.getCameraYawPitch(a);if(this.camera={time:t,position:[e.position.x,e.position.y,e.position.z],rotation:rO(n,rU(i,-rj,rj)),fov:this.latestFov,mode:"observer",yaw:n,pitch:i},"camera"===r)if(("number"==typeof a?.cameraMode?a.cameraMode:this.lastCameraMode)===3){this.camera.mode="third-person","number"==typeof this.lastOrbitDistance&&(this.camera.orbitDistance=this.lastOrbitDistance);let e="number"==typeof a?.orbitObjectGhostIndex?a.orbitObjectGhostIndex:this.lastOrbitGhostIndex;"number"==typeof e&&e>=0&&(this.camera.orbitTargetId=this.resolveEntityIdForGhostIndex(e))}else this.camera.mode="observer";else this.camera.mode="first-person",e.ghostIndex>=0&&(this.controlPlayerGhostId=this.resolveEntityIdForGhostIndex(e.ghostIndex)),this.controlPlayerGhostId&&(this.camera.controlEntityId=this.controlPlayerGhostId);if("player"===r&&!this.isPiloting&&this.controlPlayerGhostId&&e.position){let t=this.entities.get(this.controlPlayerGhostId);t&&(t.position=[e.position.x,e.position.y,e.position.z],t.rotation=rz(n),t.headPitch=this.getControlPlayerHeadPitch(i))}}else this.camera&&(this.camera={...this.camera,time:t,fov:this.latestFov});let n={health:1,energy:1};if(this.camera?.mode==="first-person"){let e=this.controlPlayerGhostId,t=e?this.entities.get(e):void 0;n.health=t?.health??1;let r=a?.energyLevel;if("number"==typeof r){let e=t?.maxEnergy??60;e>0&&(n.energy=rU(r/e,0,1))}else n.energy=t?.energy??1}else if(this.camera?.mode==="third-person"&&this.camera.orbitTargetId){let e=this.entities.get(this.camera.orbitTargetId);n.health=e?.health??1,n.energy=e?.energy??1}this.lastStatus=n}getControlPlayerHeadPitch(e){return rU(e/rj,-1,1)}getAbsoluteRotation(e){return e?"number"==typeof e.rotationZ&&"number"==typeof e.headX?{yaw:e.rotationZ,pitch:e.headX}:"number"==typeof e.rotZ&&"number"==typeof e.rotX?{yaw:e.rotZ,pitch:e.rotX}:null:null}resolveIffColor(e){if(0===this.playerSensorGroup)return;let t=this.sensorGroupColors.get(this.playerSensorGroup);if(t){let a=t.get(e);if(a)return a}return e===this.playerSensorGroup?rR:0!==e?rN:void 0}pushChatMessage(e){this.chatMessages.push(e),this.chatMessages.length>200&&this.chatMessages.splice(0,this.chatMessages.length-200)}handleServerMessage(e){if(e.length<2)return;let t=this.resolveNetString(e[0]);if("MsgTeamScoreIs"===t&&e.length>=4){let t=parseInt(this.resolveNetString(e[2]),10),a=parseInt(this.resolveNetString(e[3]),10);if(!isNaN(t)&&!isNaN(a)){let e=this.teamScores.find(e=>e.teamId===t);e&&(e.score=a,this.onTeamScoresChanged())}}else if("MsgCTFAddTeam"===t&&e.length>=6){let t=parseInt(this.resolveNetString(e[2]),10),a=rJ(this.resolveNetString(e[3])),r=parseInt(this.resolveNetString(e[5]),10);if(!isNaN(t)){let e=t+1,n=this.teamScores.find(t=>t.teamId===e);n?(n.name=a,n.score=isNaN(r)?n.score:r):this.teamScores.push({teamId:e,name:a,score:isNaN(r)?0:r,playerCount:0}),this.onTeamScoresChanged()}}else if("MsgClientJoin"===t&&e.length>=4){let t=parseInt(this.resolveNetString(e[2]),10),a=rJ(this.resolveNetString(e[3]));if(!isNaN(t)){let e=this.playerRoster.get(t);this.playerRoster.set(t,{name:a,teamId:e?.teamId??0}),this.onRosterChanged()}}else if("MsgClientDrop"===t&&e.length>=3){let t=parseInt(this.resolveNetString(e[2]),10);isNaN(t)||(this.playerRoster.delete(t),this.onRosterChanged())}else if("MsgClientJoinTeam"===t&&e.length>=4){let t=parseInt(this.resolveNetString(e[2]),10),a=parseInt(this.resolveNetString(e[3]),10);if(!isNaN(t)&&!isNaN(a)){let e=this.playerRoster.get(t);e?e.teamId=a:this.playerRoster.set(t,{name:"",teamId:a}),this.onRosterChanged()}}}onTeamScoresChanged(){}onRosterChanged(){}handleHudRemoteCommand(e,t){if("setWeaponsHudItem"===e&&t.length>=3){let e=parseInt(t[0],10),a=parseInt(t[1],10),r="1"===t[2]||"true"===t[2];isNaN(e)||(r?this.weaponsHud.slots.set(e,isNaN(a)?-1:a):this.weaponsHud.slots.delete(e),this.onWeaponsHudChanged())}else if("setWeaponsHudAmmo"===e&&t.length>=2){let e=parseInt(t[0],10),a=parseInt(t[1],10);isNaN(e)||(this.weaponsHud.slots.set(e,isNaN(a)?-1:a),this.onWeaponsHudChanged())}else if("setWeaponsHudActive"===e&&t.length>=1){let e=parseInt(t[0],10);this.weaponsHud.activeIndex=isNaN(e)?-1:e,isNaN(e)||!(e>=0)||this.weaponsHud.slots.has(e)||this.weaponsHud.slots.set(e,-1),this.onWeaponsHudChanged()}else if("setWeaponsHudClearAll"===e)this.weaponsHud.slots.clear(),this.weaponsHud.activeIndex=-1,this.onWeaponsHudChanged();else if("setBackpackHudItem"===e&&t.length>=2){let e=parseInt(t[0],10);"1"!==t[1]&&"true"!==t[1]||isNaN(e)?this.backpackHud.packIndex=-1:this.backpackHud.packIndex=e,this.backpackHud.active=!1,this.backpackHud.text=""}else if("setSatchelArmed"===e)this.backpackHud.active=!0;else if("setCloakIconOn"===e||"setRepairPackIconOn"===e||"setShieldIconOn"===e||"setSenJamIconOn"===e)this.backpackHud.active=!0;else if("setCloakIconOff"===e||"setRepairPackIconOff"===e||"setShieldIconOff"===e||"setSenJamIconOff"===e)this.backpackHud.active=!1;else if("updatePackText"===e&&t.length>=1)this.backpackHud.text=t[0]??"";else if("setInventoryHudItem"===e&&t.length>=3){let e=parseInt(t[0],10),a=parseInt(t[1],10),r="1"===t[2]||"true"===t[2];isNaN(e)||(r&&!isNaN(a)?this.inventoryHud.slots.set(e,a):this.inventoryHud.slots.delete(e),this.onInventoryHudChanged())}else if("setInventoryHudAmount"===e&&t.length>=2){let e=parseInt(t[0],10),a=parseInt(t[1],10);isNaN(e)||isNaN(a)||(this.inventoryHud.slots.set(e,a),this.onInventoryHudChanged())}else"setInventoryHudClearAll"===e&&(this.inventoryHud.slots.clear(),this.inventoryHud.activeSlot=-1,this.onInventoryHudChanged())}onWeaponsHudChanged(){}onInventoryHudChanged(){}buildEntityList(e){let t=[];for(let a of this.entities.values()){if(e&&!e(a))continue;let r=null!=a.targetId&&a.targetId>=0?this.targetRenderFlags.get(a.targetId)??a.targetRenderFlags:a.targetRenderFlags;"Player"!==a.type||a.carryingFlag||(r=null!=r?-3&r:r),t.push({id:a.id,type:a.type,visual:a.visual,direction:a.direction,ghostIndex:a.ghostIndex,className:a.className,dataBlockId:a.dataBlockId,shapeHint:a.shapeHint,dataBlock:a.dataBlock,weaponShape:a.weaponShape,playerName:a.playerName,targetRenderFlags:r,iffColor:("Player"===a.type||((r??0)&2)!=0)&&null!=a.sensorGroup?this.resolveIffColor(a.sensorGroup):void 0,position:a.position&&(a.simulatedVelocity||a.itemPhysics&&!a.itemPhysics.atRest)?[...a.position]:a.position,rotation:a.rotation,velocity:a.velocity,health:a.health,energy:a.energy,actionAnim:a.actionAnim,actionAtEnd:a.actionAtEnd,damageState:a.damageState,faceViewer:a.faceViewer,threads:a.threads,explosionDataBlockId:a.explosionDataBlockId,maintainEmitterId:a.maintainEmitterId,weaponImageState:a.weaponImageState,weaponImageStates:a.weaponImageStates,headPitch:a.headPitch,headYaw:a.headYaw,label:a.label,audioFileName:a.audioFileName,audioVolume:a.audioVolume,audioIs3D:a.audioIs3D,audioIsLooping:a.audioIsLooping,audioMinDistance:a.audioMinDistance,audioMaxDistance:a.audioMaxDistance,audioMinLoopGap:a.audioMinLoopGap,audioMaxLoopGap:a.audioMaxLoopGap,sceneData:a.sceneData})}return t}buildHudState(){let e={slots:Array.from(this.weaponsHud.slots.entries()).map(([e,t])=>({index:e,ammo:t})),activeIndex:this.weaponsHud.activeIndex},t={slots:Array.from(this.inventoryHud.slots.entries()).map(([e,t])=>({slot:e,count:t})),activeSlot:this.inventoryHud.activeSlot},a=this.backpackHud.packIndex>=0?{...this.backpackHud}:null,r=this.teamScores.map(e=>({...e})),n=new Map;for(let{teamId:e}of this.playerRoster.values())e>0&&n.set(e,(n.get(e)??0)+1);for(let e of r)e.playerCount=n.get(e.teamId)??0;return{weaponsHud:e,inventoryHud:t,backpackHud:a,teamScores:r}}buildTimeFilteredEvents(e){return{chatMessages:this.chatMessages.filter(t=>t.timeSec>e-15),audioEvents:this.audioEvents.filter(t=>t.timeSec>e-.5&&t.timeSec<=e)}}}e.s(["StreamEngine",()=>r4],10244)},71051,e=>{"use strict";class t{ws=null;handlers;url;_connected=!1;wsPingInterval=null;smoothedWsPing=0;constructor(e,t){this.url=e,this.handlers=t}get connected(){return this._connected}connect(){this.ws=new WebSocket(this.url),this.ws.binaryType="arraybuffer",this.ws.onopen=()=>{console.log("[relay] WebSocket connected to",this.url),this._connected=!0,this.startWsPing(),this.handlers.onOpen?.()},this.ws.onmessage=e=>{if(e.data instanceof ArrayBuffer)this.handlers.onGamePacket?.(new Uint8Array(e.data));else try{let t=JSON.parse(e.data);this.handleMessage(t)}catch(e){console.error("Failed to parse relay message:",e)}},this.ws.onclose=()=>{console.log("[relay] WebSocket disconnected"),this._connected=!1,this.stopWsPing(),this.handlers.onClose?.()},this.ws.onerror=()=>{console.error("[relay] WebSocket error"),this.handlers.onError?.("WebSocket connection error")}}handleMessage(e){switch(e.type){case"serverList":this.handlers.onServerList?.(e.servers);break;case"status":this.handlers.onStatus?.(e.status,e.message,e.connectSequence,e.mapName);break;case"ping":this.handlers.onPing?.(e.ms);break;case"wsPong":{let t=Date.now()-e.ts;this.smoothedWsPing=0===this.smoothedWsPing?t:.5*this.smoothedWsPing+.5*t,this.handlers.onWsPing?.(Math.round(this.smoothedWsPing));break}case"error":this.handlers.onError?.(e.message)}}listServers(){this.send({type:"listServers"})}sendWsPing(){this.send({type:"wsPing",ts:Date.now()})}joinServer(e){console.log("[relay] Joining server:",e),this.send({type:"joinServer",address:e})}disconnectServer(){this.send({type:"disconnect"})}sendAuthEvent(e,t){this.send({type:"sendCommand",command:e,args:t})}sendCommand(e,t){this.send({type:"sendCommand",command:e,args:t})}sendCRCResponse(e,t,a){this.send({type:"sendCRCResponse",crcValue:e,field1:t,field2:a})}sendCRCCompute(e,t,a,r){this.send({type:"sendCRCCompute",seed:e,field2:t,includeTextures:r,datablocks:a})}sendGhostAck(e,t){this.send({type:"sendGhostAck",sequence:e,ghostCount:t})}sendMove(e){this.send({type:"sendMove",move:e})}close(){this.stopWsPing(),this.ws&&(this.ws.close(),this.ws=null),this._connected=!1}startWsPing(){this.smoothedWsPing=0,this.send({type:"wsPing",ts:Date.now()}),this.wsPingInterval=setInterval(()=>{this.send({type:"wsPing",ts:Date.now()})},7e3)}stopWsPing(){null!=this.wsPingInterval&&(clearInterval(this.wsPingInterval),this.wsPingInterval=null)}send(e){this.ws?.readyState===WebSocket.OPEN?this.ws.send(JSON.stringify(e)):console.warn("[relay] send dropped (ws not open):",e.type)}}e.s(["RelayClient",()=>t])},12781,e=>{"use strict";e.i(47167);var t=e.i(43476),a=e.i(932),r=e.i(71645),n=e.i(71051);e.i(50593);var i=e.i(45853),o=e.i(89119),s=e.i(10244);class l extends s.StreamEngine{packetParser;relay;currentTimeSec=0;connectSynced=!1;_snapshot=null;_snapshotTick=-1;_ready=!1;dataBlockClassNames=new Map;onReady;constructor(e){super(),this.relay=e;const{registry:t,ghostTracker:a,packetParser:r}=(0,i.createLiveParser)();this.packetParser=r,this.ghostTracker=a,this.registry=t}getDataBlockData(e){return this.packetParser.getDataBlockDataMap()?.get(e)}_shapeConstructorCache=null;getShapeConstructorSequences(e){this._shapeConstructorCache=new Map;let t=this.packetParser.getDataBlockDataMap();if(t){for(let[,e]of t){let t=e.shape,a=e.sequences;t&&a&&this._shapeConstructorCache.set(t.toLowerCase(),a)}return this._shapeConstructorCache.get(e.toLowerCase())}}getTimeSec(){return this.currentTimeSec}getCameraYawPitch(e){return this.getAbsoluteRotation(e)??{yaw:0,pitch:0}}getEffectShapes(){let e=new Set,t=this.packetParser.getDataBlockDataMap();if(!t)return[];for(let[,a]of t){let r=a.explosion;if(null==r)continue;let n=t.get(r);n?.dtsFileName&&e.add(n.dtsFileName)}return[...e]}reset(){this.resetSharedState(),this.ghostTracker.clear?.(),this.currentTimeSec=0,this._snapshot=null,this._snapshotTick=-1,this.dataBlockClassNames.clear(),this.observerMode="fly"}getSnapshot(){return this._snapshot&&this._snapshotTick===this.tickCount?this._snapshot:this.buildSnapshot()}stepToTime(e,t){return this.currentTimeSec=e,this.getSnapshot()}syncConnectSequence(e){if(this.connectSynced||e.length<1)return;this.connectSynced=!0;let t=e[0]>>1&1;this.packetParser.setConnectionProtocolState({lastSeqRecvdAtSend:Array(32).fill(0),lastSeqRecvd:0,highestAckedSeq:0,lastSendSeq:0x1fffffff,ackMask:0,connectSequence:t,lastRecvAckAck:0,connectionEstablished:!0})}feedPacket(e){this.syncConnectSequence(e),this.processPacket(e)}handleRelayCommands(e){if("RemoteCommandEvent"!==e.type)return;let t=e.funcName;if(!t)return;let a=this.resolveNetString(t);if(["t2csri_pokeClient","t2csri_getChallengeChunk","t2csri_decryptChallenge"].includes(a)){let t=(e.args??[]).map(e=>this.resolveNetString(e)).filter(e=>""!==e);console.log(`[live] auth event: ${a}`,t),this.relay.sendAuthEvent(a,t);return}let r=(e.args??[]).map(e=>this.resolveNetString(e));if("MissionStartPhase1"===a){let e=r[0]??"";console.log(`[live] mission phase 1, seq=${e}`),this.relay.sendCommand("MissionStartPhase1Done",[e])}else if("MissionStartPhase2"===a){let e=r[0]??"";console.log(`[live] mission phase 2 (datablocks), seq=${e}`),this.relay.sendCommand("MissionStartPhase2Done",[e])}else if("MissionStartPhase3"===a){let e=r[0]??"";console.log(`[live] mission phase 3 (ghosting), seq=${e}`),this.relay.sendCommand("setClientFav",[""]),this.relay.sendCommand("MissionStartPhase3Done",[e])}}handleCRCChallenge(e){if("CRCChallengeEvent"!==e.type)return;let t=e.crcValue,a=e.field1,r=e.field2,n=(1&a)!=0;console.log(`[live] CRC challenge: seed=0x${(t>>>0).toString(16)} f1=0x${(a>>>0).toString(16)} f2=0x${(r>>>0).toString(16)} includeTextures=${n}`);let i=this.packetParser.getDataBlockDataMap(),s=[];if(i)for(let[e,t]of i){let a=this.dataBlockClassNames.get(e);if(!a)continue;let r=(0,o.resolveShapeName)(a,t);s.push({objectId:e,className:a,shapeName:r??""})}console.log(`[live] CRC: sending ${s.length} datablocks for computation`),this.relay.sendCRCCompute(t,r,s,n)}handleGhostingMessage(e){if("GhostingMessageEvent"!==e.type)return;let t=e.message,a=e.sequence,r=e.ghostCount;console.log(`[live] GhostingMessageEvent: message=${t} sequence=${a} ghostCount=${r}`),0===t&&(console.log(`[live] Sending ghost ack (type 1) for sequence ${a}`),this.relay.sendGhostAck(a,r))}observerMode="fly";cycleObserveNext(){"fly"===this.observerMode?(console.log("[live] observer: fly → follow (jump trigger)"),this.sendTrigger(2),this.observerMode="follow"):(console.log("[live] observer: cycle next (fire trigger)"),this.sendTrigger(0))}toggleObserverMode(){"fly"===this.observerMode?(console.log("[live] observer: fly → follow (jump trigger)"),this.sendTrigger(2),this.observerMode="follow"):(console.log("[live] observer: follow → fly (jump trigger)"),this.sendTrigger(2),this.observerMode="fly")}sendTrigger(e){let t=[!1,!1,!1,!1,!1,!1];t[e]=!0,this.relay.sendMove({x:0,y:0,z:0,yaw:0,pitch:0,roll:0,trigger:t,freeLook:!1})}getPlayerList(){let e=[];for(let[t,a]of this.targetNames){let r=this.targetTeams.get(t)??0;e.push({targetId:t,name:a,sensorGroup:r})}return e}processPacket(e){try{let t=this.packetParser.protocolRejected,a=this.packetParser.protocolNoDispatch,r=this.packetParser.parsePacket(e),n=this.packetParser.protocolRejected>t,i=this.packetParser.protocolNoDispatch>a;(n||i)&&console.warn(`[live] packet #${this.tickCount} ${n?"REJECTED":"no-dispatch"}: ${e.length} bytes (total rejected=${this.packetParser.protocolRejected}, noDispatch=${this.packetParser.protocolNoDispatch})`);let s=this.tickCount<20,l=this.tickCount%100==0,d=s||l;for(let t of(d&&console.log(`[live] packet #${this.tickCount}: ${r.events.length} events, ${r.ghosts.length} ghosts, ${e.length} bytes`+(void 0!==r.gameState.controlObjectGhostIndex?`, control=${r.gameState.controlObjectGhostIndex}`:"")+(void 0!==r.gameState.cameraFov?`, fov=${r.gameState.cameraFov}`:"")),this.processControlObject(r.gameState),r.events))if(t.parsedData){this.handleRelayCommands(t.parsedData),this.handleCRCChallenge(t.parsedData),this.handleGhostingMessage(t.parsedData);let e=t.parsedData.type;if(s&&"NetStringEvent"!==e&&console.log(`[live] event: ${e}`,"RemoteCommandEvent"===e?{funcName:this.resolveNetString(t.parsedData.funcName??"")}:"SimDataBlockEvent"===e?{id:t.parsedData.objectId,className:t.parsedData.dataBlockClassName}:void 0),"SimDataBlockEvent"===e){let e=t.parsedData.objectId,a=t.parsedData.dataBlockClassName;if(null!=e&&a&&this.dataBlockClassNames.set(e,a),d){let r=t.parsedData.dataBlockData,n=(0,o.resolveShapeName)(a??"",r);console.log(`[live] datablock: id=${e} class=${a??"?"}`+(n?` shape=${n}`:""))}}let a=this.registry.getEventParser(t.classId)?.name;if(this.processEvent(t,a),s&&"NetStringEvent"===e){let e=t.parsedData.id,a=t.parsedData.value;null!=e&&"string"==typeof a&&console.log(`[live] netString #${e} = "${a.length>60?a.slice(0,60)+"…":a}"`)}if("TargetInfoEvent"===e){let e=t.parsedData.targetId,a=t.parsedData.nameTag;if(null!=e&&null!=a){let r=this.netStrings.get(a);if(r){let a=(0,o.stripTaggedStringMarkup)(r);console.log(`[live] target #${e}: "${a}" team=${t.parsedData.sensorGroup??"?"}`)}}}if("SetSensorGroupEvent"===e){let e=t.parsedData.sensorGroup;null!=e&&console.log(`[live] sensor group changed: → ${e}`)}if("SensorGroupColorEvent"===e){let e=t.parsedData.sensorGroup,a=t.parsedData.colors;a&&console.log(`[live] sensor group colors: group=${e}, ${a.length} entries`)}}for(let e of r.ghosts){if("create"===e.type){let t=e.parsedData?.position,a=t&&"number"==typeof t.x&&"number"==typeof t.y&&"number"==typeof t.z,r=this.resolveGhostClassName(e.index,e.classId);console.log(`[live] ghost create: #${e.index} ${r??"?"}`+(a?` at (${t.x.toFixed(1)}, ${t.y.toFixed(1)}, ${t.z.toFixed(1)})`:"")+` (${this.entities.size+1} entities total)`),this._ready||(this._ready=!0,this.onReady?.())}else if("delete"===e.type){let t=this.entityIdByGhostIndex.get(e.index),a=t?this.entities.get(t):void 0;(this.tickCount<50||this.tickCount%200==0)&&console.log(`[live] ghost delete: #${e.index} ${a?.className??"?"} (${this.entities.size-1} entities remaining)`)}this.processGhostUpdate(e)}if(this.tickCount++,this.advanceProjectiles(),this.advanceItems(),l&&this.tickCount>1){let e=this.packetParser.getDataBlockDataMap();console.log(`[live] status @ tick ${this.tickCount}: ${this.entities.size} entities, ${e?.size??0} datablocks, rejected=${this.packetParser.protocolRejected}, noDispatch=${this.packetParser.protocolNoDispatch}`)}let c=this.entities.size;if(1===this.tickCount||c>0&&c%25==0&&this.tickCount<100){let e=new Map;for(let t of this.entities.values())e.set(t.type,(e.get(t.type)??0)+1);let t=[...e.entries()].map(([e,t])=>`${e}=${t}`).join(" ");console.log(`[live] entity count: ${c} (${t})`)}if(this.updateCameraAndHud(),this.tickCount<=5&&this.camera){let[e,t,a]=this.camera.position;console.log(`[live] camera: mode=${this.camera.mode} pos=(${e.toFixed(1)}, ${t.toFixed(1)}, ${a.toFixed(1)}) fov=${this.camera.fov}`)}}catch(t){console.error("Failed to process live packet:",t,{tickCount:this.tickCount,entityCount:this.entities.size,dataLength:e.length,controlGhost:this.latestControl.ghostIndex,connectSynced:this.connectSynced})}}buildSnapshot(){let e=this.buildEntityList(),t=this.currentTimeSec,{chatMessages:a,audioEvents:r}=this.buildTimeFilteredEvents(t),{weaponsHud:n,inventoryHud:i,backpackHud:o,teamScores:s}=this.buildHudState();this.camera||(this.camera={time:t,position:[0,0,200],rotation:[0,0,0,1],fov:90,mode:"observer"});let l={timeSec:t,exhausted:!1,camera:this.camera,entities:e,controlPlayerGhostId:this.controlPlayerGhostId,playerSensorGroup:this.playerSensorGroup,status:this.lastStatus,chatMessages:a,audioEvents:r,weaponsHud:n,backpackHud:o,inventoryHud:i,teamScores:s};return this._snapshot=l,this._snapshotTick=this.tickCount,l}}let d=(0,r.createContext)(null);function c(){let e=(0,r.useContext)(d);if(!e)throw Error("useLiveConnection must be used within LiveConnectionProvider");return e}function u(){return(0,r.useContext)(d)}function h(e){let i,o,s,c,u,h,g,p,m,f,F,v,y,S=(0,a.c)(27),{children:k}=e,b=(0,r.useRef)(null),P=(0,r.useRef)(null);S[0]===Symbol.for("react.memo_cache_sentinel")?(i=[],S[0]=i):i=S[0];let x=(0,r.useRef)(i),I=(0,r.useRef)(!1),[D,C]=(0,r.useState)(!1),[E,w]=(0,r.useState)(null),[M,B]=(0,r.useState)(),[T,R]=(0,r.useState)();S[1]===Symbol.for("react.memo_cache_sentinel")?(o=[],S[1]=o):o=S[1];let[N,G]=(0,r.useState)(o),[A,U]=(0,r.useState)(!1),[j,O]=(0,r.useState)(null),[z,L]=(0,r.useState)(!1),[V,_]=(0,r.useState)(null),[q,$]=(0,r.useState)(null);S[2]===Symbol.for("react.memo_cache_sentinel")?(s=e=>{b.current&&(b.current.close(),b.current=null);let t=new n.RelayClient(void 0===e?"wss://t2-relay.fly.dev":e,{onOpen(){for(let e of(C(!0),x.current))e();x.current=[]},onStatus(e,t,a,r){console.log(`[relay] game status: ${e}${t?` — ${t}`:""}${r?` map=${r}`:""}`),w(e),B(t),r&&R(r)},onServerList(e){G(e),U(!1),I.current=!1},onGamePacket(e){P.current||console.warn("[relay] received game packet but no adapter is active"),P.current?.feedPacket(e)},onPing(e){_(e)},onWsPing(e){$(e)},onError(e){console.error("Relay error:",e),U(!1),I.current=!1},onClose(){b.current===t&&(b.current=null,C(!1),w(null),R(void 0),_(null),$(null),O(null),L(!1),P.current=null,x.current=[],I.current=!1)}});t.connect(),b.current=t},S[2]=s):s=S[2];let H=s;S[3]===Symbol.for("react.memo_cache_sentinel")?(c=()=>{b.current?.close(),b.current=null,P.current=null,x.current=[],C(!1),w(null),R(void 0),O(null),L(!1)},S[3]=c):c=S[3];let W=c;S[4]===Symbol.for("react.memo_cache_sentinel")?(u=()=>{if(I.current)return;I.current=!0;let e=()=>{b.current?.sendWsPing(),b.current?.listServers()};U(!0),b.current?.connected?e():(x.current.push(e),b.current||H())},S[4]=u):u=S[4];let X=u;S[5]!==N?(h=e=>{if(!b.current)return;let t=N.find(t=>t.address===e);t?.mapName&&R(t.mapName);let a=new l(b.current);a.onReady=()=>L(!0),P.current=a,L(!1),w(null),O(a),b.current.joinServer(e)},S[5]=N,S[6]=h):h=S[6];let Z=h;S[7]===Symbol.for("react.memo_cache_sentinel")?(g=()=>{b.current?.disconnectServer(),P.current?.reset(),P.current=null,O(null),L(!1),w(null),R(void 0),_(null)},S[7]=g):g=S[7];let Y=g;S[8]===Symbol.for("react.memo_cache_sentinel")?(p=e=>{b.current?.sendMove(e)},S[8]=p):p=S[8];let J=p;S[9]===Symbol.for("react.memo_cache_sentinel")?(m=(e,...t)=>{b.current?.sendCommand(e,t)},S[9]=m):m=S[9];let K=m;S[10]===Symbol.for("react.memo_cache_sentinel")?(f=()=>()=>{b.current?.close()},F=[],S[10]=f,S[11]=F):(f=S[10],F=S[11]),(0,r.useEffect)(f,F);let Q=null!=V&&null!=q?V+q:V??null;S[12]!==j||S[13]!==E||S[14]!==M||S[15]!==Z||S[16]!==z||S[17]!==T||S[18]!==Q||S[19]!==D||S[20]!==N||S[21]!==A||S[22]!==q?(v={relayConnected:D,gameStatus:E,gameStatusMessage:M,mapName:T,ping:Q,wsPing:q,servers:N,serversLoading:A,adapter:j,liveReady:z,connectRelay:H,disconnectRelay:W,listServers:X,joinServer:Z,disconnectServer:Y,sendMove:J,sendCommand:K},S[12]=j,S[13]=E,S[14]=M,S[15]=Z,S[16]=z,S[17]=T,S[18]=Q,S[19]=D,S[20]=N,S[21]=A,S[22]=q,S[23]=v):v=S[23];let ee=v;return S[24]!==k||S[25]!==ee?(y=(0,t.jsx)(d.Provider,{value:ee,children:k}),S[24]=k,S[25]=ee,S[26]=y):y=S[26],y}e.s(["LiveConnectionProvider",()=>h,"useLiveConnection",()=>c,"useLiveConnectionOptional",()=>u],12781)}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/534ef931e88eb989.js b/docs/_next/static/chunks/534ef931e88eb989.js new file mode 100644 index 00000000..8297a3c6 --- /dev/null +++ b/docs/_next/static/chunks/534ef931e88eb989.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,13070,e=>{e.v({Arrow:"KeyboardOverlay-module__HsRBsa__Arrow",Column:"KeyboardOverlay-module__HsRBsa__Column",Key:"KeyboardOverlay-module__HsRBsa__Key",Root:"KeyboardOverlay-module__HsRBsa__Root",Row:"KeyboardOverlay-module__HsRBsa__Row",Spacer:"KeyboardOverlay-module__HsRBsa__Spacer"})},78295,e=>{e.v({Joystick:"TouchControls-module__AkxfgW__Joystick",Left:"TouchControls-module__AkxfgW__Left TouchControls-module__AkxfgW__Joystick",Right:"TouchControls-module__AkxfgW__Right TouchControls-module__AkxfgW__Joystick"})},65883,e=>{e.v({ButtonLabel:"InspectorControls-module__gNRB6W__ButtonLabel",CheckboxField:"InspectorControls-module__gNRB6W__CheckboxField",Controls:"InspectorControls-module__gNRB6W__Controls",Dropdown:"InspectorControls-module__gNRB6W__Dropdown",Field:"InspectorControls-module__gNRB6W__Field",Group:"InspectorControls-module__gNRB6W__Group",IconButton:"InspectorControls-module__gNRB6W__IconButton",LabelledButton:"InspectorControls-module__gNRB6W__LabelledButton",MapInfoButton:"InspectorControls-module__gNRB6W__MapInfoButton InspectorControls-module__gNRB6W__IconButton InspectorControls-module__gNRB6W__LabelledButton",MissionSelectWrapper:"InspectorControls-module__gNRB6W__MissionSelectWrapper",Toggle:"InspectorControls-module__gNRB6W__Toggle InspectorControls-module__gNRB6W__IconButton"})},36679,e=>{e.v({ButtonLabel:"CopyCoordinatesButton-module__BxovtG__ButtonLabel "+e.i(65883).ButtonLabel,ClipboardCheck:"CopyCoordinatesButton-module__BxovtG__ClipboardCheck",MapPin:"CopyCoordinatesButton-module__BxovtG__MapPin",Root:"CopyCoordinatesButton-module__BxovtG__Root "+e.i(65883).IconButton+" "+e.i(65883).LabelledButton,showClipboardCheck:"CopyCoordinatesButton-module__BxovtG__showClipboardCheck"})},28903,e=>{e.v({ButtonLabel:"LoadDemoButton-module__kGZaoW__ButtonLabel "+e.i(65883).ButtonLabel,DemoIcon:"LoadDemoButton-module__kGZaoW__DemoIcon",Root:"LoadDemoButton-module__kGZaoW__Root "+e.i(65883).IconButton+" "+e.i(65883).LabelledButton})},9607,e=>{e.v({LiveIcon:"JoinServerButton-module__DIR70a__LiveIcon",PingLabel:"JoinServerButton-module__DIR70a__PingLabel "+e.i(65883).ButtonLabel,Pulsing:"JoinServerButton-module__DIR70a__Pulsing",Root:"JoinServerButton-module__DIR70a__Root "+e.i(65883).IconButton+" "+e.i(65883).LabelledButton,TextLabel:"JoinServerButton-module__DIR70a__TextLabel "+e.i(65883).ButtonLabel,blink:"JoinServerButton-module__DIR70a__blink"})},75840,e=>{e.v({BarFillEnergy:"PlayerHUD-module__-E1Scq__BarFillEnergy",BarFillHealth:"PlayerHUD-module__-E1Scq__BarFillHealth",BarTrack:"PlayerHUD-module__-E1Scq__BarTrack",Bars:"PlayerHUD-module__-E1Scq__Bars",ChatColor0:"PlayerHUD-module__-E1Scq__ChatColor0",ChatColor1:"PlayerHUD-module__-E1Scq__ChatColor1",ChatColor2:"PlayerHUD-module__-E1Scq__ChatColor2",ChatColor3:"PlayerHUD-module__-E1Scq__ChatColor3",ChatColor4:"PlayerHUD-module__-E1Scq__ChatColor4",ChatColor5:"PlayerHUD-module__-E1Scq__ChatColor5",ChatColor6:"PlayerHUD-module__-E1Scq__ChatColor6",ChatColor7:"PlayerHUD-module__-E1Scq__ChatColor7",ChatColor8:"PlayerHUD-module__-E1Scq__ChatColor8",ChatColor9:"PlayerHUD-module__-E1Scq__ChatColor9",ChatContainer:"PlayerHUD-module__-E1Scq__ChatContainer",ChatInput:"PlayerHUD-module__-E1Scq__ChatInput",ChatInputForm:"PlayerHUD-module__-E1Scq__ChatInputForm",ChatMessage:"PlayerHUD-module__-E1Scq__ChatMessage",ChatWindow:"PlayerHUD-module__-E1Scq__ChatWindow",Compass:"PlayerHUD-module__-E1Scq__Compass",CompassNSEW:"PlayerHUD-module__-E1Scq__CompassNSEW",CompassRing:"PlayerHUD-module__-E1Scq__CompassRing",PackInvCount:"PlayerHUD-module__-E1Scq__PackInvCount",PackInvIcon:"PlayerHUD-module__-E1Scq__PackInvIcon",PackInvInfinity:"PlayerHUD-module__-E1Scq__PackInvInfinity",PackInvItem:"PlayerHUD-module__-E1Scq__PackInvItem",PackInvItemActive:"PlayerHUD-module__-E1Scq__PackInvItemActive",PackInvItemDim:"PlayerHUD-module__-E1Scq__PackInvItemDim",PackInventoryHUD:"PlayerHUD-module__-E1Scq__PackInventoryHUD",PlayerHUD:"PlayerHUD-module__-E1Scq__PlayerHUD",Reticle:"PlayerHUD-module__-E1Scq__Reticle",ReticleDot:"PlayerHUD-module__-E1Scq__ReticleDot",ReticleImage:"PlayerHUD-module__-E1Scq__ReticleImage",TeamCount:"PlayerHUD-module__-E1Scq__TeamCount",TeamNameEnemy:"PlayerHUD-module__-E1Scq__TeamNameEnemy",TeamNameFriendly:"PlayerHUD-module__-E1Scq__TeamNameFriendly",TeamRow:"PlayerHUD-module__-E1Scq__TeamRow",TeamScore:"PlayerHUD-module__-E1Scq__TeamScore",TeamScores:"PlayerHUD-module__-E1Scq__TeamScores",TopRight:"PlayerHUD-module__-E1Scq__TopRight",WeaponHUD:"PlayerHUD-module__-E1Scq__WeaponHUD",WeaponSeparator:"PlayerHUD-module__-E1Scq__WeaponSeparator"})},56614,e=>{e.v({CloseButton:"ServerBrowser-module__kqm3eq__CloseButton "+e.i(6090).Secondary,Dialog:"ServerBrowser-module__kqm3eq__Dialog",Empty:"ServerBrowser-module__kqm3eq__Empty",Footer:"ServerBrowser-module__kqm3eq__Footer",Header:"ServerBrowser-module__kqm3eq__Header",Hint:"ServerBrowser-module__kqm3eq__Hint",JoinButton:"ServerBrowser-module__kqm3eq__JoinButton "+e.i(6090).DialogButton,Overlay:"ServerBrowser-module__kqm3eq__Overlay",PasswordIcon:"ServerBrowser-module__kqm3eq__PasswordIcon",RefreshButton:"ServerBrowser-module__kqm3eq__RefreshButton "+e.i(6090).DialogButton,Selected:"ServerBrowser-module__kqm3eq__Selected",ServerCount:"ServerBrowser-module__kqm3eq__ServerCount",Table:"ServerBrowser-module__kqm3eq__Table",TableWrapper:"ServerBrowser-module__kqm3eq__TableWrapper",Title:"ServerBrowser-module__kqm3eq__Title",WarriorField:"ServerBrowser-module__kqm3eq__WarriorField",WarriorInput:"ServerBrowser-module__kqm3eq__WarriorInput",WarriorLabel:"ServerBrowser-module__kqm3eq__WarriorLabel"})},3011,e=>{e.v({CanvasContainer:"page-module__E0kJGG__CanvasContainer",LoadingIndicator:"page-module__E0kJGG__LoadingIndicator",Progress:"page-module__E0kJGG__Progress",ProgressBar:"page-module__E0kJGG__ProgressBar",ProgressText:"page-module__E0kJGG__ProgressText",Spinner:"page-module__E0kJGG__Spinner",loadingComplete:"page-module__E0kJGG__loadingComplete",spin:"page-module__E0kJGG__spin"})},31713,e=>{"use strict";var t=e.i(43476),a=e.i(932),r=e.i(71645),n=e.i(75056),o=e.i(90072),s=e.i(66027),l=e.i(54970),i=e.i(12979),c=e.i(32424);let u=(0,r.createContext)(null);function d(e){let r,n=(0,a.c)(3),{runtime:o,children:s}=e;return n[0]!==s||n[1]!==o?(r=(0,t.jsx)(u.Provider,{value:o,children:s}),n[0]=s,n[1]=o,n[2]=r):r=n[2],r}var m=e.i(86608),h=e.i(38433),p=e.i(33870),f=e.i(91996);let _=(0,r.createContext)(null).Provider;e.i(13876);var g=e.i(58647),y=e.i(92224),v=e.i(7368),x=e.i(62395),b=e.i(9672);function k(e,t){if(t)return e.state.datablocks.get(t)}let S=(0,c.createScriptLoader)(),C=(0,p.createScriptCache)(),j={findFiles:e=>{let t=(0,l.default)(e,{nocase:!0});return(0,f.getResourceList)().filter(e=>t(e)).map(e=>{let[,t]=(0,f.getSourceAndPath)(e);return t})},isFile:e=>null!=(0,f.getResourceMap)()[(0,f.getResourceKey)(e)]};function w(e){"batch.flushed"===e.type&&g.engineStore.getState().applyRuntimeBatch(e.events,{tick:e.tick})}function N(e){e instanceof Error&&"AbortError"===e.name||console.error("Mission runtime failed to become ready:",e)}let I=(0,r.memo)(function(e){let n,o,l,c,u,p,f,I=(0,a.c)(13),{name:T,missionType:P,onLoadingChange:B}=e,{data:D}=((f=(0,a.c)(2))[0]!==T?(p={queryKey:["parsedMission",T],queryFn:()=>(0,i.loadMission)(T)},f[0]=T,f[1]=p):p=f[1],(0,s.useQuery)(p)),{ready:E,runtime:L,progress:R}=function(e,t,n){let o,s,l,i=(0,a.c)(6);i[0]===Symbol.for("react.memo_cache_sentinel")?(o={ready:!1,runtime:void 0,progress:0},i[0]=o):o=i[0];let[c,u]=(0,r.useState)(o);return i[1]!==e||i[2]!==t||i[3]!==n?(s=()=>{if(!n)return;let a=new AbortController,r=!1,o=null,s=(0,h.createProgressTracker)(),l=()=>{u(e=>({...e,progress:s.progress}))};s.on("update",l);let{runtime:i,ready:c}=(0,m.runServer)({missionName:e,missionType:t,runtimeOptions:{loadScript:S,fileSystem:j,cache:C,signal:a.signal,progress:s,ignoreScripts:v.ignoreScripts}});return c.then(()=>{if(r||a.signal.aborted)return;g.engineStore.getState().setRuntime(i);let e=i.getObjectByName("MissionGroup");if(e){let t=function e(t,a,r){let n=[],o=r;if("SimGroup"===t._className){if(t._name?.toLowerCase()==="teams")o=void 0;else if(void 0===o&&t._name){let e=t._name.match(/^team(\d+)$/i);e&&(o=parseInt(e[1],10))}}let s=function(e,t,a){let r=e._className,n=`mission_${e._id}`,o=(0,x.getPosition)(e),s=(0,x.getScale)(e),l=function(e){let[t,a,r,n]=e.split(" ").map(parseFloat),o=-(n||0)*Math.PI/360,s=Math.sin(o),l=Math.cos(o),i=Math.sqrt((a||0)*(a||0)+(r||0)*(r||0)+(t||0)*(t||0));return i<1e-8?[0,0,0,1]:[(a||0)/i*s,(r||0)/i*s,(t||0)/i*s,l]}(e.rotation??"1 0 0 0"),i=(0,x.getProperty)(e,"dataBlock")??"",c=k(t,i),u=(0,x.getProperty)(e,"missionTypesList"),d={id:n,className:r,runtimeObject:e,missionTypesList:u},m={...d,position:o,rotation:l,scale:s};switch(r){case"TerrainBlock":return{...d,renderType:"TerrainBlock",terrainData:(0,b.terrainFromMis)(e)};case"InteriorInstance":return{...d,renderType:"InteriorInstance",interiorData:(0,b.interiorFromMis)(e)};case"Sky":return{...d,renderType:"Sky",skyData:(0,b.skyFromMis)(e)};case"Sun":return{...d,renderType:"Sun",sunData:(0,b.sunFromMis)(e)};case"WaterBlock":return{...d,renderType:"WaterBlock",waterData:(0,b.waterBlockFromMis)(e)};case"MissionArea":return{...d,renderType:"MissionArea",missionAreaData:(0,b.missionAreaFromMis)(e)};case"StaticShape":case"Item":case"Turret":case"TSStatic":var h=m,p=e,f=c,_=t,g=r,y=a,v=i;let S="TSStatic"===g?(0,x.getProperty)(p,"shapeName"):(0,x.getProperty)(f,"shapeFile"),C={...h,renderType:"Shape",shapeName:S,shapeType:"Turret"===g?"Turret":"Item"===g?"Item":"TSStatic"===g?"TSStatic":"StaticShape",dataBlock:v||void 0,teamId:y};if("Item"===g&&(C.rotate=function(e){if("string"==typeof e){let t=e.toLowerCase();return"0"!==t&&"false"!==t&&""!==t}return!!e}((0,x.getProperty)(p,"rotate")??(0,x.getProperty)(f,"rotate"))),"Turret"===g){let e=(0,x.getProperty)(p,"initialBarrel");if(e){let t=k(_,e);C.barrelShapeName=(0,x.getProperty)(t,"shapeFile")}}return C;case"ForceFieldBare":return function(e,t,a,r){let n,o=(0,x.getProperty)(a,"color"),s=o?[(n=o.split(" ").map(e=>parseFloat(e)))[0]??0,n[1]??0,n[2]??0]:[1,1,1],l=parseFloat((0,x.getProperty)(a,"baseTranslucency"))||1,i=parseInt((0,x.getProperty)(a,"numFrames"),10)||1,c=parseFloat((0,x.getProperty)(a,"framesPerSec"))||1,u=parseFloat((0,x.getProperty)(a,"scrollSpeed"))||0,d=parseFloat((0,x.getProperty)(a,"umapping"))||1,m=parseFloat((0,x.getProperty)(a,"vmapping"))||1,h=[];for(let e=0;e{r=!0,s.off("update",l),a.abort(),o?.(),g.engineStore.getState().clearRuntime(),y.gameEntityStore.getState().clearEntities(),i.destroy()}},l=[e,t,n],i[1]=e,i[2]=t,i[3]=n,i[4]=s,i[5]=l):(s=i[4],l=i[5]),(0,r.useEffect)(s,l),c}(T,P,D),M=!D||!E||!L;I[0]!==P||I[1]!==D?(n={metadata:D,missionType:P},I[0]=P,I[1]=D,I[2]=n):n=I[2];let H=n;return(I[3]!==M||I[4]!==B||I[5]!==R?(o=()=>{B?.(M,R)},l=[M,R,B],I[3]=M,I[4]=B,I[5]=R,I[6]=o,I[7]=l):(o=I[6],l=I[7]),(0,r.useEffect)(o,l),M)?null:(I[8]!==L?(c=(0,t.jsx)(d,{runtime:L}),I[8]=L,I[9]=c):c=I[9],I[10]!==H||I[11]!==c?(u=(0,t.jsx)(_,{value:H,children:c}),I[10]=H,I[11]=c,I[12]=u):u=I[12],u)});var T=e.i(17751),P=e.i(12598),B=e.i(5729),D=e.i(12631),E=e.i(32865),L=e.i(13070);function R(){let e,r,n,o,s,l,i,c,u,d,m,h,p,f,_,g,y,v,x,b,k,S,C,j,w=(0,a.c)(51),N=(0,E.useRecording)(),I=(0,D.useKeyboardControls)(K),T=(0,D.useKeyboardControls)(W),P=(0,D.useKeyboardControls)(U),B=(0,D.useKeyboardControls)(A),R=(0,D.useKeyboardControls)(O),z=(0,D.useKeyboardControls)(q),$=(0,D.useKeyboardControls)(G),J=(0,D.useKeyboardControls)(F),V=(0,D.useKeyboardControls)(H),Y=(0,D.useKeyboardControls)(M);return N&&"live"!==N.source?null:(w[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("div",{className:L.default.Spacer}),w[0]=e):e=w[0],w[1]!==I?(r=(0,t.jsx)("div",{className:L.default.Key,"data-pressed":I,children:"W"}),w[1]=I,w[2]=r):r=w[2],w[3]===Symbol.for("react.memo_cache_sentinel")?(n=(0,t.jsx)("div",{className:L.default.Spacer}),w[3]=n):n=w[3],w[4]!==r?(o=(0,t.jsxs)("div",{className:L.default.Row,children:[e,r,n]}),w[4]=r,w[5]=o):o=w[5],w[6]!==P?(s=(0,t.jsx)("div",{className:L.default.Key,"data-pressed":P,children:"A"}),w[6]=P,w[7]=s):s=w[7],w[8]!==T?(l=(0,t.jsx)("div",{className:L.default.Key,"data-pressed":T,children:"S"}),w[8]=T,w[9]=l):l=w[9],w[10]!==B?(i=(0,t.jsx)("div",{className:L.default.Key,"data-pressed":B,children:"D"}),w[10]=B,w[11]=i):i=w[11],w[12]!==s||w[13]!==l||w[14]!==i?(c=(0,t.jsxs)("div",{className:L.default.Row,children:[s,l,i]}),w[12]=s,w[13]=l,w[14]=i,w[15]=c):c=w[15],w[16]!==o||w[17]!==c?(u=(0,t.jsxs)("div",{className:L.default.Column,children:[o,c]}),w[16]=o,w[17]=c,w[18]=u):u=w[18],w[19]===Symbol.for("react.memo_cache_sentinel")?(d=(0,t.jsx)("span",{className:L.default.Arrow,children:"↑"}),w[19]=d):d=w[19],w[20]!==R?(m=(0,t.jsx)("div",{className:L.default.Row,children:(0,t.jsxs)("div",{className:L.default.Key,"data-pressed":R,children:[d," Space"]})}),w[20]=R,w[21]=m):m=w[21],w[22]===Symbol.for("react.memo_cache_sentinel")?(h=(0,t.jsx)("span",{className:L.default.Arrow,children:"↓"}),w[22]=h):h=w[22],w[23]!==z?(p=(0,t.jsx)("div",{className:L.default.Row,children:(0,t.jsxs)("div",{className:L.default.Key,"data-pressed":z,children:[h," Shift"]})}),w[23]=z,w[24]=p):p=w[24],w[25]!==m||w[26]!==p?(f=(0,t.jsxs)("div",{className:L.default.Column,children:[m,p]}),w[25]=m,w[26]=p,w[27]=f):f=w[27],w[28]===Symbol.for("react.memo_cache_sentinel")?(_=(0,t.jsx)("div",{className:L.default.Spacer}),w[28]=_):_=w[28],w[29]!==$?(g=(0,t.jsx)("div",{className:L.default.Key,"data-pressed":$,children:"↑"}),w[29]=$,w[30]=g):g=w[30],w[31]===Symbol.for("react.memo_cache_sentinel")?(y=(0,t.jsx)("div",{className:L.default.Spacer}),w[31]=y):y=w[31],w[32]!==g?(v=(0,t.jsxs)("div",{className:L.default.Row,children:[_,g,y]}),w[32]=g,w[33]=v):v=w[33],w[34]!==V?(x=(0,t.jsx)("div",{className:L.default.Key,"data-pressed":V,children:"←"}),w[34]=V,w[35]=x):x=w[35],w[36]!==J?(b=(0,t.jsx)("div",{className:L.default.Key,"data-pressed":J,children:"↓"}),w[36]=J,w[37]=b):b=w[37],w[38]!==Y?(k=(0,t.jsx)("div",{className:L.default.Key,"data-pressed":Y,children:"→"}),w[38]=Y,w[39]=k):k=w[39],w[40]!==x||w[41]!==b||w[42]!==k?(S=(0,t.jsxs)("div",{className:L.default.Row,children:[x,b,k]}),w[40]=x,w[41]=b,w[42]=k,w[43]=S):S=w[43],w[44]!==v||w[45]!==S?(C=(0,t.jsxs)("div",{className:L.default.Column,children:[v,S]}),w[44]=v,w[45]=S,w[46]=C):C=w[46],w[47]!==f||w[48]!==C||w[49]!==u?(j=(0,t.jsxs)("div",{className:L.default.Root,children:[u,f,C]}),w[47]=f,w[48]=C,w[49]=u,w[50]=j):j=w[50],j)}function M(e){return e.lookRight}function H(e){return e.lookLeft}function F(e){return e.lookDown}function G(e){return e.lookUp}function q(e){return e.down}function O(e){return e.up}function A(e){return e.right}function U(e){return e.left}function W(e){return e.backward}function K(e){return e.forward}var z=e.i(71753),$=e.i(15080),J=e.i(79123),V=e.i(78295);function Y(e){let t=e.querySelector(".back");t&&(t.style.background="rgba(3, 79, 76, 0.6)",t.style.border="1px solid rgba(0, 219, 223, 0.5)",t.style.boxShadow="inset 0 0 10px rgba(0, 0, 0, 0.7)");let a=e.querySelector(".front");a&&(a.style.background="radial-gradient(circle at 50% 50%, rgba(23, 247, 198, 0.9) 0%, rgba(9, 184, 170, 0.95) 100%)",a.style.border="2px solid rgba(255, 255, 255, 0.4)",a.style.boxShadow="0 2px 4px rgba(0, 0, 0, 0.5), 0 1px 1px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15), inset 0 -1px 2px rgba(0, 0, 0, 0.3)")}let X=Math.PI/2-.01;function Q({joystickState:a,joystickZone:n,lookJoystickState:o,lookJoystickZone:s}){let{touchMode:l}=(0,J.useControls)();(0,r.useEffect)(()=>{let t=n.current;if(!t)return;let r=null,o=!1;return e.A(84968).then(e=>{o||(r=e.default.create({zone:t,mode:"static",position:{left:"70px",bottom:"70px"},size:120,restOpacity:.9}),Y(t),r.on("move",(e,t)=>{a.current.angle=t.angle.radian,a.current.force=Math.min(1,t.force)}),r.on("end",()=>{a.current.force=0}))}),()=>{o=!0,r?.destroy()}},[a,n,l]),(0,r.useEffect)(()=>{if("dualStick"!==l)return;let t=s.current;if(!t)return;let a=null,r=!1;return e.A(84968).then(e=>{r||(a=e.default.create({zone:t,mode:"static",position:{right:"70px",bottom:"70px"},size:120,restOpacity:.9}),Y(t),a.on("move",(e,t)=>{o.current.angle=t.angle.radian,o.current.force=Math.min(1,t.force)}),a.on("end",()=>{o.current.force=0}))}),()=>{r=!0,a?.destroy()}},[l,o,s]);let i=()=>{document.activeElement instanceof HTMLElement&&document.activeElement.blur()};return"dualStick"===l?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{ref:n,className:V.default.Left,onContextMenu:e=>e.preventDefault(),onTouchStart:i}),(0,t.jsx)("div",{ref:s,className:V.default.Right,onContextMenu:e=>e.preventDefault(),onTouchStart:i})]}):(0,t.jsx)("div",{ref:n,className:V.default.Joystick,onContextMenu:e=>e.preventDefault(),onTouchStart:i})}function Z(e){let t,n,s,l,i,c,u,d,m,h,p=(0,a.c)(25),{joystickState:f,joystickZone:_,lookJoystickState:g}=e,{speedMultiplier:y,touchMode:v}=(0,J.useControls)(),{camera:x,gl:b}=(0,$.useThree)();p[0]===Symbol.for("react.memo_cache_sentinel")?(t=new o.Euler(0,0,0,"YXZ"),p[0]=t):t=p[0];let k=(0,r.useRef)(t),S=(0,r.useRef)(null);p[1]===Symbol.for("react.memo_cache_sentinel")?(n={x:0,y:0},p[1]=n):n=p[1];let C=(0,r.useRef)(n);p[2]===Symbol.for("react.memo_cache_sentinel")?(s=new o.Vector3,p[2]=s):s=p[2];let j=(0,r.useRef)(s);p[3]===Symbol.for("react.memo_cache_sentinel")?(l=new o.Vector3,p[3]=l):l=p[3];let w=(0,r.useRef)(l);p[4]===Symbol.for("react.memo_cache_sentinel")?(i=new o.Vector3,p[4]=i):i=p[4];let N=(0,r.useRef)(i);return p[5]!==x.quaternion?(c=()=>{k.current.setFromQuaternion(x.quaternion,"YXZ")},p[5]=x.quaternion,p[6]=c):c=p[6],p[7]!==x?(u=[x],p[7]=x,p[8]=u):u=p[8],(0,r.useEffect)(c,u),p[9]!==x.quaternion||p[10]!==b.domElement||p[11]!==_||p[12]!==v?(d=()=>{if("moveLookStick"!==v)return;let e=b.domElement,t=e=>{let t=_.current;if(!t)return!1;let a=t.getBoundingClientRect();return e.clientX>=a.left&&e.clientX<=a.right&&e.clientY>=a.top&&e.clientY<=a.bottom},a=e=>{if(null===S.current)for(let a=0;a{if(null!==S.current)for(let t=0;t{for(let t=0;t{e.removeEventListener("touchstart",a),e.removeEventListener("touchmove",r),e.removeEventListener("touchend",n),e.removeEventListener("touchcancel",n),S.current=null}},p[9]=x.quaternion,p[10]=b.domElement,p[11]=_,p[12]=v,p[13]=d):d=p[13],p[14]!==x||p[15]!==b.domElement||p[16]!==_||p[17]!==v?(m=[x,b.domElement,_,v],p[14]=x,p[15]=b.domElement,p[16]=_,p[17]=v,p[18]=m):m=p[18],(0,r.useEffect)(d,m),p[19]!==x||p[20]!==f.current||p[21]!==g||p[22]!==y||p[23]!==v?(h=(e,t)=>{let{force:a,angle:r}=f.current;if("dualStick"===v){let e=g.current;if(e.force>.15){let a=(e.force-.15)/.85,r=Math.cos(e.angle),n=Math.sin(e.angle);k.current.setFromQuaternion(x.quaternion,"YXZ"),k.current.y=k.current.y-r*a*2.5*t,k.current.x=k.current.x+n*a*2.5*t,k.current.x=Math.max(-X,Math.min(X,k.current.x)),x.quaternion.setFromEuler(k.current)}if(a>.08){let e=80*y*((a-.08)/.92),n=Math.cos(r),o=Math.sin(r);x.getWorldDirection(j.current),j.current.normalize(),w.current.crossVectors(x.up,j.current).normalize(),N.current.set(0,0,0).addScaledVector(j.current,o).addScaledVector(w.current,-n),N.current.lengthSq()>0&&(N.current.normalize().multiplyScalar(e*t),x.position.add(N.current))}}else if("moveLookStick"===v&&a>0){let e=80*y*.5;if(x.getWorldDirection(j.current),j.current.normalize(),N.current.copy(j.current).multiplyScalar(e*t),x.position.add(N.current),a>=.15){let e=Math.cos(r),n=Math.sin(r),o=(a-.15)/.85;k.current.setFromQuaternion(x.quaternion,"YXZ"),k.current.y=k.current.y-e*o*1.25*t,k.current.x=k.current.x+n*o*1.25*t,k.current.x=Math.max(-X,Math.min(X,k.current.x)),x.quaternion.setFromEuler(k.current)}}},p[19]=x,p[20]=f.current,p[21]=g,p[22]=y,p[23]=v,p[24]=h):h=p[24],(0,z.useFrame)(h),null}var ee=e.i(11889),et=e.i(56373),ea=e.i(86447),er=e.i(1559),en=e.i(78440),eo=e.i(59129),es=e.i(25998),el=e.i(18364),ei=e.i(70238),ec=e.i(29402),eu=e.i(97442);let ed=new Set(["SkiFree","SkiFree_Daily","SkiFree_Randomizer"]),em={"missions.vl2":"Official","TR2final105-client.vl2":"Team Rabbit 2","z_mappacks/CTF/Classic_maps_v1.vl2":"Classic","z_mappacks/CTF/DynamixFinalPack.vl2":"Official","z_mappacks/CTF/KryMapPack_b3EDIT.vl2":"KryMapPack","z_mappacks/CTF/S5maps.vl2":"S5","z_mappacks/CTF/S8maps.vl2":"S8","z_mappacks/CTF/TWL-MapPack.vl2":"TWL","z_mappacks/CTF/TWL-MapPackEDIT.vl2":"TWL","z_mappacks/CTF/TWL2-MapPack.vl2":"TWL2","z_mappacks/CTF/TWL2-MapPackEDIT.vl2":"TWL2","z_mappacks/TWL_T2arenaOfficialMaps.vl2":"Arena","z_mappacks/xPack2.vl2":"xPack2","z_mappacks/z_DMP2-V0.6.vl2":"DMP2 (Discord Map Pack)","z_mappacks/zDMP-4.7.3DX.vl2":"DMP (Discord Map Pack)","z_mappacks/zDMP-4.7.3DX-ServerOnly.vl2":"DMP (Discord Map Pack)"},eh={"z_mappacks/DM":"DM","z_mappacks/LCTF":"LCTF","z_mappacks/Lak":"LakRabbit"},ep=(0,f.getMissionList)().filter(e=>!ed.has(e)).map(e=>{let t,a=(0,f.getMissionInfo)(e),[r]=(0,f.getSourceAndPath)(a.resourcePath),n=(t=r.match(/^(.*)(\/[^/]+)$/))?t[1]:"",o=em[r]??eh[n]??null;return{resourcePath:a.resourcePath,missionName:e,displayName:a.displayName,sourcePath:r,groupName:o,missionTypes:a.missionTypes}}),ef=new Map(ep.map(e=>[e.missionName,e])),e_=function(e){let t=new Map;for(let a of e){let e=t.get(a.groupName)??[];e.push(a),t.set(a.groupName,e)}return t.forEach((e,a)=>{t.set(a,(0,ec.default)(e,[e=>(e.displayName||e.missionName).toLowerCase()],["asc"]))}),(0,ec.default)(Array.from(t.entries()),[([e])=>"Official"===e?0:null==e?2:1,([e])=>e?e.toLowerCase():""],["asc","asc"])}(ep),eg="u">typeof navigator&&/Mac|iPhone|iPad|iPod/.test(navigator.platform);function ey(e){let r,n,o,s,l,i=(0,a.c)(12),{mission:c}=e,u=c.displayName||c.missionName;return i[0]!==u?(r=(0,t.jsx)("span",{className:eu.default.ItemName,children:u}),i[0]=u,i[1]=r):r=i[1],i[2]!==c.missionTypes?(n=c.missionTypes.length>0&&(0,t.jsx)("span",{className:eu.default.ItemTypes,children:c.missionTypes.map(ev)}),i[2]=c.missionTypes,i[3]=n):n=i[3],i[4]!==r||i[5]!==n?(o=(0,t.jsxs)("span",{className:eu.default.ItemHeader,children:[r,n]}),i[4]=r,i[5]=n,i[6]=o):o=i[6],i[7]!==c.missionName?(s=(0,t.jsx)("span",{className:eu.default.ItemMissionName,children:c.missionName}),i[7]=c.missionName,i[8]=s):s=i[8],i[9]!==o||i[10]!==s?(l=(0,t.jsxs)(t.Fragment,{children:[o,s]}),i[9]=o,i[10]=s,i[11]=l):l=i[11],l}function ev(e){return(0,t.jsx)("span",{className:eu.default.ItemType,"data-mission-type":e,children:e},e)}function ex(e){let n,o,s,l,i,c,u,d,m,h,p,_,g,y,v,x,b,k=(0,a.c)(46),{value:S,missionType:C,onChange:j,disabled:w}=e,[N,I]=(0,r.useState)(""),T=(0,r.useRef)(null),P=(0,r.useRef)(C);k[0]===Symbol.for("react.memo_cache_sentinel")?(n=e=>{(0,r.startTransition)(()=>I(e))},k[0]=n):n=k[0];let B=(0,el.useComboboxStore)({resetValueOnHide:!0,selectedValue:S,setSelectedValue:e=>{if(e){let t=P.current,a=(0,f.getMissionInfo)(e).missionTypes;t&&a.includes(t)||(t=a[0]),j({missionName:e,missionType:t}),T.current?.blur()}},setValue:n});k[1]!==B?(o=()=>{let e=e=>{"k"===e.key&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),T.current?.focus(),B.show())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},s=[B],k[1]=B,k[2]=o,k[3]=s):(o=k[2],s=k[3]),(0,r.useEffect)(o,s),k[4]!==S?(l=ef.get(S),k[4]=S,k[5]=l):l=k[5];let D=l;e:{let e,t;if(!N){let e;k[6]===Symbol.for("react.memo_cache_sentinel")?(e={type:"grouped",groups:e_},k[6]=e):e=k[6],i=e;break e}k[7]!==N?(e=(0,ei.matchSorter)(ep,N,{keys:["displayName","missionName","missionTypes","groupName"]}),k[7]=N,k[8]=e):e=k[8];let a=e;k[9]!==a?(t={type:"flat",missions:a},k[9]=a,k[10]=t):t=k[10],i=t}let E=i,L=D?D.displayName||D.missionName:S,R="flat"===E.type?0===E.missions.length:0===E.groups.length,M=e=>(0,t.jsx)(et.ComboboxItem,{value:e.missionName,className:eu.default.Item,focusOnHover:!0,onClick:t=>{if(t.target&&t.target instanceof HTMLElement){let a=t.target.dataset.missionType;a?(P.current=a,e.missionName===S&&j({missionName:e.missionName,missionType:a})):P.current=null}else P.current=null},children:(0,t.jsx)(ey,{mission:e})},e.missionName),H=en.ComboboxProvider;k[11]!==B?(c=()=>{try{document.exitPointerLock()}catch{}B.show()},u=e=>{"Escape"!==e.key||B.getState().open||T.current?.blur()},k[11]=B,k[12]=c,k[13]=u):(c=k[12],u=k[13]),k[14]!==w||k[15]!==L||k[16]!==c||k[17]!==u?(d=(0,t.jsx)(ee.Combobox,{ref:T,autoSelect:!0,disabled:w,placeholder:L,className:eu.default.Input,onFocus:c,onKeyDown:u}),k[14]=w,k[15]=L,k[16]=c,k[17]=u,k[18]=d):d=k[18],k[19]!==L?(m=(0,t.jsx)("span",{className:eu.default.SelectedName,children:L}),k[19]=L,k[20]=m):m=k[20],k[21]!==C?(h=C&&(0,t.jsx)("span",{className:eu.default.ItemType,"data-mission-type":C,children:C}),k[21]=C,k[22]=h):h=k[22],k[23]!==h||k[24]!==m?(p=(0,t.jsxs)("div",{className:eu.default.SelectedValue,children:[m,h]}),k[23]=h,k[24]=m,k[25]=p):p=k[25],k[26]===Symbol.for("react.memo_cache_sentinel")?(_=(0,t.jsx)("kbd",{className:eu.default.Shortcut,children:eg?"⌘K":"^K"}),k[26]=_):_=k[26],k[27]!==p||k[28]!==d?(g=(0,t.jsxs)("div",{className:eu.default.InputWrapper,children:[d,p,_]}),k[27]=p,k[28]=d,k[29]=g):g=k[29];let F=er.ComboboxPopover,G=eu.default,q=ea.ComboboxList,O=eu.default,A="flat"===E.type?E.missions.map(M):E.groups.map(e=>{let[a,n]=e;return a?(0,t.jsxs)(eo.ComboboxGroup,{className:eu.default.Group,children:[(0,t.jsx)(es.ComboboxGroupLabel,{className:eu.default.GroupLabel,children:a}),n.map(M)]},a):(0,t.jsx)(r.Fragment,{children:n.map(M)},"ungrouped")});return k[30]!==R?(y=R&&(0,t.jsx)("div",{className:eu.default.NoResults,children:"No missions found"}),k[30]=R,k[31]=y):y=k[31],k[32]!==q||k[33]!==O.List||k[34]!==A||k[35]!==y?(v=(0,t.jsxs)(q,{className:O.List,children:[A,y]}),k[32]=q,k[33]=O.List,k[34]=A,k[35]=y,k[36]=v):v=k[36],k[37]!==F||k[38]!==G.Popover||k[39]!==v?(x=(0,t.jsx)(F,{gutter:4,fitViewport:!0,autoFocusOnHide:!1,className:G.Popover,children:v}),k[37]=F,k[38]=G.Popover,k[39]=v,k[40]=x):x=k[40],k[41]!==H||k[42]!==B||k[43]!==g||k[44]!==x?(b=(0,t.jsxs)(H,{store:B,children:[g,x]}),k[41]=H,k[42]=B,k[43]=g,k[44]=x,k[45]=b):b=k[45],b}var eb=e.i(11152),ek=e.i(40141);function eS(e){return(0,ek.GenIcon)({tag:"svg",attr:{viewBox:"0 0 384 512"},child:[{tag:"path",attr:{d:"M192 0c-41.8 0-77.4 26.7-90.5 64L64 64C28.7 64 0 92.7 0 128L0 448c0 35.3 28.7 64 64 64l256 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64l-37.5 0C269.4 26.7 233.8 0 192 0zm0 64a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM305 273L177 401c-9.4 9.4-24.6 9.4-33.9 0L79 337c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L271 239c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"},child:[]}]})(e)}var eC=e.i(36679);function ej(e){let n,o,s,l,i,c=(0,a.c)(11),{cameraRef:u,missionName:d,missionType:m}=e,{fogEnabled:h}=(0,J.useSettings)(),[p,f]=(0,r.useState)(!1),_=(0,r.useRef)(null);c[0]!==u||c[1]!==h||c[2]!==d||c[3]!==m?(n=async()=>{clearTimeout(_.current);let e=u.current;if(!e)return;let t=function({position:e,quaternion:t}){let a=e=>parseFloat(e.toFixed(3)),r=`${a(e.x)},${a(e.y)},${a(e.z)}`,n=`${a(t.x)},${a(t.y)},${a(t.z)},${a(t.w)}`;return`#c${r}~${n}`}(e),a=new URLSearchParams;a.set("mission",`${d}~${m}`),a.set("fog",h.toString());let r=`${window.location.pathname}?${a}${t}`,n=`${window.location.origin}${r}`;window.history.replaceState(null,"",r);try{await navigator.clipboard.writeText(n),f(!0),_.current=setTimeout(()=>{f(!1)},1100)}catch(e){console.error(e)}},c[0]=u,c[1]=h,c[2]=d,c[3]=m,c[4]=n):n=c[4];let g=n,y=p?"true":"false";return c[5]===Symbol.for("react.memo_cache_sentinel")?(o=(0,t.jsx)(eb.FaMapPin,{className:eC.default.MapPin}),s=(0,t.jsx)(eS,{className:eC.default.ClipboardCheck}),l=(0,t.jsx)("span",{className:eC.default.ButtonLabel,children:" Copy coordinates URL"}),c[5]=o,c[6]=s,c[7]=l):(o=c[5],s=c[6],l=c[7]),c[8]!==g||c[9]!==y?(i=(0,t.jsxs)("button",{type:"button",className:eC.default.Root,"aria-label":"Copy coordinates URL",title:"Copy coordinates URL",onClick:g,"data-copied":y,id:"copyCoordinatesButton",children:[o,s,l]}),c[8]=g,c[9]=y,c[10]=i):i=c[10],i}function ew(e){return(0,ek.GenIcon)({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M21 3H3c-1.11 0-2 .89-2 2v12a2 2 0 0 0 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5a2 2 0 0 0-2-2zm0 14H3V5h18v12zm-5-6-7 4V7z"},child:[]}]})(e)}e.i(91891);var eN=e.i(11251),eI=e.i(88787);e.i(70847);var eT=e.i(47566),eP=e.i(25311),eB=e.i(89119),eD=e.i(10244);class eE extends eD.StreamEngine{parser;initialBlock;moveTicks=0;absoluteYaw=0;absolutePitch=0;lastAbsYaw=0;lastAbsPitch=0;exhausted=!1;_teamScoresGen=0;_rosterGen=0;_weaponsHudGen=0;_inventoryHudGen=0;_cachedSnapshot=null;_cachedSnapshotTick=-1;_snap=null;constructor(e){super(),this.parser=e,this.registry=e.getRegistry(),this.ghostTracker=e.getGhostTracker();const t=e.initialBlock;this.initialBlock={dataBlocks:t.dataBlocks,initialGhosts:t.initialGhosts,controlObjectGhostIndex:t.controlObjectGhostIndex,controlObjectData:t.controlObjectData,targetEntries:t.targetEntries,sensorGroupColors:t.sensorGroupColors,taggedStrings:t.taggedStrings,initialEvents:t.initialEvents,demoValues:t.demoValues,firstPerson:t.firstPerson},this.reset()}getDataBlockData(e){let t=this.initialBlock.dataBlocks.get(e);if(t?.data)return t.data;let a=this.parser.getPacketParser();return a.dataBlockDataMap?.get(e)}_shapeConstructorCache=null;getShapeConstructorSequences(e){if(!this._shapeConstructorCache)for(let[,e]of(this._shapeConstructorCache=new Map,this.initialBlock.dataBlocks)){if("TSShapeConstructor"!==e.className||!e.data)continue;let t=e.data.shape,a=e.data.sequences;t&&a&&this._shapeConstructorCache.set(t.toLowerCase(),a)}return this._shapeConstructorCache.get(e.toLowerCase())}getTimeSec(){return this.moveTicks*(eP.TICK_DURATION_MS/1e3)}getCameraYawPitch(e){let t="player"===this.lastControlType,a=t?this.absoluteYaw:this.lastAbsYaw,r=t?this.absolutePitch:this.lastAbsPitch;return t&&(this.lastAbsYaw=a,this.lastAbsPitch=r),{yaw:a,pitch:r}}getControlPlayerHeadPitch(e){return(0,eB.clamp)(this.absolutePitch/eB.MAX_PITCH,-1,1)}onTeamScoresChanged(){this._teamScoresGen++}onRosterChanged(){this._rosterGen++}onWeaponsHudChanged(){this._weaponsHudGen++}onInventoryHudChanged(){this._inventoryHudGen++}reset(){for(let[e,t]of(this.parser.reset(),this.ghostTracker=this.parser.getGhostTracker(),this._cachedSnapshot=null,this._cachedSnapshotTick=-1,this._snap=null,this.resetSharedState(),this.initialBlock.taggedStrings))this.netStrings.set(e,t);for(let e of this.initialBlock.targetEntries)e.name&&this.targetNames.set(e.targetId,(0,eB.stripTaggedStringMarkup)(e.name)),this.targetTeams.set(e.targetId,e.sensorGroup),this.targetRenderFlags.set(e.targetId,e.targetData);for(let e of this.initialBlock.sensorGroupColors){let t=this.sensorGroupColors.get(e.group);t||(t=new Map,this.sensorGroupColors.set(e.group,t)),t.set(e.targetGroup,{r:e.r,g:e.g,b:e.b})}if(this.moveTicks=0,this.absoluteYaw=0,this.absolutePitch=0,this.lastAbsYaw=0,this.lastAbsPitch=0,this.firstPerson=this.initialBlock.firstPerson,this.lastControlType=(0,eB.detectControlObjectType)(this.initialBlock.controlObjectData)??"player",this.isPiloting="player"===this.lastControlType&&!!(this.initialBlock.controlObjectData?.pilot||this.initialBlock.controlObjectData?.controlObjectGhost!=null),this.lastPilotGhostIndex=this.isPiloting&&"number"==typeof this.initialBlock.controlObjectData?.controlObjectGhost?this.initialBlock.controlObjectData.controlObjectGhost:void 0,this.isPiloting){let e=this.initialBlock.controlObjectData?.controlObjectData,t=e?.angPosition;if(t&&"number"==typeof t.w){this.lastVehicleHeading=(0,eB.torqueQuatHeading)(t),this.lastVehiclePitch=(0,eB.torqueQuatPitch)(t);let e=(0,eB.torqueQuatToThreeJS)(t);if(e){let[t,a,r,n]=e;this.lastVehicleOrbitDir=[-(1-2*(a*a+r*r)),-(2*(t*a+r*n)),-(2*(t*r-a*n))]}}}if(this.lastCameraMode="camera"===this.lastControlType&&"number"==typeof this.initialBlock.controlObjectData?.cameraMode?this.initialBlock.controlObjectData.cameraMode:void 0,this.lastOrbitGhostIndex="camera"===this.lastControlType&&"number"==typeof this.initialBlock.controlObjectData?.orbitObjectGhostIndex?this.initialBlock.controlObjectData.orbitObjectGhostIndex:void 0,"camera"===this.lastControlType){let e=this.initialBlock.controlObjectData?.minOrbitDist,t=this.initialBlock.controlObjectData?.maxOrbitDist,a=this.initialBlock.controlObjectData?.curOrbitDist;"number"==typeof e&&"number"==typeof t&&Number.isFinite(e)&&Number.isFinite(t)?this.lastOrbitDistance=Math.max(0,t-e):"number"==typeof a&&Number.isFinite(a)?this.lastOrbitDistance=Math.max(0,a):this.lastOrbitDistance=void 0}else this.lastOrbitDistance=void 0;let e=this.getAbsoluteRotation(this.initialBlock.controlObjectData);for(let t of(e&&(this.absoluteYaw=e.yaw,this.absolutePitch=e.pitch,this.lastAbsYaw=e.yaw,this.lastAbsPitch=e.pitch),this.exhausted=!1,this.latestFov=100,this.latestControl={ghostIndex:this.initialBlock.controlObjectGhostIndex,data:this.initialBlock.controlObjectData,position:(0,eB.isValidPosition)(this.initialBlock.controlObjectData?.position)?this.initialBlock.controlObjectData?.position:void 0},this.controlPlayerGhostId="player"===this.lastControlType&&this.initialBlock.controlObjectGhostIndex>=0?(0,eP.toEntityId)("Player",this.initialBlock.controlObjectGhostIndex):void 0,this.initialBlock.initialGhosts)){if("create"!==t.type||null==t.classId)continue;let e=this.registry.getGhostParser(t.classId)?.name;if(!e)throw Error(`No ghost parser for classId ${t.classId} (ghost index ${t.index})`);let a=(0,eP.toEntityId)(e,t.index),r={id:a,ghostIndex:t.index,className:e,spawnTick:0,type:(0,eP.toEntityType)(e),rotation:[0,0,0,1]};if(this.applyGhostData(r,t.parsedData),t.parsedData){let a=(0,eT.ghostToSceneObject)(e,t.index,t.parsedData);a&&(r.sceneData=a)}this.entities.set(a,r),this.entityIdByGhostIndex.set(t.index,a)}if(0===this.playerSensorGroup&&"player"===this.lastControlType&&this.latestControl.ghostIndex>=0){let e=this.entityIdByGhostIndex.get(this.latestControl.ghostIndex),t=e?this.entities.get(e):void 0;t?.sensorGroup!=null&&t.sensorGroup>0&&(this.playerSensorGroup=t.sensorGroup)}for(let e of this.initialBlock.initialEvents){let t=this.registry.getEventParser(e.classId)?.name;if("SetSensorGroupEvent"===t&&e.parsedData){let t=e.parsedData.sensorGroup;null!=t&&(this.playerSensorGroup=t)}else if("RemoteCommandEvent"===t&&e.parsedData){let t=this.resolveNetString(e.parsedData.funcName),a=e.parsedData.args;"ServerMessage"===t&&this.handleServerMessage(a),this.handleHudRemoteCommand(t,a)}}let t=function(e){let t={weaponsHud:null,backpackHud:null,inventoryHud:null,teamScores:[],playerRoster:new Map,chatMessages:[],gravity:-20};if(!e.length)return t;let a=0,r=()=>{let t=e[a++];return""===t?"":t??""};if(r(),a>=e.length)return t;let n=parseInt(r(),10)||0,o=new Map;for(let e=0;e0&&o.set(s,(o.get(s)??0)+1)}if(a>=e.length||(r(),a>=e.length))return t;{let e=r().split(" "),a=e[0]??"",n="1"===e[1]||"true"===e[1],o=e[2]??"",s="1"===e[4]||"true"===e[4];n&&a&&(t.backpackHud={packIndex:(0,eB.backpackBitmapToIndex)(a),active:s,text:o})}if(a>=e.length)return t;let s=r().split(" "),l=parseInt(s[4],10)||0,i=parseInt(s[5],10)||0,c=parseInt(s[6],10);for(let e=0;e=e.length)return t;let d=r().split(" "),m=parseInt(d[4],10)||0,h=parseInt(d[5],10)||0,p=parseInt(d[6],10);for(let e=0;e0)||e.set(a,n)}e.size>0&&(t.inventoryHud={slots:e,activeSlot:isNaN(p)?-1:p})}if(a>=e.length)return t;let f=r().split(" "),_=f[1]??"",g=parseInt(f[2],10)||0,y=[];for(let e=0;e=8)for(let e=0;e<2;e++){let a=4*e,r=e+1;t.teamScores.push({teamId:r,name:y[a]??"",score:parseInt(y[a+1],10)||0,playerCount:o.get(r)??0})}else if("TR2Game"===_&&g>=4)for(let e=0;e<2;e++){let a=2*e,r=e+1;t.teamScores.push({teamId:r,name:y[a+1]??"",score:parseInt(y[a],10)||0,playerCount:o.get(r)??0})}if(a>=e.length)return t;r();for(let n=0;n<10&&!(a>=e.length);n++){let e=r();e&&t.chatMessages.push(e)}if(ae.text).join("");if(!a.trim())continue;let r=t[0].colorCode;if(t.some(e=>3===e.colorCode||4===e.colorCode)&&a.includes(": ")){let e=a.indexOf(": ");this.pushChatMessage({timeSec:0,sender:a.slice(0,e),text:a.slice(e+2),kind:"chat",colorCode:r,segments:t})}else this.pushChatMessage({timeSec:0,sender:"",text:a,kind:"server",colorCode:r,segments:t})}this.updateCameraAndHud()}getSnapshot(){if(this._cachedSnapshot&&this._cachedSnapshotTick===this.moveTicks)return this._cachedSnapshot;let e=this.buildSnapshot();return this._cachedSnapshot=e,this._cachedSnapshotTick=this.moveTicks,e}getEffectShapes(){let e=new Set,t=t=>{let a=t.dtsFileName;a&&e.add(a);let r=t.subExplosions;if(Array.isArray(r))for(let t of r){if(null==t)continue;let a=this.getDataBlockData(t);a?.dtsFileName&&e.add(a.dtsFileName)}};for(let[,e]of this.initialBlock.dataBlocks){let a=e.data?.explosion;if(null==a)continue;let r=this.getDataBlockData(a);r&&t(r)}return[...e]}stepToTime(e,t=1/0){let a=Math.floor(1e3*(Number.isFinite(e)?Math.max(0,e):0)/eP.TICK_DURATION_MS),r=!1;a({index:e,ammo:t})),activeIndex:this.weaponsHud.activeIndex},l=r&&r.inventoryHudGen===this._inventoryHudGen?r.inventoryHud:{slots:Array.from(this.inventoryHud.slots.entries()).map(([e,t])=>({slot:e,count:t})),activeSlot:this.inventoryHud.activeSlot},i=r&&r.backpackPackIndex===this.backpackHud.packIndex&&r.backpackActive===this.backpackHud.active&&r.backpackText===this.backpackHud.text?r.backpackHud:this.backpackHud.packIndex>=0?{...this.backpackHud}:null;if(r&&r.teamScoresGen===this._teamScoresGen&&r.rosterGen===this._rosterGen)e=r.teamScores;else{e=this.teamScores.map(e=>({...e}));let t=new Map;for(let{teamId:e}of this.playerRoster.values())e>0&&t.set(e,(t.get(e)??0)+1);for(let a of e)a.playerCount=t.get(a.teamId)??0}return this._snap={teamScoresGen:this._teamScoresGen,rosterGen:this._rosterGen,teamScores:e,weaponsHudGen:this._weaponsHudGen,weaponsHud:s,inventoryHudGen:this._inventoryHudGen,inventoryHud:l,backpackPackIndex:this.backpackHud.packIndex,backpackActive:this.backpackHud.active,backpackText:this.backpackHud.text,backpackHud:i},{timeSec:a,exhausted:this.exhausted,camera:this.camera,entities:t,controlPlayerGhostId:this.controlPlayerGhostId,playerSensorGroup:this.playerSensorGroup,status:this.lastStatus,chatMessages:n,audioEvents:o,weaponsHud:s,backpackHud:i,inventoryHud:l,teamScores:e}}isPacketData(e){return!!e&&"object"==typeof e&&"gameState"in e&&"events"in e&&"ghosts"in e}isMoveData(e){return!!e&&"object"==typeof e&&"yaw"in e}isInfoData(e){return!!e&&"object"==typeof e&&"value1"in e&&"number"==typeof e.value1&&"value2"in e&&"number"==typeof e.value2}}async function eL(e){let t=new eI.DemoParser(new Uint8Array(e)),{header:a,initialBlock:r}=await t.load(),{missionName:n,gameType:o}=function(e){let t=null,a=null;for(let r=0;r{if(h){_.current=_.current+1,p(null);return}f.current?.click()},d[0]=h,d[1]=p,d[2]=e):e=d[2];let g=e;d[3]!==p?(n=async e=>{let t=e.target.files?.[0];if(t){e.target.value="";try{let e=await t.arrayBuffer(),a=_.current+1;_.current=a;let r=await eL(e);if(_.current!==a)return;p(r)}catch(e){console.error("Failed to load demo:",e)}}},d[3]=p,d[4]=n):n=d[4];let y=n;d[5]===Symbol.for("react.memo_cache_sentinel")?(o={display:"none"},d[5]=o):o=d[5],d[6]!==y?(s=(0,t.jsx)("input",{ref:f,type:"file",accept:".rec",style:o,onChange:y}),d[6]=y,d[7]=s):s=d[7];let v=h?"Unload demo":"Load demo (.rec)",x=h?"Unload demo":"Load demo (.rec)",b=h?"true":void 0,k=null!=m&&!h;d[8]===Symbol.for("react.memo_cache_sentinel")?(l=(0,t.jsx)(ew,{className:eR.default.DemoIcon}),d[8]=l):l=d[8];let S=h?"Unload demo":"Demo";return d[9]!==S?(i=(0,t.jsx)("span",{className:eR.default.ButtonLabel,children:S}),d[9]=S,d[10]=i):i=d[10],d[11]!==g||d[12]!==i||d[13]!==v||d[14]!==x||d[15]!==b||d[16]!==k?(c=(0,t.jsxs)("button",{type:"button",className:eR.default.Root,"aria-label":v,title:x,onClick:g,"data-active":b,disabled:k,children:[l,i]}),d[11]=g,d[12]=i,d[13]=v,d[14]=x,d[15]=b,d[16]=k,d[17]=c):c=d[17],d[18]!==c||d[19]!==s?(u=(0,t.jsxs)(t.Fragment,{children:[s,c]}),d[18]=c,d[19]=s,d[20]=u):u=d[20],u}function eH(e){return(0,ek.GenIcon)({tag:"svg",attr:{fill:"currentColor",viewBox:"0 0 16 16"},child:[{tag:"path",attr:{d:"M11.251.068a.5.5 0 0 1 .227.58L9.677 6.5H13a.5.5 0 0 1 .364.843l-8 8.5a.5.5 0 0 1-.842-.49L6.323 9.5H3a.5.5 0 0 1-.364-.843l8-8.5a.5.5 0 0 1 .615-.09z"},child:[]}]})(e)}var eF=e.i(98755),eG=e.i(9607);function eq(e){let r,n,o,s,l,i=(0,a.c)(20),{onOpenServerBrowser:c}=e,u=(0,eF.useLiveSelector)(eU),d=(0,eF.useLiveSelector)(eA),m=(0,eF.useLiveSelector)(eF.selectPing),h=(0,eF.useLiveSelector)(eO),p="connected"===u,f="connecting"===u||"challenging"===u||"authenticating"===u,_=p?`Disconnect from ${d??"server"}`:"Join server",g=p?`Disconnect from ${d??"server"}`:"Join server";i[0]!==h||i[1]!==p||i[2]!==c?(r=()=>{p?h():c()},i[0]=h,i[1]=p,i[2]=c,i[3]=r):r=i[3];let y=p?"true":void 0,v=`${eG.default.LiveIcon} ${p?eG.default.Pulsing:""}`;if(i[4]!==v?(n=(0,t.jsx)(eH,{className:v}),i[4]=v,i[5]=n):n=i[5],i[6]!==f||i[7]!==p?(o=!p&&(0,t.jsx)("span",{className:eG.default.TextLabel,children:f?"Connecting...":"Connect"}),i[6]=f,i[7]=p,i[8]=o):o=i[8],i[9]!==p||i[10]!==m)s=p&&null!=m&&(0,t.jsx)("span",{className:eG.default.PingLabel,children:m>=1e3?m.toLocaleString()+"ms":m+"ms"}),i[9]=p,i[10]=m,i[11]=s;else s=i[11];return i[12]!==_||i[13]!==g||i[14]!==r||i[15]!==y||i[16]!==n||i[17]!==o||i[18]!==s?(l=(0,t.jsxs)("button",{type:"button",className:eG.default.Root,"aria-label":_,title:g,onClick:r,"data-active":y,children:[n,o,s]}),i[12]=_,i[13]=g,i[14]=r,i[15]=y,i[16]=n,i[17]=o,i[18]=s,i[19]=l):l=i[19],l}function eO(e){return e.disconnectServer}function eA(e){return e.serverName}function eU(e){return e.gameStatus}function eW(e){return(0,ek.GenIcon)({tag:"svg",attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"10"},child:[]},{tag:"line",attr:{x1:"12",y1:"16",x2:"12",y2:"12"},child:[]},{tag:"line",attr:{x1:"12",y1:"8",x2:"12.01",y2:"8"},child:[]}]})(e)}function eK(e){return(0,ek.GenIcon)({tag:"svg",attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"3"},child:[]},{tag:"path",attr:{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"},child:[]}]})(e)}var ez=e.i(65883);function e$(e){let n,o,s,l,i,c,u,d,m,h,p,f,_,g,y,v,x,b,k,S,C,j,w,N,I,T,P,B,D,L,R,M,H,F,G,q,O,A,U,W,K=(0,a.c)(95),{missionName:z,missionType:$,onChangeMission:V,onOpenMapInfo:Y,onOpenServerBrowser:X,isTouch:Q,cameraRef:Z}=e,{fogEnabled:ee,setFogEnabled:et,fov:ea,setFov:er,audioEnabled:en,setAudioEnabled:eo,animationEnabled:es,setAnimationEnabled:el}=(0,J.useSettings)(),{speedMultiplier:ei,setSpeedMultiplier:ec,touchMode:eu,setTouchMode:ed}=(0,J.useControls)(),{debugMode:em,setDebugMode:eh}=(0,J.useDebug)(),ep=(0,E.useRecording)(),ef=(0,eF.useLiveSelector)(eQ),e_=null!=ep||ef,eg=e_&&!ef,[ey,ev]=(0,r.useState)(!1),eb=(0,r.useRef)(null),ek=(0,r.useRef)(null),eS=(0,r.useRef)(null);K[0]!==ey?(n=()=>{ey&&eb.current?.focus()},o=[ey],K[0]=ey,K[1]=n,K[2]=o):(n=K[1],o=K[2]),(0,r.useEffect)(n,o),K[3]===Symbol.for("react.memo_cache_sentinel")?(s=e=>{let t=e.relatedTarget;t&&eS.current?.contains(t)||ev(!1)},K[3]=s):s=K[3];let eC=s;K[4]===Symbol.for("react.memo_cache_sentinel")?(l=e=>{"Escape"===e.key&&(ev(!1),ek.current?.focus())},K[4]=l):l=K[4];let ew=l;return K[5]!==e_||K[6]!==z||K[7]!==$||K[8]!==V?(i=(0,t.jsx)("div",{className:ez.default.MissionSelectWrapper,children:(0,t.jsx)(ex,{value:z,missionType:$,onChange:V,disabled:e_})}),K[5]=e_,K[6]=z,K[7]=$,K[8]=V,K[9]=i):i=K[9],K[10]===Symbol.for("react.memo_cache_sentinel")?(c=()=>{ev(eJ)},K[10]=c):c=K[10],K[11]===Symbol.for("react.memo_cache_sentinel")?(u=(0,t.jsx)(eK,{}),K[11]=u):u=K[11],K[12]!==ey?(d=(0,t.jsx)("button",{ref:ek,className:ez.default.Toggle,onClick:c,"aria-expanded":ey,"aria-controls":"settingsPanel","aria-label":"Settings",children:u}),K[12]=ey,K[13]=d):d=K[13],K[14]!==Z||K[15]!==z||K[16]!==$?(m=(0,t.jsx)(ej,{missionName:z,missionType:$,cameraRef:Z}),K[14]=Z,K[15]=z,K[16]=$,K[17]=m):m=K[17],K[18]===Symbol.for("react.memo_cache_sentinel")?(h=(0,t.jsx)(eM,{}),K[18]=h):h=K[18],K[19]!==X?(p=X&&(0,t.jsx)(eq,{onOpenServerBrowser:X}),K[19]=X,K[20]=p):p=K[20],K[21]===Symbol.for("react.memo_cache_sentinel")?(f=(0,t.jsx)(eW,{}),_=(0,t.jsx)("span",{className:ez.default.ButtonLabel,children:"Show map info"}),K[21]=f,K[22]=_):(f=K[21],_=K[22]),K[23]!==Y?(g=(0,t.jsxs)("button",{type:"button",className:ez.default.MapInfoButton,"aria-label":"Show map info",onClick:Y,children:[f,_]}),K[23]=Y,K[24]=g):g=K[24],K[25]!==p||K[26]!==g||K[27]!==m?(y=(0,t.jsxs)("div",{className:ez.default.Group,children:[m,h,p,g]}),K[25]=p,K[26]=g,K[27]=m,K[28]=y):y=K[28],K[29]!==et?(v=e=>{et(e.target.checked)},K[29]=et,K[30]=v):v=K[30],K[31]!==ee||K[32]!==v?(x=(0,t.jsx)("input",{id:"fogInput",type:"checkbox",checked:ee,onChange:v}),K[31]=ee,K[32]=v,K[33]=x):x=K[33],K[34]===Symbol.for("react.memo_cache_sentinel")?(b=(0,t.jsx)("label",{htmlFor:"fogInput",children:"Fog?"}),K[34]=b):b=K[34],K[35]!==x?(k=(0,t.jsxs)("div",{className:ez.default.CheckboxField,children:[x,b]}),K[35]=x,K[36]=k):k=K[36],K[37]!==eo?(S=e=>{eo(e.target.checked)},K[37]=eo,K[38]=S):S=K[38],K[39]!==en||K[40]!==S?(C=(0,t.jsx)("input",{id:"audioInput",type:"checkbox",checked:en,onChange:S}),K[39]=en,K[40]=S,K[41]=C):C=K[41],K[42]===Symbol.for("react.memo_cache_sentinel")?(j=(0,t.jsx)("label",{htmlFor:"audioInput",children:"Audio?"}),K[42]=j):j=K[42],K[43]!==C?(w=(0,t.jsxs)("div",{className:ez.default.CheckboxField,children:[C,j]}),K[43]=C,K[44]=w):w=K[44],K[45]!==k||K[46]!==w?(N=(0,t.jsxs)("div",{className:ez.default.Group,children:[k,w]}),K[45]=k,K[46]=w,K[47]=N):N=K[47],K[48]!==el?(I=e=>{el(e.target.checked)},K[48]=el,K[49]=I):I=K[49],K[50]!==es||K[51]!==I?(T=(0,t.jsx)("input",{id:"animationInput",type:"checkbox",checked:es,onChange:I}),K[50]=es,K[51]=I,K[52]=T):T=K[52],K[53]===Symbol.for("react.memo_cache_sentinel")?(P=(0,t.jsx)("label",{htmlFor:"animationInput",children:"Animation?"}),K[53]=P):P=K[53],K[54]!==T?(B=(0,t.jsxs)("div",{className:ez.default.CheckboxField,children:[T,P]}),K[54]=T,K[55]=B):B=K[55],K[56]!==eh?(D=e=>{eh(e.target.checked)},K[56]=eh,K[57]=D):D=K[57],K[58]!==em||K[59]!==D?(L=(0,t.jsx)("input",{id:"debugInput",type:"checkbox",checked:em,onChange:D}),K[58]=em,K[59]=D,K[60]=L):L=K[60],K[61]===Symbol.for("react.memo_cache_sentinel")?(R=(0,t.jsx)("label",{htmlFor:"debugInput",children:"Debug?"}),K[61]=R):R=K[61],K[62]!==L?(M=(0,t.jsxs)("div",{className:ez.default.CheckboxField,children:[L,R]}),K[62]=L,K[63]=M):M=K[63],K[64]!==B||K[65]!==M?(H=(0,t.jsxs)("div",{className:ez.default.Group,children:[B,M]}),K[64]=B,K[65]=M,K[66]=H):H=K[66],K[67]!==ea||K[68]!==eg||K[69]!==er?(F=eg?null:(0,t.jsxs)("div",{className:ez.default.Field,children:[(0,t.jsx)("label",{htmlFor:"fovInput",children:"FOV"}),(0,t.jsx)("input",{id:"fovInput",type:"range",min:75,max:120,step:5,value:ea,onChange:e=>er(parseInt(e.target.value))}),(0,t.jsx)("output",{htmlFor:"fovInput",children:ea})]}),K[67]=ea,K[68]=eg,K[69]=er,K[70]=F):F=K[70],K[71]!==eg||K[72]!==ec||K[73]!==ei?(G=eg?null:(0,t.jsxs)("div",{className:ez.default.Field,children:[(0,t.jsx)("label",{htmlFor:"speedInput",children:"Speed"}),(0,t.jsx)("input",{id:"speedInput",type:"range",min:.1,max:5,step:.05,value:ei,onChange:e=>ec(parseFloat(e.target.value))})]}),K[71]=eg,K[72]=ec,K[73]=ei,K[74]=G):G=K[74],K[75]!==F||K[76]!==G?(q=(0,t.jsxs)("div",{className:ez.default.Group,children:[F,G]}),K[75]=F,K[76]=G,K[77]=q):q=K[77],K[78]!==Q||K[79]!==ed||K[80]!==eu?(O=Q&&(0,t.jsx)("div",{className:ez.default.Group,children:(0,t.jsxs)("div",{className:ez.default.Field,children:[(0,t.jsx)("label",{htmlFor:"touchModeInput",children:"Joystick:"})," ",(0,t.jsxs)("select",{id:"touchModeInput",value:eu,onChange:e=>ed(e.target.value),children:[(0,t.jsx)("option",{value:"dualStick",children:"Dual Stick"}),(0,t.jsx)("option",{value:"moveLookStick",children:"Single Stick"})]})]})}),K[78]=Q,K[79]=ed,K[80]=eu,K[81]=O):O=K[81],K[82]!==ey||K[83]!==y||K[84]!==N||K[85]!==H||K[86]!==q||K[87]!==O?(A=(0,t.jsxs)("div",{className:ez.default.Dropdown,ref:eb,id:"settingsPanel",tabIndex:-1,onKeyDown:ew,onBlur:eC,"data-open":ey,children:[y,N,H,q,O]}),K[82]=ey,K[83]=y,K[84]=N,K[85]=H,K[86]=q,K[87]=O,K[88]=A):A=K[88],K[89]!==A||K[90]!==d?(U=(0,t.jsxs)("div",{ref:eS,children:[d,A]}),K[89]=A,K[90]=d,K[91]=U):U=K[91],K[92]!==U||K[93]!==i?(W=(0,t.jsxs)("div",{id:"controls",className:ez.default.Controls,onKeyDown:eX,onPointerDown:eY,onClick:eV,children:[i,U]}),K[92]=U,K[93]=i,K[94]=W):W=K[94],W}function eJ(e){return!e}function eV(e){return e.stopPropagation()}function eY(e){return e.stopPropagation()}function eX(e){return e.stopPropagation()}function eQ(e){return null!=e.adapter}let eZ=()=>null;var e0=e.i(31067);let e1=r.forwardRef(({envMap:e,resolution:t=256,frames:a=1/0,makeDefault:n,children:s,...l},i)=>{let c=(0,$.useThree)(({set:e})=>e),u=(0,$.useThree)(({camera:e})=>e),d=(0,$.useThree)(({size:e})=>e),m=r.useRef(null);r.useImperativeHandle(i,()=>m.current,[]);let h=r.useRef(null),p=function(e,t,a){let n=(0,$.useThree)(e=>e.size),s=(0,$.useThree)(e=>e.viewport),l="number"==typeof e?e:n.width*s.dpr,i=n.height*s.dpr,c=("number"==typeof e?void 0:e)||{},{samples:u=0,depth:d,...m}=c,h=null!=d?d:c.depthBuffer,p=r.useMemo(()=>{let e=new o.WebGLRenderTarget(l,i,{minFilter:o.LinearFilter,magFilter:o.LinearFilter,type:o.HalfFloatType,...m});return h&&(e.depthTexture=new o.DepthTexture(l,i,o.FloatType)),e.samples=u,e},[]);return r.useLayoutEffect(()=>{p.setSize(l,i),u&&(p.samples=u)},[u,p,l,i]),r.useEffect(()=>()=>p.dispose(),[]),p}(t);r.useLayoutEffect(()=>{l.manual||(m.current.aspect=d.width/d.height)},[d,l]),r.useLayoutEffect(()=>{m.current.updateProjectionMatrix()});let f=0,_=null,g="function"==typeof s;return(0,z.useFrame)(t=>{g&&(a===1/0||f{if(n)return c(()=>({camera:m.current})),()=>c(()=>({camera:u}))},[m,n,c]),r.createElement(r.Fragment,null,r.createElement("perspectiveCamera",(0,e0.default)({ref:m},l),!g&&s),r.createElement("group",{ref:h},g&&s(p.texture)))});function e2(){let e,r,n=(0,a.c)(3),{fov:o}=(0,J.useSettings)();return n[0]===Symbol.for("react.memo_cache_sentinel")?(e=[0,256,0],n[0]=e):e=n[0],n[1]!==o?(r=(0,t.jsx)(e1,{makeDefault:!0,position:e,fov:o}),n[1]=o,n[2]=r):r=n[2],r}var e3=e.i(51434),e4=e.i(86855),e5=e.i(68294),e6=e.i(87297),e8=e.i(51475),e7=e.i(63318),e9=e.i(38437);function te(){let e,r=(0,a.c)(3),n=(0,y.useSceneSun)();if(!n){let e;return r[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("ambientLight",{color:"#888888",intensity:1}),r[0]=e):e=r[0],e}return r[1]!==n?(e=(0,t.jsx)(tt,{sunData:n}),r[1]=n,r[2]=e):e=r[2],e}function tt(e){let n,s,l,i,c,u,d,m,h,p,f=(0,a.c)(29),{sunData:_}=e;f[0]!==_.direction?(n=(0,e7.torqueToThree)(_.direction),f[0]=_.direction,f[1]=n):n=f[1];let[g,y,v]=n,x=Math.sqrt(g*g+y*y+v*v),b=g/x,k=y/x,S=v/x;f[2]!==b||f[3]!==k||f[4]!==S?(s=new o.Vector3(b,k,S),f[2]=b,f[3]=k,f[4]=S,f[5]=s):s=f[5];let C=s,j=-(5e3*C.x),w=-(5e3*C.y),N=-(5e3*C.z);f[6]!==j||f[7]!==w||f[8]!==N?(l=new o.Vector3(j,w,N),f[6]=j,f[7]=w,f[8]=N,f[9]=l):l=f[9];let I=l;f[10]!==_.color.b||f[11]!==_.color.g||f[12]!==_.color.r?(i=new o.Color(_.color.r,_.color.g,_.color.b),f[10]=_.color.b,f[11]=_.color.g,f[12]=_.color.r,f[13]=i):i=f[13];let T=i;f[14]!==_.ambient.b||f[15]!==_.ambient.g||f[16]!==_.ambient.r?(c=new o.Color(_.ambient.r,_.ambient.g,_.ambient.b),f[14]=_.ambient.b,f[15]=_.ambient.g,f[16]=_.ambient.r,f[17]=c):c=f[17];let P=c,B=C.y<0;return f[18]!==B?(u=()=>{(0,e9.updateGlobalSunUniforms)(B)},d=[B],f[18]=B,f[19]=u,f[20]=d):(u=f[19],d=f[20]),(0,r.useEffect)(u,d),f[21]!==T||f[22]!==I?(m=(0,t.jsx)("directionalLight",{position:I,color:T,intensity:1,castShadow:!0,"shadow-mapSize-width":8192,"shadow-mapSize-height":8192,"shadow-camera-left":-4096,"shadow-camera-right":4096,"shadow-camera-top":4096,"shadow-camera-bottom":-4096,"shadow-camera-near":100,"shadow-camera-far":12e3,"shadow-bias":-1e-5,"shadow-normalBias":.4,"shadow-radius":2}),f[21]=T,f[22]=I,f[23]=m):m=f[23],f[24]!==P?(h=(0,t.jsx)("ambientLight",{color:P,intensity:1}),f[24]=P,f[25]=h):h=f[25],f[26]!==m||f[27]!==h?(p=(0,t.jsxs)(t.Fragment,{children:[m,h]}),f[26]=m,f[27]=h,f[28]=p):p=f[28],p}var ta=e.i(75840);let tr=(0,i.textureToUrl)("gui/hud_new_compass"),tn=(0,i.textureToUrl)("gui/hud_new_NSEW");function to(e){let r,n,o=(0,a.c)(3),{yaw:s}=e;if(null==s)return null;let l=180*s/Math.PI;o[0]===Symbol.for("react.memo_cache_sentinel")?(r=(0,t.jsx)("img",{src:tr,alt:"",className:ta.default.CompassRing}),o[0]=r):r=o[0];let i=`rotate(${-l}deg)`;return o[1]!==i?(n=(0,t.jsxs)("div",{className:ta.default.Compass,children:[r,(0,t.jsx)("img",{src:tn,alt:"",className:ta.default.CompassNSEW,style:{transform:i}})]}),o[1]=i,o[2]=n):n=o[2],n}function ts(e){let r,n=(0,a.c)(2),{value:o}=e,s=Math.max(0,Math.min(100,100*o)),l=`${s}%`;return n[0]!==l?(r=(0,t.jsx)("div",{className:ta.default.BarTrack,children:(0,t.jsx)("div",{className:ta.default.BarFillHealth,style:{width:l}})}),n[0]=l,n[1]=r):r=n[1],r}function tl(e){let r,n=(0,a.c)(2),{value:o}=e,s=Math.max(0,Math.min(100,100*o)),l=`${s}%`;return n[0]!==l?(r=(0,t.jsx)("div",{className:ta.default.BarTrack,children:(0,t.jsx)("div",{className:ta.default.BarFillEnergy,style:{width:l}})}),n[0]=l,n[1]=r):r=n[1],r}let ti={weapon_sniper:"gui/hud_ret_sniper",weapon_shocklance:"gui/hud_ret_shocklance",weapon_targeting:"gui/hud_ret_targlaser"};function tc(){let e,r=(0,a.c)(5),n=(0,g.useEngineSelector)(tu);if(void 0===n)return null;let o=ti[!n?"":n.replace(/\.dts$/i,"").toLowerCase()];if(o){let e,a;return r[0]!==o?(e=(0,i.textureToUrl)(o),r[0]=o,r[1]=e):e=r[1],r[2]!==e?(a=(0,t.jsx)("div",{className:ta.default.Reticle,children:(0,t.jsx)("img",{src:e,alt:"",className:ta.default.ReticleImage})}),r[2]=e,r[3]=a):a=r[3],a}return r[4]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("div",{className:ta.default.Reticle,children:(0,t.jsx)("div",{className:ta.default.ReticleDot})}),r[4]=e):e=r[4],e}function tu(e){let t=e.playback.streamSnapshot;if(!t||t.camera?.mode!=="first-person")return;let a=t.controlPlayerGhostId;if(a)return t.entities.find(e=>e.id===a)?.weaponShape}let td={0:{icon:"gui/hud_blaster",label:"Blaster"},1:{icon:"gui/hud_plasma",label:"Plasma"},2:{icon:"gui/hud_chaingun",label:"Chaingun"},3:{icon:"gui/hud_disc",label:"Spinfusor"},4:{icon:"gui/hud_grenlaunch",label:"GL"},5:{icon:"gui/hud_sniper",label:"Laser Rifle"},6:{icon:"gui/hud_elfgun",label:"ELF Gun"},7:{icon:"gui/hud_new_mortar",label:"Mortar"},8:{icon:"gui/hud_missiles",label:"Missile"},9:{icon:"gui/hud_targetlaser",label:"Targeting"},10:{icon:"gui/hud_shocklance",label:"Shocklance"},11:{icon:"gui/hud_disc",label:"Spinfusor"},12:{icon:"gui/hud_grenlaunch",label:"GL"},13:{icon:"gui/hud_chaingun",label:"Chaingun"},14:{icon:"gui/hud_targetlaser",label:"Targeting"},15:{icon:"gui/hud_targetlaser",label:"Targeting"},16:{icon:"gui/hud_shocklance",label:"Shocklance"},17:{icon:"gui/hud_new_mortar",label:"Mortar"}},tm=new Map(Object.entries(td).map(([e,t])=>[Number(e),(0,i.textureToUrl)(t.icon)])),th=new Set([9,14,15]),tp=(0,i.textureToUrl)("gui/hud_infinity");function tf(e){let r,n,o,s,l=(0,a.c)(12),{slot:i,isSelected:c}=e,u=td[i.index];if(!u)return null;let d=i.ammo<0,m=`${ta.default.PackInvItem} ${c?ta.default.PackInvItemActive:ta.default.PackInvItemDim}`;return l[0]!==i.index?(r=tm.get(i.index),l[0]=i.index,l[1]=r):r=l[1],l[2]!==u.label||l[3]!==r?(n=(0,t.jsx)("img",{src:r,alt:u.label,className:ta.default.PackInvIcon}),l[2]=u.label,l[3]=r,l[4]=n):n=l[4],l[5]!==d||l[6]!==i.ammo?(o=d?(0,t.jsx)("img",{src:tp,alt:"\\u221E",className:ta.default.PackInvInfinity}):(0,t.jsx)("span",{className:ta.default.PackInvCount,children:i.ammo}),l[5]=d,l[6]=i.ammo,l[7]=o):o=l[7],l[8]!==m||l[9]!==n||l[10]!==o?(s=(0,t.jsxs)("div",{className:m,children:[n,o]}),l[8]=m,l[9]=n,l[10]=o,l[11]=s):s=l[11],s}function t_(){let e,r,n,o,s,l,i=(0,a.c)(15),c=(0,g.useEngineSelector)(tg);if(!c||!c.slots.length)return null;if(i[0]!==c.slots){for(let t of(r=[],e=[],c.slots))th.has(t.index)?e.push(t):r.push(t);i[0]=c.slots,i[1]=e,i[2]=r}else e=i[1],r=i[2];return i[3]!==r||i[4]!==c?(n=r.map(e=>(0,t.jsx)(tf,{slot:e,isSelected:e.index===c.activeIndex},e.index)),i[3]=r,i[4]=c,i[5]=n):n=i[5],i[6]!==e.length?(o=e.length>0&&(0,t.jsx)("div",{className:ta.default.WeaponSeparator}),i[6]=e.length,i[7]=o):o=i[7],i[8]!==e||i[9]!==c?(s=e.map(e=>(0,t.jsx)(tf,{slot:e,isSelected:e.index===c.activeIndex},e.index)),i[8]=e,i[9]=c,i[10]=s):s=i[10],i[11]!==n||i[12]!==o||i[13]!==s?(l=(0,t.jsxs)("div",{className:ta.default.WeaponHUD,children:[n,o,s]}),i[11]=n,i[12]=o,i[13]=s,i[14]=l):l=i[14],l}function tg(e){return e.playback.streamSnapshot?.weaponsHud}let ty={1:"Storm",2:"Inferno",3:"Starwolf",4:"Diamond Sword",5:"Blood Eagle",6:"Phoenix"};function tv(){let e,r,n,o=(0,a.c)(11),s=(0,g.useEngineSelector)(tb),l=(0,g.useEngineSelector)(tx);if(!s?.length)return null;if(o[0]!==l||o[1]!==s){let a,n;o[4]!==l?(a=(e,t)=>{if(l){if(e.teamId===l)return -1;if(t.teamId===l)return 1}return e.teamId-t.teamId},o[4]=l,o[5]=a):a=o[5];let i=[...s].sort(a);e=ta.default.TeamScores,o[6]!==l?(n=e=>{let a=l>0&&e.teamId===l,r=e.name||(ty[e.teamId]??`Team ${e.teamId}`);return(0,t.jsxs)("div",{className:ta.default.TeamRow,children:[(0,t.jsx)("span",{className:a?ta.default.TeamNameFriendly:ta.default.TeamNameEnemy,children:r}),(0,t.jsx)("span",{className:ta.default.TeamScore,children:e.score}),(0,t.jsxs)("span",{className:ta.default.TeamCount,children:["(",e.playerCount,")"]})]},e.teamId)},o[6]=l,o[7]=n):n=o[7],r=i.map(n),o[0]=l,o[1]=s,o[2]=e,o[3]=r}else e=o[2],r=o[3];return o[8]!==e||o[9]!==r?(n=(0,t.jsx)("div",{className:e,children:r}),o[8]=e,o[9]=r,o[10]=n):n=o[10],n}function tx(e){return e.playback.streamSnapshot?.playerSensorGroup}function tb(e){return e.playback.streamSnapshot?.teamScores}let tk={0:ta.default.ChatColor0,1:ta.default.ChatColor1,2:ta.default.ChatColor2,3:ta.default.ChatColor3,4:ta.default.ChatColor4,5:ta.default.ChatColor5,6:ta.default.ChatColor6,7:ta.default.ChatColor7,8:ta.default.ChatColor8,9:ta.default.ChatColor9};function tS(e){let n,o,s,l,i,c,u=(0,a.c)(15),{isLive:d}=e,m=(0,g.useEngineSelector)(tI),h=(0,r.useRef)(null),p=(0,r.useRef)(0),[f,_]=(0,r.useState)(""),y=m?.length??0;u[0]!==y?(n=()=>{y>p.current&&h.current&&(h.current.scrollTop=h.current.scrollHeight),p.current=y},o=[y],u[0]=y,u[1]=n,u[2]=o):(n=u[1],o=u[2]),(0,r.useEffect)(n,o),u[3]!==f?(s=e=>{e.preventDefault();let t=f.trim();t&&(eF.liveConnectionStore.getState().sendCommand("messageSent",t),_(""))},u[3]=f,u[4]=s):s=u[4];let v=s,x=!!m?.length;return u[5]!==x||u[6]!==m?(l=x&&(0,t.jsx)("div",{ref:h,className:ta.default.ChatWindow,children:m.map(tw)}),u[5]=x,u[6]=m,u[7]=l):l=u[7],u[8]!==f||u[9]!==v||u[10]!==d?(i=d&&(0,t.jsx)("form",{className:ta.default.ChatInputForm,onSubmit:v,children:(0,t.jsx)("input",{className:ta.default.ChatInput,type:"text",placeholder:"Say something…",value:f,onChange:e=>_(e.target.value),onKeyDown:tj,onKeyUp:tC,maxLength:255})}),u[8]=f,u[9]=v,u[10]=d,u[11]=i):i=u[11],u[12]!==l||u[13]!==i?(c=(0,t.jsxs)("div",{className:ta.default.ChatContainer,children:[l,i]}),u[12]=l,u[13]=i,u[14]=c):c=u[14],c}function tC(e){return e.stopPropagation()}function tj(e){return e.stopPropagation()}function tw(e,a){return(0,t.jsx)("div",{className:ta.default.ChatMessage,children:e.segments?e.segments.map(tN):(0,t.jsxs)("span",{className:null!=e.colorCode&&tk[e.colorCode]?tk[e.colorCode]:tk[0],children:[e.sender?`${e.sender}: `:"",e.text]})},e.id)}function tN(e,a){return(0,t.jsx)("span",{className:tk[e.colorCode]??tk[0],children:e.text},a)}function tI(e){return e.playback.streamSnapshot?.chatMessages}let tT=new Map(Object.entries({0:"gui/hud_new_packammo",1:"gui/hud_new_packcloak",2:"gui/hud_new_packenergy",3:"gui/hud_new_packrepair",4:"gui/hud_new_packsatchel",5:"gui/hud_new_packshield",6:"gui/hud_new_packinventory",7:"gui/hud_new_packmotionsens",8:"gui/hud_new_packradar",9:"gui/hud_new_packturretout",10:"gui/hud_new_packturretin",11:"gui/hud_new_packsensjam",12:"gui/hud_new_packturret",13:"gui/hud_new_packturret",14:"gui/hud_new_packturret",15:"gui/hud_new_packturret",16:"gui/hud_new_packturret",17:"gui/hud_new_packturret",18:"gui/hud_satchel_unarmed",19:"gui/hud_new_packenergy"}).map(([e,t])=>[Number(e),(0,i.textureToUrl)(t)])),tP=new Map(Object.entries({1:"gui/hud_new_packcloak_armed",3:"gui/hud_new_packrepair_armed",4:"gui/hud_satchel_armed",5:"gui/hud_new_packshield_armed",11:"gui/hud_new_packsensjam_armed"}).map(([e,t])=>[Number(e),(0,i.textureToUrl)(t)])),tB={0:{icon:"gui/hud_handgren",label:"Grenade"},1:{icon:"gui/hud_mine",label:"Mine"},2:{icon:"gui/hud_beacon",label:"Beacon"},3:{icon:"gui/hud_medpack",label:"Repair Kit"}},tD=new Map(Object.entries(tB).map(([e,t])=>[Number(e),(0,i.textureToUrl)(t.icon)]));function tE(){let e,r,n,o,s,l,i,c=(0,a.c)(25),u=(0,g.useEngineSelector)(tM),d=(0,g.useEngineSelector)(tR),m=u&&u.packIndex>=0;if(m){let t,a;c[0]!==u.active||c[1]!==u.packIndex?(t=u.active?tP.get(u.packIndex):void 0,c[0]=u.active,c[1]=u.packIndex,c[2]=t):t=c[2];let r=t;c[3]!==r||c[4]!==u.packIndex?(a=r??tT.get(u.packIndex),c[3]=r,c[4]=u.packIndex,c[5]=a):a=c[5],e=a}if(c[6]!==d){if(r=new Map,d)for(let e of d.slots)r.set(e.slot,e.count);c[6]=d,c[7]=r}else r=c[7];if(c[8]!==u||c[9]!==r||c[10]!==m||c[11]!==e){l=Symbol.for("react.early_return_sentinel");e:{let a,i=Object.keys(tB).map(Number).sort(tL);if(!m&&!r.size){l=null;break e}n=ta.default.PackInventoryHUD,c[16]!==u||c[17]!==e?(o=e&&(0,t.jsxs)("div",{className:`${ta.default.PackInvItem} ${u.active?ta.default.PackInvItemActive:""}`,children:[(0,t.jsx)("img",{src:e,alt:"",className:ta.default.PackInvIcon}),(0,t.jsx)("span",{className:ta.default.PackInvCount,children:u.text||" "})]}),c[16]=u,c[17]=e,c[18]=o):o=c[18],c[19]!==r?(a=e=>{let a=tB[e],n=tD.get(e);return a&&n?(0,t.jsxs)("div",{className:ta.default.PackInvItem,children:[(0,t.jsx)("img",{src:n,alt:a.label,className:ta.default.PackInvIcon}),(0,t.jsx)("span",{className:ta.default.PackInvCount,children:r.get(e)??0})]},e):null},c[19]=r,c[20]=a):a=c[20],s=i.map(a)}c[8]=u,c[9]=r,c[10]=m,c[11]=e,c[12]=n,c[13]=o,c[14]=s,c[15]=l}else n=c[12],o=c[13],s=c[14],l=c[15];return l!==Symbol.for("react.early_return_sentinel")?l:(c[21]!==n||c[22]!==o||c[23]!==s?(i=(0,t.jsxs)("div",{className:n,children:[o,s]}),c[21]=n,c[22]=o,c[23]=s,c[24]=i):i=c[24],i)}function tL(e,t){return e-t}function tR(e){return e.playback.streamSnapshot?.inventoryHud}function tM(e){return e.playback.streamSnapshot?.backpackHud}function tH(e){let r,n,o,s,l=(0,a.c)(10);l[0]!==e?(r=void 0===e?{}:e,l[0]=e,l[1]=r):r=l[1];let{isLive:i}=r,c=void 0!==i&&i,u=(0,E.useRecording)(),d=(0,g.useEngineSelector)(tF);if(!u&&!c)return null;let m=d?.status;return l[2]!==c?(n=(0,t.jsx)(tS,{isLive:c}),l[2]=c,l[3]=n):n=l[3],l[4]!==m||l[5]!==d?.camera?.yaw?(o=m&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:ta.default.TopRight,children:[(0,t.jsxs)("div",{className:ta.default.Bars,children:[(0,t.jsx)(ts,{value:m.health}),(0,t.jsx)(tl,{value:m.energy})]}),(0,t.jsx)(to,{yaw:d?.camera?.yaw})]}),(0,t.jsx)(t_,{}),(0,t.jsx)(tE,{}),(0,t.jsx)(tv,{}),(0,t.jsx)(tc,{})]}),l[4]=m,l[5]=d?.camera?.yaw,l[6]=o):o=l[6],l[7]!==n||l[8]!==o?(s=(0,t.jsxs)("div",{className:ta.default.PlayerHUD,children:[n,o]}),l[7]=n,l[8]=o,l[9]=s):s=l[9],s}function tF(e){return e.playback.streamSnapshot}function tG(e){let t,n=(0,a.c)(1),{children:o}=e;return n[0]===Symbol.for("react.memo_cache_sentinel")?(t=[],n[0]=t):t=n[0],(0,r.useEffect)(tq,t),o}function tq(){return tO}function tO(){return(0,eF.disposeLiveConnection)()}var tA=e.i(56614);function tU({open:e,onClose:a,servers:n,loading:o,onRefresh:s,onJoin:l,wsPing:i,warriorName:c,onWarriorNameChange:u}){let[d,m]=(0,r.useState)(null),[h,p]=(0,r.useState)("ping"),[f,_]=(0,r.useState)("asc"),g=(0,r.useRef)(null),y=(0,r.useRef)(s);y.current=s;let v=(0,r.useRef)(!1);(0,r.useEffect)(()=>{if(e){g.current?.focus();try{document.exitPointerLock()}catch{}}else v.current=!1},[e]),(0,r.useEffect)(()=>{e&&0===n.length&&!v.current&&(v.current=!0,y.current())},[e]),(0,r.useEffect)(()=>{if(!e)return;let t=e=>{e.stopPropagation(),"Escape"===e.key&&a()};return window.addEventListener("keydown",t,!0),()=>window.removeEventListener("keydown",t,!0)},[e,a]);let x=(0,r.useCallback)(e=>{h===e?_(e=>"asc"===e?"desc":"asc"):(p(e),_("desc"))},[h]),b=(0,r.useMemo)(()=>[...n].sort((e,t)=>{let a=e[h],r=t[h],n="number"==typeof a&&"number"==typeof r?a-r:String(a).localeCompare(String(r));return"asc"===f?n:-n}),[n,f,h]),k=(0,r.useCallback)(()=>{d&&(l(d),a())},[d,l,a]);return e?(0,t.jsx)("div",{className:tA.default.Overlay,onClick:a,children:(0,t.jsxs)("div",{className:tA.default.Dialog,ref:g,tabIndex:-1,onClick:e=>e.stopPropagation(),children:[(0,t.jsxs)("div",{className:tA.default.Header,children:[(0,t.jsx)("h2",{className:tA.default.Title,children:"Server Browser"}),(0,t.jsxs)("span",{className:tA.default.ServerCount,children:[n.length," server",1!==n.length?"s":""]}),(0,t.jsx)("button",{className:tA.default.RefreshButton,onClick:s,disabled:o,children:o?"Refreshing...":"Refresh"})]}),(0,t.jsx)("div",{className:tA.default.TableWrapper,children:(0,t.jsxs)("table",{className:tA.default.Table,children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{onClick:()=>x("name"),children:"Server Name"}),(0,t.jsx)("th",{onClick:()=>x("playerCount"),children:"Players"}),(0,t.jsx)("th",{onClick:()=>x("ping"),children:"Ping"}),(0,t.jsx)("th",{onClick:()=>x("mapName"),children:"Map"}),(0,t.jsx)("th",{onClick:()=>x("gameType"),children:"Type"}),(0,t.jsx)("th",{onClick:()=>x("mod"),children:"Mod"})]})}),(0,t.jsxs)("tbody",{children:[b.map(e=>(0,t.jsxs)("tr",{className:d===e.address?tA.default.Selected:void 0,onClick:()=>m(e.address),onDoubleClick:()=>{m(e.address),l(e.address),a()},children:[(0,t.jsxs)("td",{children:[e.passwordRequired&&(0,t.jsx)("span",{className:tA.default.PasswordIcon,children:"🔒"}),e.name]}),(0,t.jsxs)("td",{children:[e.playerCount,"/",e.maxPlayers]}),(0,t.jsx)("td",{children:null!=i?(e.ping+i).toLocaleString():"—"}),(0,t.jsx)("td",{children:e.mapName}),(0,t.jsx)("td",{children:e.gameType}),(0,t.jsx)("td",{children:e.mod})]},e.address)),0===b.length&&!o&&(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:6,className:tA.default.Empty,children:"No servers found"})}),o&&0===b.length&&(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:6,className:tA.default.Empty,children:"Querying master server..."})})]})]})}),(0,t.jsxs)("div",{className:tA.default.Footer,children:[(0,t.jsxs)("div",{className:tA.default.WarriorField,children:[(0,t.jsx)("label",{className:tA.default.WarriorLabel,htmlFor:"warriorName",children:"Warrior"}),(0,t.jsx)("input",{id:"warriorName",className:tA.default.WarriorInput,type:"text",value:c,onChange:e=>u(e.target.value),placeholder:"Name thyself…",maxLength:24})]}),(0,t.jsx)("span",{className:tA.default.Hint,children:"Double-click a server to join"}),(0,t.jsx)("button",{onClick:a,className:tA.default.CloseButton,children:"Cancel"}),(0,t.jsx)("button",{onClick:k,disabled:!d,className:tA.default.JoinButton,children:"Join"})]})]})}):null}var tW=e.i(38847);let tK=(0,r.createContext)({live:!1});function tz(e){let n,o,s=(0,a.c)(5),{children:l}=e,[i]=(0,tW.useQueryState)("features",tW.parseAsString);s[0]!==i?(n=()=>({live:new Set((i??"").split(",").map(t$).filter(Boolean)).has("live")}),s[0]=i,s[1]=n):n=s[1];let[c]=(0,r.useState)(n);return s[2]!==l||s[3]!==c?(o=(0,t.jsx)(tK.Provider,{value:c,children:l}),s[2]=l,s[3]=c,s[4]=o):o=s[4],o}function t$(e){return e.trim().toLowerCase()}var tJ=e.i(3011);let tV=(0,r.lazy)(()=>e.A(67521).then(e=>({default:e.StreamPlayback}))),tY=(0,r.lazy)(()=>e.A(93884).then(e=>({default:e.DemoPlaybackControls}))),tX=(0,r.lazy)(()=>e.A(96145).then(e=>({default:e.LiveObserver}))),tQ=(0,r.lazy)(()=>e.A(38496).then(e=>({default:e.ChatSoundPlayer}))),tZ=(0,r.lazy)(()=>e.A(59197).then(e=>({default:e.MapInfoDialog}))),t0=new T.QueryClient,t1={toneMapping:o.NoToneMapping,outputColorSpace:o.SRGBColorSpace},t2=(0,tW.createParser)({parse(e){let[t,a]=e.split("~"),r=a,n=(0,f.getMissionInfo)(t).missionTypes;return a&&n.includes(a)||(r=n[0]),{missionName:t,missionType:r}},serialize:({missionName:e,missionType:t})=>1===(0,f.getMissionInfo)(e).missionTypes.length?e:`${e}~${t}`,eq:(e,t)=>e.missionName===t.missionName&&e.missionType===t.missionType}).withDefault({missionName:"RiverDance",missionType:"CTF"});function t3(){let e,s,l,i,c,u,d,m,h,p,_,g,y,v,x,b,k,S,C,j,w,N,I,T,L,M,H,F,G,q,O,A,U,W,K,z,$,V,Y,X,Z,ee,et,ea=(0,a.c)(77),[er,en]=(0,tW.useQueryState)("mission",t2),[eo,es]=(0,tW.useQueryState)("fog",tW.parseAsBoolean);ea[0]!==es?(e=()=>{es(null)},ea[0]=es,ea[1]=e):e=ea[1];let el=e;ea[2]!==el||ea[3]!==en?(s=e=>{window.location.hash="",el(),en(e)},ea[2]=el,ea[3]=en,ea[4]=s):s=ea[4];let ei=s,ec=(X=(0,a.c)(2),Z=(0,r.useRef)(null),X[0]===Symbol.for("react.memo_cache_sentinel")?(V=e=>{let t=window.matchMedia("(pointer: coarse)");return t.addEventListener("change",e),Z.current=t,()=>{t.removeEventListener("change",e)}},X[0]=V):V=X[0],ee=V,X[1]===Symbol.for("react.memo_cache_sentinel")?(Y=()=>Z.current?.matches??null,X[1]=Y):Y=X[1],et=Y,(0,r.useSyncExternalStore)(ee,et,eZ)),eu=(0,r.useContext)(tK),ed=(0,eF.useLiveSelector)(t8),em=(0,eF.useLiveSelector)(t6),eh=(0,eF.useLiveSelector)(t5),{missionName:ep,missionType:ef}=er,[e_,eg]=(0,r.useState)(!1),[ey,ev]=(0,r.useState)(!1),[ex,eb]=(0,r.useState)(0),[ek,eS]=(0,r.useState)(!0),eC=ed?em?1:"connected"===eh?.8:"authenticating"===eh?.6:"challenging"===eh?.3:"connecting"===eh?.2:.1:null;ea[5]!==eC?(l=()=>{null!=eC&&eb(0)},ea[5]=eC,ea[6]=l):l=ea[6];let ej=null!=eC;ea[7]!==ej?(i=[ej],ea[7]=ej,ea[8]=i):i=ea[8],(0,r.useEffect)(l,i);let ew=eC??ex,eN=ew<1;ea[9]!==eN?(c=()=>{if(eN)eS(!0);else{let e=setTimeout(()=>eS(!1),500);return()=>clearTimeout(e)}},u=[eN],ea[9]=eN,ea[10]=c,ea[11]=u):(c=ea[10],u=ea[11]),(0,r.useEffect)(c,u),ea[12]!==ei?(d=()=>(window.setMissionName=e=>{let t=(0,f.getMissionInfo)(e).missionTypes;ei({missionName:e,missionType:t[0]})},window.getMissionList=f.getMissionList,window.getMissionInfo=f.getMissionInfo,t4),m=[ei],ea[12]=ei,ea[13]=d,ea[14]=m):(d=ea[13],m=ea[14]),(0,r.useEffect)(d,m),ea[15]===Symbol.for("react.memo_cache_sentinel")?(p=()=>{let e=e=>{if("KeyI"!==e.code||e.metaKey||e.ctrlKey||e.altKey)return;let t=e.target;"INPUT"===t.tagName||"TEXTAREA"===t.tagName||t.isContentEditable||eg(!0)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},h=[],ea[15]=h,ea[16]=p):(h=ea[15],p=ea[16]),(0,r.useEffect)(p,h),ea[17]===Symbol.for("react.memo_cache_sentinel")?(_=(e,t)=>{eb(void 0===t?0:t)},ea[17]=_):_=ea[17];let eI=_,eT=(0,r.useRef)(null);ea[18]===Symbol.for("react.memo_cache_sentinel")?(g={angle:0,force:0},ea[18]=g):g=ea[18];let eP=(0,r.useRef)(g),eB=(0,r.useRef)(null);ea[19]===Symbol.for("react.memo_cache_sentinel")?(y={angle:0,force:0},ea[19]=y):y=ea[19];let eD=(0,r.useRef)(y),eE=(0,r.useRef)(null);return ea[20]!==eN||ea[21]!==ew||ea[22]!==ek?(v=ek&&(0,t.jsxs)("div",{id:"loadingIndicator",className:tJ.default.LoadingIndicator,"data-complete":!eN,children:[(0,t.jsx)("div",{className:tJ.default.Spinner}),(0,t.jsx)("div",{className:tJ.default.Progress,children:(0,t.jsx)("div",{className:tJ.default.ProgressBar,style:{width:`${100*ew}%`}})}),(0,t.jsxs)("div",{className:tJ.default.ProgressText,children:[Math.round(100*ew),"%"]})]}),ea[20]=eN,ea[21]=ew,ea[22]=ek,ea[23]=v):v=ea[23],ea[24]===Symbol.for("react.memo_cache_sentinel")?(x={type:o.PCFShadowMap},b=e=>{eT.current=e.camera},ea[24]=x,ea[25]=b):(x=ea[24],b=ea[25]),ea[26]!==ep||ea[27]!==ef?(k=(0,t.jsx)(t7,{missionName:ep,missionType:ef,onLoadingChange:eI}),ea[26]=ep,ea[27]=ef,ea[28]=k):k=ea[28],ea[29]===Symbol.for("react.memo_cache_sentinel")?(S=(0,t.jsx)(te,{}),ea[29]=S):S=ea[29],ea[30]!==ef?(C=(0,t.jsx)(e6.EntityScene,{missionType:ef}),ea[30]=ef,ea[31]=C):C=ea[31],ea[32]===Symbol.for("react.memo_cache_sentinel")?(j=(0,t.jsx)(e2,{}),w=(0,t.jsx)(e4.DebugElements,{}),ea[32]=j,ea[33]=w):(j=ea[32],w=ea[33]),ea[34]!==ec?(N=(0,t.jsx)(ae,{isTouch:ec,joystickStateRef:eP,joystickZoneRef:eB,lookJoystickStateRef:eD,lookJoystickZoneRef:eE}),ea[34]=ec,ea[35]=N):N=ea[35],ea[36]!==k||ea[37]!==C||ea[38]!==N?(I=(0,t.jsx)(n.Canvas,{frameloop:"always",gl:t1,shadows:x,onCreated:b,children:(0,t.jsx)(e8.TickProvider,{children:(0,t.jsx)(e5.CamerasProvider,{children:(0,t.jsxs)(e3.AudioProvider,{children:[k,S,C,j,w,N]})})})}),ea[36]=k,ea[37]=C,ea[38]=N,ea[39]=I):I=ea[39],ea[40]!==v||ea[41]!==I?(T=(0,t.jsxs)("div",{id:"canvasContainer",className:tJ.default.CanvasContainer,children:[v,I]}),ea[40]=v,ea[41]=I,ea[42]=T):T=ea[42],ea[43]===Symbol.for("react.memo_cache_sentinel")?(L=(0,t.jsx)(aa,{}),ea[43]=L):L=ea[43],ea[44]!==ec?(M=ec&&(0,t.jsx)(Q,{joystickState:eP,joystickZone:eB,lookJoystickState:eD,lookJoystickZone:eE}),ea[44]=ec,ea[45]=M):M=ea[45],ea[46]!==ec?(H=!1===ec&&(0,t.jsx)(R,{}),ea[46]=ec,ea[47]=H):H=ea[47],ea[48]===Symbol.for("react.memo_cache_sentinel")?(F=()=>eg(!0),ea[48]=F):F=ea[48],ea[49]!==eu.live?(G=eu.live?()=>ev(!0):void 0,ea[49]=eu.live,ea[50]=G):G=ea[50],ea[51]!==ei||ea[52]!==ec||ea[53]!==ep||ea[54]!==ef||ea[55]!==G?(q=(0,t.jsx)(e$,{missionName:ep,missionType:ef,onChangeMission:ei,onOpenMapInfo:F,onOpenServerBrowser:G,cameraRef:eT,isTouch:ec}),ea[51]=ei,ea[52]=ec,ea[53]=ep,ea[54]=ef,ea[55]=G,ea[56]=q):q=ea[56],ea[57]!==e_||ea[58]!==ep||ea[59]!==ef?(O=e_&&(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tZ,{open:e_,onClose:()=>eg(!1),missionName:ep,missionType:ef??""})}),ea[57]=e_,ea[58]=ep,ea[59]=ef,ea[60]=O):O=ea[60],ea[61]===Symbol.for("react.memo_cache_sentinel")?(A=()=>ev(!1),ea[61]=A):A=ea[61],ea[62]!==ey?(U=(0,t.jsx)(as,{open:ey,onClose:A}),ea[62]=ey,ea[63]=U):U=ea[63],ea[64]===Symbol.for("react.memo_cache_sentinel")?(W=(0,t.jsx)(an,{}),K=(0,t.jsx)(am,{}),ea[64]=W,ea[65]=K):(W=ea[64],K=ea[65]),ea[66]!==T||ea[67]!==M||ea[68]!==H||ea[69]!==q||ea[70]!==O||ea[71]!==U?(z=(0,t.jsxs)(D.KeyboardControls,{map:B.KEYBOARD_CONTROLS,children:[T,L,M,H,q,O,U,W,K]}),ea[66]=T,ea[67]=M,ea[68]=H,ea[69]=q,ea[70]=O,ea[71]=U,ea[72]=z):z=ea[72],ea[73]!==el||ea[74]!==eo||ea[75]!==z?($=(0,t.jsx)(P.QueryClientProvider,{client:t0,children:(0,t.jsx)("main",{children:(0,t.jsx)(E.RecordingProvider,{children:(0,t.jsx)(J.SettingsProvider,{fogEnabledOverride:eo,onClearFogEnabledOverride:el,children:z})})})}),ea[73]=el,ea[74]=eo,ea[75]=z,ea[76]=$):$=ea[76],$}function t4(){delete window.setMissionName,delete window.getMissionList,delete window.getMissionInfo}function t5(e){return e.gameStatus}function t6(e){return e.liveReady}function t8(e){return null!=e.adapter}function t7(e){let r,n=(0,a.c)(5),{missionName:o,missionType:s,onLoadingChange:l}=e,i=(0,E.useRecording)(),c=(0,eF.useLiveSelector)(t9);if(null!=i||c)return null;let u=`${o}~${s}`;return n[0]!==o||n[1]!==s||n[2]!==l||n[3]!==u?(r=(0,t.jsx)(I,{name:o,missionType:s,onLoadingChange:l},u),n[0]=o,n[1]=s,n[2]=l,n[3]=u,n[4]=r):r=n[4],r}function t9(e){return null!=e.adapter}function ae(e){let n,o,s,l,i,c=(0,a.c)(18),{isTouch:u,joystickStateRef:d,joystickZoneRef:m,lookJoystickStateRef:h,lookJoystickZoneRef:p}=e,f=(0,E.useRecording)(),_=(0,eF.useLiveSelector)(at),g=null!=f||_,y=!g||_;return c[0]!==f?(n=f&&(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tV,{})}),c[0]=f,c[1]=n):n=c[1],c[2]!==_?(o=_&&(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tX,{})}),c[2]=_,c[3]=o):o=c[3],c[4]!==g?(s=g&&(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tQ,{})}),c[4]=g,c[5]=s):s=c[5],c[6]!==u||c[7]!==d||c[8]!==m||c[9]!==h||c[10]!==p||c[11]!==y?(l=y&&null!==u&&(u?(0,t.jsx)(Z,{joystickState:d,joystickZone:m,lookJoystickState:h,lookJoystickZone:p}):(0,t.jsx)(B.ObserverControls,{})),c[6]=u,c[7]=d,c[8]=m,c[9]=h,c[10]=p,c[11]=y,c[12]=l):l=c[12],c[13]!==n||c[14]!==o||c[15]!==s||c[16]!==l?(i=(0,t.jsxs)(t.Fragment,{children:[n,o,s,l]}),c[13]=n,c[14]=o,c[15]=s,c[16]=l,c[17]=i):i=c[17],i}function at(e){return null!=e.adapter}function aa(){let e,r=(0,a.c)(2),n=(0,E.useRecording)(),o=(0,eF.useLiveSelector)(ar);return n||o?(r[0]!==o?(e=(0,t.jsx)(tH,{isLive:o}),r[0]=o,r[1]=e):e=r[1],e):null}function ar(e){return null!=e.adapter}function an(){let e,n=(0,a.c)(1),o=(0,E.useRecording)(),s=(0,eF.useLiveSelector)(ao);return!o||s?null:(n[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tY,{})}),n[0]=e):e=n[0],e)}function ao(e){return null!=e.adapter}function as(e){let r,n,o,s=(0,a.c)(15),{open:l,onClose:i}=e,c=(0,eF.useLiveSelector)(ad),u=(0,eF.useLiveSelector)(au),d=(0,eF.useLiveSelector)(ac),m=(0,eF.useLiveSelector)(ai),h=(0,eF.useLiveSelector)(al),p=(0,J.useSettings)();s[0]!==h||s[1]!==p?.warriorName?(r=e=>{h(e,p?.warriorName)},s[0]=h,s[1]=p?.warriorName,s[2]=r):r=s[2],p?.warriorName;let f=r,_=p?.warriorName??"";return s[3]!==p?(n=e=>p?.setWarriorName(e),s[3]=p,s[4]=n):n=s[4],s[5]!==d||s[6]!==f||s[7]!==m||s[8]!==i||s[9]!==l||s[10]!==c||s[11]!==u||s[12]!==_||s[13]!==n?(o=(0,t.jsx)(tU,{open:l,onClose:i,servers:c,loading:u,onRefresh:m,onJoin:f,wsPing:d,warriorName:_,onWarriorNameChange:n}),s[5]=d,s[6]=f,s[7]=m,s[8]=i,s[9]=l,s[10]=c,s[11]=u,s[12]=_,s[13]=n,s[14]=o):o=s[14],o}function al(e){return e.joinServer}function ai(e){return e.listServers}function ac(e){return e.browserToRelayPing}function au(e){return e.serversLoading}function ad(e){return e.servers}function am(){let e,t,n=(0,a.c)(3),{setRecording:o}=(0,E.usePlaybackActions)();return n[0]!==o?(e=()=>(window.loadDemoRecording=o,ah),t=[o],n[0]=o,n[1]=e,n[2]=t):(e=n[1],t=n[2]),(0,r.useEffect)(e,t),null}function ah(){delete window.loadDemoRecording}function ap(){let e,n=(0,a.c)(1);return n[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)(r.Suspense,{children:(0,t.jsx)(tz,{children:(0,t.jsx)(tG,{children:(0,t.jsx)(t3,{})})})}),n[0]=e):e=n[0],e}e.s(["default",()=>ap],31713)}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/629d98e413c0344a.js b/docs/_next/static/chunks/5b60a5e8e48bc409.js similarity index 99% rename from docs/_next/static/chunks/629d98e413c0344a.js rename to docs/_next/static/chunks/5b60a5e8e48bc409.js index 646e84fb..36a0c378 100644 --- a/docs/_next/static/chunks/629d98e413c0344a.js +++ b/docs/_next/static/chunks/5b60a5e8e48bc409.js @@ -394,4 +394,4 @@ Error generating stack: `+e.message+` `+r.join(" > ")+` No matching component was found for: - `+e.join(" > ")}return null},rt.getPublicRootInstance=function(e){if(!(e=e.current).child)return null;switch(e.child.tag){case 27:case 5:return rA(e.child.stateNode);default:return e.child.stateNode}},rt.injectIntoDevTools=function(){var e={bundleType:0,version:rT,rendererPackageName:rw,currentDispatcherRef:rM,reconcilerVersion:"19.2.0"};if(null!==rE&&(e.rendererConfig=rE),typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")e=!1;else{var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)e=!0;else{try{sG=t.inject(e),sW=t}catch{}e=!!t.checkDCE}}return e},rt.isAlreadyRendering=function(){return(6&lm)!=0},rt.observeVisibleRects=function(e,t,n,r){if(!r7)throw Error(i(363));var a=as(e=im(e,t),n,r).disconnect;return{disconnect:function(){a()}}},rt.shouldError=function(){return null},rt.shouldSuspend=function(){return!1},rt.startHostTransition=function(e,t,r,a){if(5!==e.tag)throw Error(i(476));var s=tW(e).queue;tG(e,s,t,r4,null===r?n:function(){var t=tW(e);return null===t.next&&(t=e.alternate.memoizedState),tK(e,t.next.queue,{},ig()),r(a)})},rt.updateContainer=function(e,t,n,i){var r=t.current,a=ig();return i9(r,a,e,t,n,i),a},rt.updateContainerSync=function(e,t,n,i){return i9(t.current,2,e,t,n,i),2},rt},hc.exports.default=hc.exports,Object.defineProperty(hc.exports,"__esModule",{value:!0})),hu.exports=hc.exports),(b=hu.exports)&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default"))?b.default:b,hd={},hp=/^three(?=[A-Z])/,hf=e=>`${e[0].toUpperCase()}${e.slice(1)}`,hm=0;function hg(e){if("function"==typeof e){let t=`${hm++}`;return hd[t]=e,t}Object.assign(hd,e)}function hv(e,t){let n=hf(e),i=hd[n];if("primitive"!==e&&!i)throw Error(`R3F: ${n} is not part of the THREE namespace! Did you forget to extend? See: https://docs.pmnd.rs/react-three-fiber/api/objects#using-3rd-party-objects-declaratively`);if("primitive"===e&&!t.object)throw Error("R3F: Primitives without 'object' are invalid!");if(void 0!==t.args&&!Array.isArray(t.args))throw Error("R3F: The args prop must be an array!")}function h_(e){if(e.isHidden){var t;e.props.attach&&null!=(t=e.parent)&&t.object?c0(e.parent,e):c9(e.object)&&!1!==e.props.visible&&(e.object.visible=!0),e.isHidden=!1,c8(e)}}function hy(e,t,n){let i=t.root.getState();if(e.parent||e.object===i.scene){if(!t.object){var r,a;let e=hd[hf(t.type)];t.object=null!=(r=t.props.object)?r:new e(...null!=(a=t.props.args)?a:[]),t.object.__r3f=t}if(c6(t.object,t.props),t.props.attach)c0(e,t);else if(c9(t.object)&&c9(e.object)){let i=e.object.children.indexOf(null==n?void 0:n.object);if(n&&-1!==i){let n=e.object.children.indexOf(t.object);-1!==n?(e.object.children.splice(n,1),e.object.children.splice(n{try{e.dispose()}catch{}};"u">typeof IS_REACT_ACT_ENVIRONMENT?t():(0,cC.unstable_scheduleCallback)(cC.unstable_IdlePriority,t)}}function hM(e,t,n){if(!t)return;t.parent=null;let i=e.children.indexOf(t);-1!==i&&e.children.splice(i,1),t.props.attach?c1(e,t):c9(t.object)&&c9(e.object)&&(e.object.remove(t.object),function(e,t){let{internal:n}=e.getState();n.interaction=n.interaction.filter(e=>e!==t),n.initialHits=n.initialHits.filter(e=>e!==t),n.hovered.forEach((e,i)=>{(e.eventObject===t||e.object===t)&&n.hovered.delete(i)}),n.capturedMap.forEach((e,i)=>{he(n.capturedMap,t,e,i)})}(cB(t),t.object));let r=null!==t.props.dispose&&!1!==n;for(let e=t.children.length-1;e>=0;e--){let n=t.children[e];hM(t,n,r)}t.children.length=0,delete t.object.__r3f,r&&"primitive"!==t.type&&"Scene"!==t.object.type&&hS(t.object),void 0===n&&c8(t)}let hT=[],hw=()=>{},hE={},hA=0,hC=(S={isPrimaryRenderer:!1,warnsIfNotActing:!1,supportsMutation:!0,supportsPersistence:!1,supportsHydration:!1,createInstance:function(e,t,n){var i;return hv(e=hf(e)in hd?e:e.replace(hp,""),t),"primitive"===e&&null!=(i=t.object)&&i.__r3f&&delete t.object.__r3f,cK(t.object,n,e,t)},removeChild:hM,appendChild:hx,appendInitialChild:hx,insertBefore:hb,appendChildToContainer(e,t){let n=e.getState().scene.__r3f;t&&n&&hx(n,t)},removeChildFromContainer(e,t){let n=e.getState().scene.__r3f;t&&n&&hM(n,t)},insertInContainerBefore(e,t,n){let i=e.getState().scene.__r3f;t&&n&&i&&hb(i,t,n)},getRootHostContext:()=>hE,getChildHostContext:()=>hE,commitUpdate(e,t,n,i,r){var a,s,o;hv(t,i);let l=!1;if("primitive"===e.type&&n.object!==i.object||(null==(a=i.args)?void 0:a.length)!==(null==(s=n.args)?void 0:s.length)?l=!0:null!=(o=i.args)&&o.some((e,t)=>{var i;return e!==(null==(i=n.args)?void 0:i[t])})&&(l=!0),l)hT.push([e,{...i},r]);else{let t=function(e,t){let n={};for(let i in t)if(!c2.includes(i)&&!cZ.equ(t[i],e.props[i]))for(let e in n[i]=t[i],t)e.startsWith(`${i}-`)&&(n[e]=t[e]);for(let i in e.props){if(c2.includes(i)||t.hasOwnProperty(i))continue;let{root:r,key:a}=c$(e.object,i);if(r.constructor&&0===r.constructor.length){let e=function(e){let t=c3.get(e.constructor);try{t||(t=new e.constructor,c3.set(e.constructor,t))}catch(e){}return t}(r);cZ.und(e)||(n[a]=e[a])}else n[a]=0}return n}(e,i);Object.keys(t).length&&(Object.assign(e.props,t),c6(e.object,t))}(null===r.sibling||(4&r.flags)==0)&&function(){for(let[e]of hT){let t=e.parent;if(t)for(let n of(e.props.attach?c1(t,e):c9(e.object)&&c9(t.object)&&t.object.remove(e.object),e.children))n.props.attach?c1(e,n):c9(n.object)&&c9(e.object)&&e.object.remove(n.object);e.isHidden&&h_(e),e.object.__r3f&&delete e.object.__r3f,"primitive"!==e.type&&hS(e.object)}for(let[i,r,a]of hT){i.props=r;let s=i.parent;if(s){let r=hd[hf(i.type)];i.object=null!=(e=i.props.object)?e:new r(...null!=(t=i.props.args)?t:[]),i.object.__r3f=i;var e,t,n=i.object;for(let e of[a,a.alternate])if(null!==e)if("function"==typeof e.ref){null==e.refCleanup||e.refCleanup();let t=e.ref(n);"function"==typeof t&&(e.refCleanup=t)}else e.ref&&(e.ref.current=n);for(let e of(c6(i.object,i.props),i.props.attach?c0(s,i):c9(i.object)&&c9(s.object)&&s.object.add(i.object),i.children))e.props.attach?c0(i,e):c9(e.object)&&c9(i.object)&&i.object.add(e.object);c8(i)}}hT.length=0}()},finalizeInitialChildren:()=>!1,commitMount(){},getPublicInstance:e=>null==e?void 0:e.object,prepareForCommit:()=>null,preparePortalMount:e=>cK(e.getState().scene,e,"",{}),resetAfterCommit:()=>{},shouldSetTextContent:()=>!1,clearContainer:()=>!1,hideInstance:function(e){if(!e.isHidden){var t;e.props.attach&&null!=(t=e.parent)&&t.object?c1(e.parent,e):c9(e.object)&&(e.object.visible=!1),e.isHidden=!0,c8(e)}},unhideInstance:h_,createTextInstance:hw,hideTextInstance:hw,unhideTextInstance:hw,scheduleTimeout:"function"==typeof setTimeout?setTimeout:void 0,cancelTimeout:"function"==typeof clearTimeout?clearTimeout:void 0,noTimeout:-1,getInstanceFromNode:()=>null,beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},detachDeletedInstance(){},prepareScopeUpdate(){},getInstanceFromScope:()=>null,shouldAttemptEagerTransition:()=>!1,trackSchedulerEvent:()=>{},resolveEventType:()=>null,resolveEventTimeStamp:()=>-1.1,requestPostPaintCallback(){},maySuspendCommit:()=>!1,preloadInstance:()=>!0,suspendInstance(){},waitForCommitToBeReady:()=>null,NotPendingTransition:null,HostTransitionContext:E.createContext(null),setCurrentUpdatePriority(e){hA=e},getCurrentUpdatePriority:()=>hA,resolveUpdatePriority(){var e;if(0!==hA)return hA;switch("u">typeof window&&(null==(e=window.event)?void 0:e.type)){case"click":case"contextmenu":case"dblclick":case"pointercancel":case"pointerdown":case"pointerup":return 2;case"pointermove":case"pointerout":case"pointerover":case"pointerenter":case"pointerleave":case"wheel":return 8;default:return 32}},resetFormInstance(){},rendererPackageName:"@react-three/fiber",rendererVersion:"9.5.0",applyViewTransitionName(e,t,n){},restoreViewTransitionName(e,t){},cancelViewTransitionName(e,t,n){},cancelRootViewTransitionName(e){},restoreRootViewTransitionName(e){},InstanceMeasurement:null,measureInstance:e=>null,wasInstanceInViewport:e=>!0,hasInstanceChanged:(e,t)=>!1,hasInstanceAffectedParent:(e,t)=>!1,suspendOnActiveViewTransition(e,t){},startGestureTransition:()=>null,startViewTransition:()=>null,stopViewTransition(e){},createViewTransitionInstance:e=>null,getCurrentGestureOffset(e){throw Error("startGestureTransition is not yet supported in react-three-fiber.")},cloneMutableInstance:(e,t)=>e,cloneMutableTextInstance:e=>e,cloneRootViewTransitionContainer(e){throw Error("Not implemented.")},removeRootViewTransitionClone(e,t){throw Error("Not implemented.")},createFragmentInstance:e=>null,updateFragmentInstanceFiber(e,t){},commitNewChildToFragmentInstance(e,t){},deleteChildFromFragmentInstance(e,t){},measureClonedInstance:e=>null,maySuspendCommitOnUpdate:(e,t,n)=>!1,maySuspendCommitInSyncRender:(e,t)=>!1,startSuspendingCommit:()=>null,getSuspendedCommitReason:(e,t)=>null},(_=hh(S)).injectIntoDevTools(),_),hR=new Map,hP={objects:"shallow",strict:!1};function hI(e){var t,n;let i,r,a,s,o,l,u,c=hR.get(e),h=null==c?void 0:c.fiber,d=null==c?void 0:c.store;c&&console.warn("R3F.createRoot should only be called once!");let p="function"==typeof reportError?reportError:console.error,f=d||(t=hX,n=hq,o=(s=(a=(0,cT.createWithEqualityFn)((e,i)=>{let r,a=new ef,s=new ef,o=new ef;function l(e=i().camera,t=s,n=i().size){let{width:r,height:u,top:c,left:h}=n,d=r/u;t.isVector3?o.copy(t):o.set(...t);let p=e.getWorldPosition(a).distanceTo(o);if(e&&e.isOrthographicCamera)return{width:r/e.zoom,height:u/e.zoom,top:c,left:h,factor:1,distance:p,aspect:d};{let t=2*Math.tan(e.fov*Math.PI/180/2)*p,n=r/u*t;return{width:n,height:t,top:c,left:h,factor:r/n,distance:p,aspect:d}}}let u=t=>e(e=>({performance:{...e.performance,current:t}})),c=new ed;return{set:e,get:i,gl:null,camera:null,raycaster:null,events:{priority:1,enabled:!0,connected:!1},scene:null,xr:null,invalidate:(e=1)=>t(i(),e),advance:(e,t)=>n(e,t,i()),legacy:!1,linear:!1,flat:!1,controls:null,clock:new sW,pointer:c,mouse:c,frameloop:"always",onPointerMissed:void 0,performance:{current:1,min:.5,max:1,debounce:200,regress:()=>{let e=i();r&&clearTimeout(r),e.performance.current!==e.performance.min&&u(e.performance.min),r=setTimeout(()=>u(i().performance.max),e.performance.debounce)}},size:{width:0,height:0,top:0,left:0},viewport:{initialDpr:0,dpr:0,width:0,height:0,top:0,left:0,aspect:0,distance:0,factor:0,getCurrentViewport:l},setEvents:t=>e(e=>({...e,events:{...e.events,...t}})),setSize:(t,n,r=0,a=0)=>{let o=i().camera,u={width:t,height:n,top:r,left:a};e(e=>({size:u,viewport:{...e.viewport,...l(o,s,u)}}))},setDpr:t=>e(e=>{let n=cq(t);return{viewport:{...e.viewport,dpr:n,initialDpr:e.viewport.initialDpr||n}}}),setFrameloop:(t="always")=>{let n=i().clock;n.stop(),n.elapsedTime=0,"never"!==t&&(n.start(),n.elapsedTime=0),e(()=>({frameloop:t}))},previousRoot:void 0,internal:{interaction:[],hovered:new Map,subscribers:[],initialClick:[0,0],initialHits:[],capturedMap:new Map,lastEvent:E.createRef(),active:!1,frames:0,priority:0,subscribe:(e,t,n)=>{let r=i().internal;return r.priority=r.priority+ +(t>0),r.subscribers.push({ref:e,priority:t,store:n}),r.subscribers=r.subscribers.sort((e,t)=>e.priority-t.priority),()=>{let n=i().internal;null!=n&&n.subscribers&&(n.priority=n.priority-(t>0),n.subscribers=n.subscribers.filter(t=>t.ref!==e))}}}}})).getState()).size,l=s.viewport.dpr,u=s.camera,a.subscribe(()=>{let{camera:e,size:t,viewport:n,gl:i,set:r}=a.getState();if(t.width!==o.width||t.height!==o.height||n.dpr!==l){o=t,l=n.dpr;!e.manual&&(e&&e.isOrthographicCamera?(e.left=-(t.width/2),e.right=t.width/2,e.top=t.height/2,e.bottom=-(t.height/2)):e.aspect=t.width/t.height,e.updateProjectionMatrix());n.dpr>0&&i.setPixelRatio(n.dpr);let r="u">typeof HTMLCanvasElement&&i.domElement instanceof HTMLCanvasElement;i.setSize(t.width,t.height,r)}e!==u&&(u=e,r(t=>({viewport:{...t.viewport,...t.viewport.getCurrentViewport(e)}})))}),a.subscribe(e=>t(e)),a),m=h||hC.createContainer(f,1,null,!1,null,"",p,p,p,null);c||hR.set(e,{fiber:m,store:f});let g=!1,v=null;return{async configure(t={}){var n,a;let s;v=new Promise(e=>s=e);let{gl:o,size:l,scene:u,events:c,onCreated:h,shadows:d=!1,linear:p=!1,flat:m=!1,legacy:_=!1,orthographic:y=!1,frameloop:x="always",dpr:b=[1,2],performance:S,raycaster:M,camera:T,onPointerMissed:w}=t,E=f.getState(),A=E.gl;if(!E.gl){let t={canvas:e,powerPreference:"high-performance",antialias:!0,alpha:!0},n="function"==typeof o?await o(t):o;A=ht(n)?n:new cM({...t,...o}),E.set({gl:A})}let C=E.raycaster;C||E.set({raycaster:C=new op});let{params:R,...P}=M||{};if(cZ.equ(P,C,hP)||c6(C,{...P}),cZ.equ(R,C.params,hP)||c6(C,{params:{...C.params,...R}}),!E.camera||E.camera===r&&!cZ.equ(r,T,hP)){r=T;let e=null==T?void 0:T.isCamera,t=e?T:y?new sx(0,0,0,0,.1,1e3):new nO(75,0,.1,1e3);!e&&(t.position.z=5,T&&(c6(t,T),!t.manual&&("aspect"in T||"left"in T||"right"in T||"bottom"in T||"top"in T)&&(t.manual=!0,t.updateProjectionMatrix())),E.camera||null!=T&&T.rotation||t.lookAt(0,0,0)),E.set({camera:t}),C.camera=t}if(!E.scene){let e;null!=u&&u.isScene?cK(e=u,f,"",{}):(cK(e=new nj,f,"",{}),u&&c6(e,u)),E.set({scene:e})}c&&!E.events.handlers&&E.set({events:c(f)});let N=function(e,t){if(!t&&"u">typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement&&e.parentElement){let{width:t,height:n,top:i,left:r}=e.parentElement.getBoundingClientRect();return{width:t,height:n,top:i,left:r}}return!t&&"u">typeof OffscreenCanvas&&e instanceof OffscreenCanvas?{width:e.width,height:e.height,top:0,left:0}:{width:0,height:0,top:0,left:0,...t}}(e,l);if(cZ.equ(N,E.size,hP)||E.setSize(N.width,N.height,N.top,N.left),b&&E.viewport.dpr!==cq(b)&&E.setDpr(b),E.frameloop!==x&&E.setFrameloop(x),E.onPointerMissed||E.set({onPointerMissed:w}),S&&!cZ.equ(S,E.performance,hP)&&E.set(e=>({performance:{...e.performance,...S}})),!E.xr){let e=(e,t)=>{let n=f.getState();"never"!==n.frameloop&&hq(e,!0,n,t)},t=()=>{let t=f.getState();t.gl.xr.enabled=t.gl.xr.isPresenting,t.gl.xr.setAnimationLoop(t.gl.xr.isPresenting?e:null),t.gl.xr.isPresenting||hX(t)},i={connect(){let e=f.getState().gl;e.xr.addEventListener("sessionstart",t),e.xr.addEventListener("sessionend",t)},disconnect(){let e=f.getState().gl;e.xr.removeEventListener("sessionstart",t),e.xr.removeEventListener("sessionend",t)}};"function"==typeof(null==(n=A.xr)?void 0:n.addEventListener)&&i.connect(),E.set({xr:i})}if(A.shadowMap){let e=A.shadowMap.enabled,t=A.shadowMap.type;A.shadowMap.enabled=!!d,cZ.boo(d)?A.shadowMap.type=2:cZ.str(d)?A.shadowMap.type=null!=(a=({basic:0,percentage:1,soft:2,variance:3})[d])?a:2:cZ.obj(d)&&Object.assign(A.shadowMap,d),(e!==A.shadowMap.enabled||t!==A.shadowMap.type)&&(A.shadowMap.needsUpdate=!0)}return eb.enabled=!_,g||(A.outputColorSpace=p?L:I,A.toneMapping=4*!m),E.legacy!==_&&E.set(()=>({legacy:_})),E.linear!==p&&E.set(()=>({linear:p})),E.flat!==m&&E.set(()=>({flat:m})),!o||cZ.fun(o)||ht(o)||cZ.equ(o,A,hP)||c6(A,o),i=h,g=!0,s(),this},render(t){return g||v||this.configure(),v.then(()=>{hC.updateContainer((0,cR.jsx)(hL,{store:f,children:t,onCreated:i,rootElement:e}),m,null,()=>void 0)}),f},unmount(){hN(e)}}}function hL({store:e,children:t,onCreated:n,rootElement:i}){return cH(()=>{let t=e.getState();t.set(e=>({internal:{...e.internal,active:!0}})),n&&n(t),e.getState().events.connected||null==t.events.connect||t.events.connect(i)},[]),(0,cR.jsx)(hn.Provider,{value:e,children:t})}function hN(e,t){let n=hR.get(e),i=null==n?void 0:n.fiber;if(i){let r=null==n?void 0:n.store.getState();r&&(r.internal.active=!1),hC.updateContainer(null,i,null,()=>{r&&setTimeout(()=>{try{null==r.events.disconnect||r.events.disconnect(),null==(n=r.gl)||null==(i=n.renderLists)||null==i.dispose||i.dispose(),null==(a=r.gl)||null==a.forceContextLoss||a.forceContextLoss(),null!=(s=r.gl)&&s.xr&&r.xr.disconnect();var n,i,a,s,o=r.scene;for(let e in"Scene"!==o.type&&(null==o.dispose||o.dispose()),o){let t=o[e];(null==t?void 0:t.type)!=="Scene"&&(null==t||null==t.dispose||t.dispose())}hR.delete(e),t&&t(e)}catch(e){}},500)})}}function hU(e,t){let n={callback:e};return t.add(n),()=>void t.delete(n)}let hD=new Set,hO=new Set,hF=new Set,hz=e=>hU(e,hD),hB=e=>hU(e,hO);function hk(e,t){if(e.size)for(let{callback:n}of e.values())n(t)}function hV(e,t){switch(e){case"before":return hk(hD,t);case"after":return hk(hO,t);case"tail":return hk(hF,t)}}function hH(e,t,n){let i=t.clock.getDelta();"never"===t.frameloop&&"number"==typeof e&&(i=e-t.clock.elapsedTime,t.clock.oldTime=t.clock.elapsedTime,t.clock.elapsedTime=e),s=t.internal.subscribers;for(let e=0;e0)&&!(null!=(t=c.gl.xr)&&t.isPresenting)&&(l+=hH(e,c))}if(hW=!1,hV("after",e),0===l)return hV("tail",e),hG=!1,cancelAnimationFrame(u)}function hX(e,t=1){var n;if(!e)return hR.forEach(e=>hX(e.store.getState(),t));(null==(n=e.gl.xr)||!n.isPresenting)&&e.internal.active&&"never"!==e.frameloop&&(t>1?e.internal.frames=Math.min(60,e.internal.frames+t):hW?e.internal.frames=2:e.internal.frames=1,hG||(hG=!0,requestAnimationFrame(hj)))}function hq(e,t=!0,n,i){if(t&&hV("before",e),n)hH(e,n,i);else for(let t of hR.values())hH(e,t.store.getState());t&&hV("after",e)}let hY={onClick:["click",!1],onContextMenu:["contextmenu",!1],onDoubleClick:["dblclick",!1],onWheel:["wheel",!0],onPointerDown:["pointerdown",!0],onPointerUp:["pointerup",!0],onPointerLeave:["pointerleave",!0],onPointerMove:["pointermove",!0],onPointerCancel:["pointercancel",!0],onLostPointerCapture:["lostpointercapture",!0]};function hZ(e){let{handlePointer:t}=function(e){function t(e){return e.filter(e=>["Move","Over","Enter","Out","Leave"].some(t=>{var n;return null==(n=e.__r3f)?void 0:n.handlers["onPointer"+t]}))}function n(t){let{internal:n}=e.getState();for(let e of n.hovered.values())if(!t.length||!t.find(t=>t.object===e.object&&t.index===e.index&&t.instanceId===e.instanceId)){let i=e.eventObject.__r3f;if(n.hovered.delete(c7(e)),null!=i&&i.eventCount){let n=i.handlers,r={...e,intersections:t};null==n.onPointerOut||n.onPointerOut(r),null==n.onPointerLeave||n.onPointerLeave(r)}}}function i(e,t){for(let n=0;nn([]);case"onLostPointerCapture":return t=>{let{internal:i}=e.getState();"pointerId"in t&&i.capturedMap.has(t.pointerId)&&requestAnimationFrame(()=>{i.capturedMap.has(t.pointerId)&&(i.capturedMap.delete(t.pointerId),n([]))})}}return function(a){let{onPointerMissed:s,internal:o}=e.getState();o.lastEvent.current=a;let l="onPointerMove"===r,u="onClick"===r||"onContextMenu"===r||"onDoubleClick"===r,c=function(t,n){let i=e.getState(),r=new Set,a=[],s=n?n(i.internal.interaction):i.internal.interaction;for(let e=0;e{let n=cY(e.object),i=cY(t.object);return n&&i&&i.events.priority-n.events.priority||e.distance-t.distance}).filter(e=>{let t=c7(e);return!r.has(t)&&(r.add(t),!0)});for(let e of(i.events.filter&&(o=i.events.filter(o,i)),o)){let t=e.object;for(;t;){var l;null!=(l=t.__r3f)&&l.eventCount&&a.push({...e,eventObject:t}),t=t.parent}}if("pointerId"in t&&i.internal.capturedMap.has(t.pointerId))for(let e of i.internal.capturedMap.get(t.pointerId).values())r.has(c7(e.intersection))||a.push(e.intersection);return a}(a,l?t:void 0),h=u?function(t){let{internal:n}=e.getState(),i=t.offsetX-n.initialClick[0],r=t.offsetY-n.initialClick[1];return Math.round(Math.sqrt(i*i+r*r))}(a):0;"onPointerDown"===r&&(o.initialClick=[a.offsetX,a.offsetY],o.initialHits=c.map(e=>e.eventObject)),u&&!c.length&&h<=2&&(i(a,o.interaction),s&&s(a)),l&&n(c),!function(e,t,i,r){if(e.length){let a={stopped:!1};for(let s of e){let o=cY(s.object);if(o||s.object.traverseAncestors(e=>{let t=cY(e);if(t)return o=t,!1}),o){let{raycaster:l,pointer:u,camera:c,internal:h}=o,d=new ef(u.x,u.y,0).unproject(c),p=e=>{var t,n;return null!=(t=null==(n=h.capturedMap.get(e))?void 0:n.has(s.eventObject))&&t},f=e=>{let n={intersection:s,target:t.target};h.capturedMap.has(e)?h.capturedMap.get(e).set(s.eventObject,n):h.capturedMap.set(e,new Map([[s.eventObject,n]])),t.target.setPointerCapture(e)},m=e=>{let t=h.capturedMap.get(e);t&&he(h.capturedMap,s.eventObject,t,e)},g={};for(let e in t){let n=t[e];"function"!=typeof n&&(g[e]=n)}let v={...s,...g,pointer:u,intersections:e,stopped:a.stopped,delta:i,unprojectedPoint:d,ray:l.ray,camera:c,stopPropagation(){let i="pointerId"in t&&h.capturedMap.get(t.pointerId);(!i||i.has(s.eventObject))&&(v.stopped=a.stopped=!0,h.hovered.size&&Array.from(h.hovered.values()).find(e=>e.eventObject===s.eventObject)&&n([...e.slice(0,e.indexOf(s)),s]))},target:{hasPointerCapture:p,setPointerCapture:f,releasePointerCapture:m},currentTarget:{hasPointerCapture:p,setPointerCapture:f,releasePointerCapture:m},nativeEvent:t};if(r(v),!0===a.stopped)break}}}}(c,a,h,function(e){let t=e.eventObject,n=t.__r3f;if(!(null!=n&&n.eventCount))return;let s=n.handlers;if(l){if(s.onPointerOver||s.onPointerEnter||s.onPointerOut||s.onPointerLeave){let t=c7(e),n=o.hovered.get(t);n?n.stopped&&e.stopPropagation():(o.hovered.set(t,e),null==s.onPointerOver||s.onPointerOver(e),null==s.onPointerEnter||s.onPointerEnter(e))}null==s.onPointerMove||s.onPointerMove(e)}else{let n=s[r];n?(!u||o.initialHits.includes(t))&&(i(a,o.interaction.filter(e=>!o.initialHits.includes(e))),n(e)):u&&o.initialHits.includes(t)&&i(a,o.interaction.filter(e=>!o.initialHits.includes(e)))}})}}}}(e);return{priority:1,enabled:!0,compute(e,t,n){t.pointer.set(e.offsetX/t.size.width*2-1,-(2*(e.offsetY/t.size.height))+1),t.raycaster.setFromCamera(t.pointer,t.camera)},connected:void 0,handlers:Object.keys(hY).reduce((e,n)=>({...e,[n]:t(n)}),{}),update:()=>{var t;let{events:n,internal:i}=e.getState();null!=(t=i.lastEvent)&&t.current&&n.handlers&&n.handlers.onPointerMove(i.lastEvent.current)},connect:t=>{let{set:n,events:i}=e.getState();if(null==i.disconnect||i.disconnect(),n(e=>({events:{...e.events,connected:t}})),i.handlers)for(let e in i.handlers){let n=i.handlers[e],[r,a]=hY[e];t.addEventListener(r,n,{passive:a})}},disconnect:()=>{let{set:t,events:n}=e.getState();if(n.connected){if(n.handlers)for(let e in n.handlers){let t=n.handlers[e],[i]=hY[e];n.connected.removeEventListener(i,t)}t(e=>({events:{...e.events,connected:void 0}}))}}}}e.s(["B",()=>cj,"C",()=>hr,"D",()=>ha,"E",()=>cX,"G",()=>hl,"a",()=>cG,"b",()=>cH,"c",()=>hI,"d",()=>hN,"e",()=>hg,"f",()=>hZ,"i",()=>ck,"j",()=>hz,"k",()=>hB,"u",()=>cW],40859)},71753,e=>{"use strict";var t=e.i(40859);e.s(["useFrame",()=>t.D])},15080,e=>{"use strict";var t=e.i(40859);e.s(["useThree",()=>t.C])},79123,e=>{"use strict";var t=e.i(43476),n=e.i(71645);let i=(0,n.createContext)(null),r=(0,n.createContext)(null),a=(0,n.createContext)(null);function s(){return(0,n.useContext)(i)}function o(){return(0,n.useContext)(r)}function l(){return(0,n.useContext)(a)}function u({children:e,fogEnabledOverride:s,onClearFogEnabledOverride:o}){let[l,u]=(0,n.useState)(!0),[c,h]=(0,n.useState)(!1),[d,p]=(0,n.useState)(1),[f,m]=(0,n.useState)(90),[g,v]=(0,n.useState)(!1),[_,y]=(0,n.useState)(!0),[x,b]=(0,n.useState)(!1),[S,M]=(0,n.useState)("moveLookStick"),T=(0,n.useCallback)(e=>{u(e),o()},[o]),w=(0,n.useMemo)(()=>({fogEnabled:s??l,setFogEnabled:T,highQualityFog:c,setHighQualityFog:h,fov:f,setFov:m,audioEnabled:g,setAudioEnabled:v,animationEnabled:_,setAnimationEnabled:y}),[l,s,T,c,f,g,_]),E=(0,n.useMemo)(()=>({debugMode:x,setDebugMode:b}),[x,b]),A=(0,n.useMemo)(()=>({speedMultiplier:d,setSpeedMultiplier:p,touchMode:S,setTouchMode:M}),[d,p,S,M]);(0,n.useLayoutEffect)(()=>{let e={};try{e=JSON.parse(localStorage.getItem("settings"))||{}}catch(e){}null!=e.debugMode&&b(e.debugMode),null!=e.audioEnabled&&v(e.audioEnabled),null!=e.animationEnabled&&y(e.animationEnabled),null!=e.fogEnabled&&u(e.fogEnabled),null!=e.highQualityFog&&h(e.highQualityFog),null!=e.speedMultiplier&&p(e.speedMultiplier),null!=e.fov&&m(e.fov),null!=e.touchMode&&M(e.touchMode)},[]);let C=(0,n.useRef)(null);return(0,n.useEffect)(()=>(C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{try{localStorage.setItem("settings",JSON.stringify({fogEnabled:l,highQualityFog:c,speedMultiplier:d,fov:f,audioEnabled:g,animationEnabled:_,debugMode:x,touchMode:S}))}catch(e){}},500),()=>{C.current&&clearTimeout(C.current)}),[l,c,d,f,g,_,x,S]),(0,t.jsx)(i.Provider,{value:w,children:(0,t.jsx)(r.Provider,{value:E,children:(0,t.jsx)(a.Provider,{value:A,children:e})})})}e.s(["SettingsProvider",()=>u,"useControls",()=>l,"useDebug",()=>o,"useSettings",()=>s])}]); \ No newline at end of file + `+e.join(" > ")}return null},rt.getPublicRootInstance=function(e){if(!(e=e.current).child)return null;switch(e.child.tag){case 27:case 5:return rA(e.child.stateNode);default:return e.child.stateNode}},rt.injectIntoDevTools=function(){var e={bundleType:0,version:rT,rendererPackageName:rw,currentDispatcherRef:rM,reconcilerVersion:"19.2.0"};if(null!==rE&&(e.rendererConfig=rE),typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")e=!1;else{var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)e=!0;else{try{sG=t.inject(e),sW=t}catch{}e=!!t.checkDCE}}return e},rt.isAlreadyRendering=function(){return(6&lm)!=0},rt.observeVisibleRects=function(e,t,n,r){if(!r7)throw Error(i(363));var a=as(e=im(e,t),n,r).disconnect;return{disconnect:function(){a()}}},rt.shouldError=function(){return null},rt.shouldSuspend=function(){return!1},rt.startHostTransition=function(e,t,r,a){if(5!==e.tag)throw Error(i(476));var s=tW(e).queue;tG(e,s,t,r4,null===r?n:function(){var t=tW(e);return null===t.next&&(t=e.alternate.memoizedState),tK(e,t.next.queue,{},ig()),r(a)})},rt.updateContainer=function(e,t,n,i){var r=t.current,a=ig();return i9(r,a,e,t,n,i),a},rt.updateContainerSync=function(e,t,n,i){return i9(t.current,2,e,t,n,i),2},rt},hc.exports.default=hc.exports,Object.defineProperty(hc.exports,"__esModule",{value:!0})),hu.exports=hc.exports),(b=hu.exports)&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default"))?b.default:b,hd={},hp=/^three(?=[A-Z])/,hf=e=>`${e[0].toUpperCase()}${e.slice(1)}`,hm=0;function hg(e){if("function"==typeof e){let t=`${hm++}`;return hd[t]=e,t}Object.assign(hd,e)}function hv(e,t){let n=hf(e),i=hd[n];if("primitive"!==e&&!i)throw Error(`R3F: ${n} is not part of the THREE namespace! Did you forget to extend? See: https://docs.pmnd.rs/react-three-fiber/api/objects#using-3rd-party-objects-declaratively`);if("primitive"===e&&!t.object)throw Error("R3F: Primitives without 'object' are invalid!");if(void 0!==t.args&&!Array.isArray(t.args))throw Error("R3F: The args prop must be an array!")}function h_(e){if(e.isHidden){var t;e.props.attach&&null!=(t=e.parent)&&t.object?c0(e.parent,e):c9(e.object)&&!1!==e.props.visible&&(e.object.visible=!0),e.isHidden=!1,c8(e)}}function hy(e,t,n){let i=t.root.getState();if(e.parent||e.object===i.scene){if(!t.object){var r,a;let e=hd[hf(t.type)];t.object=null!=(r=t.props.object)?r:new e(...null!=(a=t.props.args)?a:[]),t.object.__r3f=t}if(c6(t.object,t.props),t.props.attach)c0(e,t);else if(c9(t.object)&&c9(e.object)){let i=e.object.children.indexOf(null==n?void 0:n.object);if(n&&-1!==i){let n=e.object.children.indexOf(t.object);-1!==n?(e.object.children.splice(n,1),e.object.children.splice(n{try{e.dispose()}catch{}};"u">typeof IS_REACT_ACT_ENVIRONMENT?t():(0,cC.unstable_scheduleCallback)(cC.unstable_IdlePriority,t)}}function hM(e,t,n){if(!t)return;t.parent=null;let i=e.children.indexOf(t);-1!==i&&e.children.splice(i,1),t.props.attach?c1(e,t):c9(t.object)&&c9(e.object)&&(e.object.remove(t.object),function(e,t){let{internal:n}=e.getState();n.interaction=n.interaction.filter(e=>e!==t),n.initialHits=n.initialHits.filter(e=>e!==t),n.hovered.forEach((e,i)=>{(e.eventObject===t||e.object===t)&&n.hovered.delete(i)}),n.capturedMap.forEach((e,i)=>{he(n.capturedMap,t,e,i)})}(cB(t),t.object));let r=null!==t.props.dispose&&!1!==n;for(let e=t.children.length-1;e>=0;e--){let n=t.children[e];hM(t,n,r)}t.children.length=0,delete t.object.__r3f,r&&"primitive"!==t.type&&"Scene"!==t.object.type&&hS(t.object),void 0===n&&c8(t)}let hT=[],hw=()=>{},hE={},hA=0,hC=(S={isPrimaryRenderer:!1,warnsIfNotActing:!1,supportsMutation:!0,supportsPersistence:!1,supportsHydration:!1,createInstance:function(e,t,n){var i;return hv(e=hf(e)in hd?e:e.replace(hp,""),t),"primitive"===e&&null!=(i=t.object)&&i.__r3f&&delete t.object.__r3f,cK(t.object,n,e,t)},removeChild:hM,appendChild:hx,appendInitialChild:hx,insertBefore:hb,appendChildToContainer(e,t){let n=e.getState().scene.__r3f;t&&n&&hx(n,t)},removeChildFromContainer(e,t){let n=e.getState().scene.__r3f;t&&n&&hM(n,t)},insertInContainerBefore(e,t,n){let i=e.getState().scene.__r3f;t&&n&&i&&hb(i,t,n)},getRootHostContext:()=>hE,getChildHostContext:()=>hE,commitUpdate(e,t,n,i,r){var a,s,o;hv(t,i);let l=!1;if("primitive"===e.type&&n.object!==i.object||(null==(a=i.args)?void 0:a.length)!==(null==(s=n.args)?void 0:s.length)?l=!0:null!=(o=i.args)&&o.some((e,t)=>{var i;return e!==(null==(i=n.args)?void 0:i[t])})&&(l=!0),l)hT.push([e,{...i},r]);else{let t=function(e,t){let n={};for(let i in t)if(!c2.includes(i)&&!cZ.equ(t[i],e.props[i]))for(let e in n[i]=t[i],t)e.startsWith(`${i}-`)&&(n[e]=t[e]);for(let i in e.props){if(c2.includes(i)||t.hasOwnProperty(i))continue;let{root:r,key:a}=c$(e.object,i);if(r.constructor&&0===r.constructor.length){let e=function(e){let t=c3.get(e.constructor);try{t||(t=new e.constructor,c3.set(e.constructor,t))}catch(e){}return t}(r);cZ.und(e)||(n[a]=e[a])}else n[a]=0}return n}(e,i);Object.keys(t).length&&(Object.assign(e.props,t),c6(e.object,t))}(null===r.sibling||(4&r.flags)==0)&&function(){for(let[e]of hT){let t=e.parent;if(t)for(let n of(e.props.attach?c1(t,e):c9(e.object)&&c9(t.object)&&t.object.remove(e.object),e.children))n.props.attach?c1(e,n):c9(n.object)&&c9(e.object)&&e.object.remove(n.object);e.isHidden&&h_(e),e.object.__r3f&&delete e.object.__r3f,"primitive"!==e.type&&hS(e.object)}for(let[i,r,a]of hT){i.props=r;let s=i.parent;if(s){let r=hd[hf(i.type)];i.object=null!=(e=i.props.object)?e:new r(...null!=(t=i.props.args)?t:[]),i.object.__r3f=i;var e,t,n=i.object;for(let e of[a,a.alternate])if(null!==e)if("function"==typeof e.ref){null==e.refCleanup||e.refCleanup();let t=e.ref(n);"function"==typeof t&&(e.refCleanup=t)}else e.ref&&(e.ref.current=n);for(let e of(c6(i.object,i.props),i.props.attach?c0(s,i):c9(i.object)&&c9(s.object)&&s.object.add(i.object),i.children))e.props.attach?c0(i,e):c9(e.object)&&c9(i.object)&&i.object.add(e.object);c8(i)}}hT.length=0}()},finalizeInitialChildren:()=>!1,commitMount(){},getPublicInstance:e=>null==e?void 0:e.object,prepareForCommit:()=>null,preparePortalMount:e=>cK(e.getState().scene,e,"",{}),resetAfterCommit:()=>{},shouldSetTextContent:()=>!1,clearContainer:()=>!1,hideInstance:function(e){if(!e.isHidden){var t;e.props.attach&&null!=(t=e.parent)&&t.object?c1(e.parent,e):c9(e.object)&&(e.object.visible=!1),e.isHidden=!0,c8(e)}},unhideInstance:h_,createTextInstance:hw,hideTextInstance:hw,unhideTextInstance:hw,scheduleTimeout:"function"==typeof setTimeout?setTimeout:void 0,cancelTimeout:"function"==typeof clearTimeout?clearTimeout:void 0,noTimeout:-1,getInstanceFromNode:()=>null,beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},detachDeletedInstance(){},prepareScopeUpdate(){},getInstanceFromScope:()=>null,shouldAttemptEagerTransition:()=>!1,trackSchedulerEvent:()=>{},resolveEventType:()=>null,resolveEventTimeStamp:()=>-1.1,requestPostPaintCallback(){},maySuspendCommit:()=>!1,preloadInstance:()=>!0,suspendInstance(){},waitForCommitToBeReady:()=>null,NotPendingTransition:null,HostTransitionContext:E.createContext(null),setCurrentUpdatePriority(e){hA=e},getCurrentUpdatePriority:()=>hA,resolveUpdatePriority(){var e;if(0!==hA)return hA;switch("u">typeof window&&(null==(e=window.event)?void 0:e.type)){case"click":case"contextmenu":case"dblclick":case"pointercancel":case"pointerdown":case"pointerup":return 2;case"pointermove":case"pointerout":case"pointerover":case"pointerenter":case"pointerleave":case"wheel":return 8;default:return 32}},resetFormInstance(){},rendererPackageName:"@react-three/fiber",rendererVersion:"9.5.0",applyViewTransitionName(e,t,n){},restoreViewTransitionName(e,t){},cancelViewTransitionName(e,t,n){},cancelRootViewTransitionName(e){},restoreRootViewTransitionName(e){},InstanceMeasurement:null,measureInstance:e=>null,wasInstanceInViewport:e=>!0,hasInstanceChanged:(e,t)=>!1,hasInstanceAffectedParent:(e,t)=>!1,suspendOnActiveViewTransition(e,t){},startGestureTransition:()=>null,startViewTransition:()=>null,stopViewTransition(e){},createViewTransitionInstance:e=>null,getCurrentGestureOffset(e){throw Error("startGestureTransition is not yet supported in react-three-fiber.")},cloneMutableInstance:(e,t)=>e,cloneMutableTextInstance:e=>e,cloneRootViewTransitionContainer(e){throw Error("Not implemented.")},removeRootViewTransitionClone(e,t){throw Error("Not implemented.")},createFragmentInstance:e=>null,updateFragmentInstanceFiber(e,t){},commitNewChildToFragmentInstance(e,t){},deleteChildFromFragmentInstance(e,t){},measureClonedInstance:e=>null,maySuspendCommitOnUpdate:(e,t,n)=>!1,maySuspendCommitInSyncRender:(e,t)=>!1,startSuspendingCommit:()=>null,getSuspendedCommitReason:(e,t)=>null},(_=hh(S)).injectIntoDevTools(),_),hR=new Map,hP={objects:"shallow",strict:!1};function hI(e){var t,n;let i,r,a,s,o,l,u,c=hR.get(e),h=null==c?void 0:c.fiber,d=null==c?void 0:c.store;c&&console.warn("R3F.createRoot should only be called once!");let p="function"==typeof reportError?reportError:console.error,f=d||(t=hX,n=hq,o=(s=(a=(0,cT.createWithEqualityFn)((e,i)=>{let r,a=new ef,s=new ef,o=new ef;function l(e=i().camera,t=s,n=i().size){let{width:r,height:u,top:c,left:h}=n,d=r/u;t.isVector3?o.copy(t):o.set(...t);let p=e.getWorldPosition(a).distanceTo(o);if(e&&e.isOrthographicCamera)return{width:r/e.zoom,height:u/e.zoom,top:c,left:h,factor:1,distance:p,aspect:d};{let t=2*Math.tan(e.fov*Math.PI/180/2)*p,n=r/u*t;return{width:n,height:t,top:c,left:h,factor:r/n,distance:p,aspect:d}}}let u=t=>e(e=>({performance:{...e.performance,current:t}})),c=new ed;return{set:e,get:i,gl:null,camera:null,raycaster:null,events:{priority:1,enabled:!0,connected:!1},scene:null,xr:null,invalidate:(e=1)=>t(i(),e),advance:(e,t)=>n(e,t,i()),legacy:!1,linear:!1,flat:!1,controls:null,clock:new sW,pointer:c,mouse:c,frameloop:"always",onPointerMissed:void 0,performance:{current:1,min:.5,max:1,debounce:200,regress:()=>{let e=i();r&&clearTimeout(r),e.performance.current!==e.performance.min&&u(e.performance.min),r=setTimeout(()=>u(i().performance.max),e.performance.debounce)}},size:{width:0,height:0,top:0,left:0},viewport:{initialDpr:0,dpr:0,width:0,height:0,top:0,left:0,aspect:0,distance:0,factor:0,getCurrentViewport:l},setEvents:t=>e(e=>({...e,events:{...e.events,...t}})),setSize:(t,n,r=0,a=0)=>{let o=i().camera,u={width:t,height:n,top:r,left:a};e(e=>({size:u,viewport:{...e.viewport,...l(o,s,u)}}))},setDpr:t=>e(e=>{let n=cq(t);return{viewport:{...e.viewport,dpr:n,initialDpr:e.viewport.initialDpr||n}}}),setFrameloop:(t="always")=>{let n=i().clock;n.stop(),n.elapsedTime=0,"never"!==t&&(n.start(),n.elapsedTime=0),e(()=>({frameloop:t}))},previousRoot:void 0,internal:{interaction:[],hovered:new Map,subscribers:[],initialClick:[0,0],initialHits:[],capturedMap:new Map,lastEvent:E.createRef(),active:!1,frames:0,priority:0,subscribe:(e,t,n)=>{let r=i().internal;return r.priority=r.priority+ +(t>0),r.subscribers.push({ref:e,priority:t,store:n}),r.subscribers=r.subscribers.sort((e,t)=>e.priority-t.priority),()=>{let n=i().internal;null!=n&&n.subscribers&&(n.priority=n.priority-(t>0),n.subscribers=n.subscribers.filter(t=>t.ref!==e))}}}}})).getState()).size,l=s.viewport.dpr,u=s.camera,a.subscribe(()=>{let{camera:e,size:t,viewport:n,gl:i,set:r}=a.getState();if(t.width!==o.width||t.height!==o.height||n.dpr!==l){o=t,l=n.dpr;!e.manual&&(e&&e.isOrthographicCamera?(e.left=-(t.width/2),e.right=t.width/2,e.top=t.height/2,e.bottom=-(t.height/2)):e.aspect=t.width/t.height,e.updateProjectionMatrix());n.dpr>0&&i.setPixelRatio(n.dpr);let r="u">typeof HTMLCanvasElement&&i.domElement instanceof HTMLCanvasElement;i.setSize(t.width,t.height,r)}e!==u&&(u=e,r(t=>({viewport:{...t.viewport,...t.viewport.getCurrentViewport(e)}})))}),a.subscribe(e=>t(e)),a),m=h||hC.createContainer(f,1,null,!1,null,"",p,p,p,null);c||hR.set(e,{fiber:m,store:f});let g=!1,v=null;return{async configure(t={}){var n,a;let s;v=new Promise(e=>s=e);let{gl:o,size:l,scene:u,events:c,onCreated:h,shadows:d=!1,linear:p=!1,flat:m=!1,legacy:_=!1,orthographic:y=!1,frameloop:x="always",dpr:b=[1,2],performance:S,raycaster:M,camera:T,onPointerMissed:w}=t,E=f.getState(),A=E.gl;if(!E.gl){let t={canvas:e,powerPreference:"high-performance",antialias:!0,alpha:!0},n="function"==typeof o?await o(t):o;A=ht(n)?n:new cM({...t,...o}),E.set({gl:A})}let C=E.raycaster;C||E.set({raycaster:C=new op});let{params:R,...P}=M||{};if(cZ.equ(P,C,hP)||c6(C,{...P}),cZ.equ(R,C.params,hP)||c6(C,{params:{...C.params,...R}}),!E.camera||E.camera===r&&!cZ.equ(r,T,hP)){r=T;let e=null==T?void 0:T.isCamera,t=e?T:y?new sx(0,0,0,0,.1,1e3):new nO(75,0,.1,1e3);!e&&(t.position.z=5,T&&(c6(t,T),!t.manual&&("aspect"in T||"left"in T||"right"in T||"bottom"in T||"top"in T)&&(t.manual=!0,t.updateProjectionMatrix())),E.camera||null!=T&&T.rotation||t.lookAt(0,0,0)),E.set({camera:t}),C.camera=t}if(!E.scene){let e;null!=u&&u.isScene?cK(e=u,f,"",{}):(cK(e=new nj,f,"",{}),u&&c6(e,u)),E.set({scene:e})}c&&!E.events.handlers&&E.set({events:c(f)});let N=function(e,t){if(!t&&"u">typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement&&e.parentElement){let{width:t,height:n,top:i,left:r}=e.parentElement.getBoundingClientRect();return{width:t,height:n,top:i,left:r}}return!t&&"u">typeof OffscreenCanvas&&e instanceof OffscreenCanvas?{width:e.width,height:e.height,top:0,left:0}:{width:0,height:0,top:0,left:0,...t}}(e,l);if(cZ.equ(N,E.size,hP)||E.setSize(N.width,N.height,N.top,N.left),b&&E.viewport.dpr!==cq(b)&&E.setDpr(b),E.frameloop!==x&&E.setFrameloop(x),E.onPointerMissed||E.set({onPointerMissed:w}),S&&!cZ.equ(S,E.performance,hP)&&E.set(e=>({performance:{...e.performance,...S}})),!E.xr){let e=(e,t)=>{let n=f.getState();"never"!==n.frameloop&&hq(e,!0,n,t)},t=()=>{let t=f.getState();t.gl.xr.enabled=t.gl.xr.isPresenting,t.gl.xr.setAnimationLoop(t.gl.xr.isPresenting?e:null),t.gl.xr.isPresenting||hX(t)},i={connect(){let e=f.getState().gl;e.xr.addEventListener("sessionstart",t),e.xr.addEventListener("sessionend",t)},disconnect(){let e=f.getState().gl;e.xr.removeEventListener("sessionstart",t),e.xr.removeEventListener("sessionend",t)}};"function"==typeof(null==(n=A.xr)?void 0:n.addEventListener)&&i.connect(),E.set({xr:i})}if(A.shadowMap){let e=A.shadowMap.enabled,t=A.shadowMap.type;A.shadowMap.enabled=!!d,cZ.boo(d)?A.shadowMap.type=2:cZ.str(d)?A.shadowMap.type=null!=(a=({basic:0,percentage:1,soft:2,variance:3})[d])?a:2:cZ.obj(d)&&Object.assign(A.shadowMap,d),(e!==A.shadowMap.enabled||t!==A.shadowMap.type)&&(A.shadowMap.needsUpdate=!0)}return eb.enabled=!_,g||(A.outputColorSpace=p?L:I,A.toneMapping=4*!m),E.legacy!==_&&E.set(()=>({legacy:_})),E.linear!==p&&E.set(()=>({linear:p})),E.flat!==m&&E.set(()=>({flat:m})),!o||cZ.fun(o)||ht(o)||cZ.equ(o,A,hP)||c6(A,o),i=h,g=!0,s(),this},render(t){return g||v||this.configure(),v.then(()=>{hC.updateContainer((0,cR.jsx)(hL,{store:f,children:t,onCreated:i,rootElement:e}),m,null,()=>void 0)}),f},unmount(){hN(e)}}}function hL({store:e,children:t,onCreated:n,rootElement:i}){return cH(()=>{let t=e.getState();t.set(e=>({internal:{...e.internal,active:!0}})),n&&n(t),e.getState().events.connected||null==t.events.connect||t.events.connect(i)},[]),(0,cR.jsx)(hn.Provider,{value:e,children:t})}function hN(e,t){let n=hR.get(e),i=null==n?void 0:n.fiber;if(i){let r=null==n?void 0:n.store.getState();r&&(r.internal.active=!1),hC.updateContainer(null,i,null,()=>{r&&setTimeout(()=>{try{null==r.events.disconnect||r.events.disconnect(),null==(n=r.gl)||null==(i=n.renderLists)||null==i.dispose||i.dispose(),null==(a=r.gl)||null==a.forceContextLoss||a.forceContextLoss(),null!=(s=r.gl)&&s.xr&&r.xr.disconnect();var n,i,a,s,o=r.scene;for(let e in"Scene"!==o.type&&(null==o.dispose||o.dispose()),o){let t=o[e];(null==t?void 0:t.type)!=="Scene"&&(null==t||null==t.dispose||t.dispose())}hR.delete(e),t&&t(e)}catch(e){}},500)})}}function hU(e,t){let n={callback:e};return t.add(n),()=>void t.delete(n)}let hD=new Set,hO=new Set,hF=new Set,hz=e=>hU(e,hD),hB=e=>hU(e,hO);function hk(e,t){if(e.size)for(let{callback:n}of e.values())n(t)}function hV(e,t){switch(e){case"before":return hk(hD,t);case"after":return hk(hO,t);case"tail":return hk(hF,t)}}function hH(e,t,n){let i=t.clock.getDelta();"never"===t.frameloop&&"number"==typeof e&&(i=e-t.clock.elapsedTime,t.clock.oldTime=t.clock.elapsedTime,t.clock.elapsedTime=e),s=t.internal.subscribers;for(let e=0;e0)&&!(null!=(t=c.gl.xr)&&t.isPresenting)&&(l+=hH(e,c))}if(hW=!1,hV("after",e),0===l)return hV("tail",e),hG=!1,cancelAnimationFrame(u)}function hX(e,t=1){var n;if(!e)return hR.forEach(e=>hX(e.store.getState(),t));(null==(n=e.gl.xr)||!n.isPresenting)&&e.internal.active&&"never"!==e.frameloop&&(t>1?e.internal.frames=Math.min(60,e.internal.frames+t):hW?e.internal.frames=2:e.internal.frames=1,hG||(hG=!0,requestAnimationFrame(hj)))}function hq(e,t=!0,n,i){if(t&&hV("before",e),n)hH(e,n,i);else for(let t of hR.values())hH(e,t.store.getState());t&&hV("after",e)}let hY={onClick:["click",!1],onContextMenu:["contextmenu",!1],onDoubleClick:["dblclick",!1],onWheel:["wheel",!0],onPointerDown:["pointerdown",!0],onPointerUp:["pointerup",!0],onPointerLeave:["pointerleave",!0],onPointerMove:["pointermove",!0],onPointerCancel:["pointercancel",!0],onLostPointerCapture:["lostpointercapture",!0]};function hZ(e){let{handlePointer:t}=function(e){function t(e){return e.filter(e=>["Move","Over","Enter","Out","Leave"].some(t=>{var n;return null==(n=e.__r3f)?void 0:n.handlers["onPointer"+t]}))}function n(t){let{internal:n}=e.getState();for(let e of n.hovered.values())if(!t.length||!t.find(t=>t.object===e.object&&t.index===e.index&&t.instanceId===e.instanceId)){let i=e.eventObject.__r3f;if(n.hovered.delete(c7(e)),null!=i&&i.eventCount){let n=i.handlers,r={...e,intersections:t};null==n.onPointerOut||n.onPointerOut(r),null==n.onPointerLeave||n.onPointerLeave(r)}}}function i(e,t){for(let n=0;nn([]);case"onLostPointerCapture":return t=>{let{internal:i}=e.getState();"pointerId"in t&&i.capturedMap.has(t.pointerId)&&requestAnimationFrame(()=>{i.capturedMap.has(t.pointerId)&&(i.capturedMap.delete(t.pointerId),n([]))})}}return function(a){let{onPointerMissed:s,internal:o}=e.getState();o.lastEvent.current=a;let l="onPointerMove"===r,u="onClick"===r||"onContextMenu"===r||"onDoubleClick"===r,c=function(t,n){let i=e.getState(),r=new Set,a=[],s=n?n(i.internal.interaction):i.internal.interaction;for(let e=0;e{let n=cY(e.object),i=cY(t.object);return n&&i&&i.events.priority-n.events.priority||e.distance-t.distance}).filter(e=>{let t=c7(e);return!r.has(t)&&(r.add(t),!0)});for(let e of(i.events.filter&&(o=i.events.filter(o,i)),o)){let t=e.object;for(;t;){var l;null!=(l=t.__r3f)&&l.eventCount&&a.push({...e,eventObject:t}),t=t.parent}}if("pointerId"in t&&i.internal.capturedMap.has(t.pointerId))for(let e of i.internal.capturedMap.get(t.pointerId).values())r.has(c7(e.intersection))||a.push(e.intersection);return a}(a,l?t:void 0),h=u?function(t){let{internal:n}=e.getState(),i=t.offsetX-n.initialClick[0],r=t.offsetY-n.initialClick[1];return Math.round(Math.sqrt(i*i+r*r))}(a):0;"onPointerDown"===r&&(o.initialClick=[a.offsetX,a.offsetY],o.initialHits=c.map(e=>e.eventObject)),u&&!c.length&&h<=2&&(i(a,o.interaction),s&&s(a)),l&&n(c),!function(e,t,i,r){if(e.length){let a={stopped:!1};for(let s of e){let o=cY(s.object);if(o||s.object.traverseAncestors(e=>{let t=cY(e);if(t)return o=t,!1}),o){let{raycaster:l,pointer:u,camera:c,internal:h}=o,d=new ef(u.x,u.y,0).unproject(c),p=e=>{var t,n;return null!=(t=null==(n=h.capturedMap.get(e))?void 0:n.has(s.eventObject))&&t},f=e=>{let n={intersection:s,target:t.target};h.capturedMap.has(e)?h.capturedMap.get(e).set(s.eventObject,n):h.capturedMap.set(e,new Map([[s.eventObject,n]])),t.target.setPointerCapture(e)},m=e=>{let t=h.capturedMap.get(e);t&&he(h.capturedMap,s.eventObject,t,e)},g={};for(let e in t){let n=t[e];"function"!=typeof n&&(g[e]=n)}let v={...s,...g,pointer:u,intersections:e,stopped:a.stopped,delta:i,unprojectedPoint:d,ray:l.ray,camera:c,stopPropagation(){let i="pointerId"in t&&h.capturedMap.get(t.pointerId);(!i||i.has(s.eventObject))&&(v.stopped=a.stopped=!0,h.hovered.size&&Array.from(h.hovered.values()).find(e=>e.eventObject===s.eventObject)&&n([...e.slice(0,e.indexOf(s)),s]))},target:{hasPointerCapture:p,setPointerCapture:f,releasePointerCapture:m},currentTarget:{hasPointerCapture:p,setPointerCapture:f,releasePointerCapture:m},nativeEvent:t};if(r(v),!0===a.stopped)break}}}}(c,a,h,function(e){let t=e.eventObject,n=t.__r3f;if(!(null!=n&&n.eventCount))return;let s=n.handlers;if(l){if(s.onPointerOver||s.onPointerEnter||s.onPointerOut||s.onPointerLeave){let t=c7(e),n=o.hovered.get(t);n?n.stopped&&e.stopPropagation():(o.hovered.set(t,e),null==s.onPointerOver||s.onPointerOver(e),null==s.onPointerEnter||s.onPointerEnter(e))}null==s.onPointerMove||s.onPointerMove(e)}else{let n=s[r];n?(!u||o.initialHits.includes(t))&&(i(a,o.interaction.filter(e=>!o.initialHits.includes(e))),n(e)):u&&o.initialHits.includes(t)&&i(a,o.interaction.filter(e=>!o.initialHits.includes(e)))}})}}}}(e);return{priority:1,enabled:!0,compute(e,t,n){t.pointer.set(e.offsetX/t.size.width*2-1,-(2*(e.offsetY/t.size.height))+1),t.raycaster.setFromCamera(t.pointer,t.camera)},connected:void 0,handlers:Object.keys(hY).reduce((e,n)=>({...e,[n]:t(n)}),{}),update:()=>{var t;let{events:n,internal:i}=e.getState();null!=(t=i.lastEvent)&&t.current&&n.handlers&&n.handlers.onPointerMove(i.lastEvent.current)},connect:t=>{let{set:n,events:i}=e.getState();if(null==i.disconnect||i.disconnect(),n(e=>({events:{...e.events,connected:t}})),i.handlers)for(let e in i.handlers){let n=i.handlers[e],[r,a]=hY[e];t.addEventListener(r,n,{passive:a})}},disconnect:()=>{let{set:t,events:n}=e.getState();if(n.connected){if(n.handlers)for(let e in n.handlers){let t=n.handlers[e],[i]=hY[e];n.connected.removeEventListener(i,t)}t(e=>({events:{...e.events,connected:void 0}}))}}}}e.s(["B",()=>cj,"C",()=>hr,"D",()=>ha,"E",()=>cX,"G",()=>hl,"a",()=>cG,"b",()=>cH,"c",()=>hI,"d",()=>hN,"e",()=>hg,"f",()=>hZ,"i",()=>ck,"j",()=>hz,"k",()=>hB,"u",()=>cW],40859)},71753,e=>{"use strict";var t=e.i(40859);e.s(["useFrame",()=>t.D])},15080,e=>{"use strict";var t=e.i(40859);e.s(["useThree",()=>t.C])},79123,e=>{"use strict";var t=e.i(43476),n=e.i(71645);let i=(0,n.createContext)(null),r=(0,n.createContext)(null),a=(0,n.createContext)(null);function s(){return(0,n.useContext)(i)}function o(){return(0,n.useContext)(r)}function l(){return(0,n.useContext)(a)}function u({children:e,fogEnabledOverride:s,onClearFogEnabledOverride:o}){let[l,u]=(0,n.useState)(!0),[c,h]=(0,n.useState)(!1),[d,p]=(0,n.useState)(1),[f,m]=(0,n.useState)(90),[g,v]=(0,n.useState)(!1),[_,y]=(0,n.useState)(!0),[x,b]=(0,n.useState)(!1),[S,M]=(0,n.useState)("moveLookStick"),[T,w]=(0,n.useState)("MapGenius"),E=(0,n.useCallback)(e=>{u(e),o()},[o]),A=(0,n.useMemo)(()=>({fogEnabled:s??l,setFogEnabled:E,highQualityFog:c,setHighQualityFog:h,fov:f,setFov:m,audioEnabled:g,setAudioEnabled:v,animationEnabled:_,setAnimationEnabled:y,warriorName:T,setWarriorName:w}),[l,s,E,c,f,g,_,T]),C=(0,n.useMemo)(()=>({debugMode:x,setDebugMode:b}),[x,b]),R=(0,n.useMemo)(()=>({speedMultiplier:d,setSpeedMultiplier:p,touchMode:S,setTouchMode:M}),[d,p,S,M]);(0,n.useLayoutEffect)(()=>{let e={};try{e=JSON.parse(localStorage.getItem("settings"))||{}}catch(e){}null!=e.debugMode&&b(e.debugMode),null!=e.audioEnabled&&v(e.audioEnabled),null!=e.animationEnabled&&y(e.animationEnabled),null!=e.fogEnabled&&u(e.fogEnabled),null!=e.highQualityFog&&h(e.highQualityFog),null!=e.speedMultiplier&&p(e.speedMultiplier),null!=e.fov&&m(e.fov),null!=e.touchMode&&M(e.touchMode),null!=e.warriorName&&w(e.warriorName)},[]);let P=(0,n.useRef)(null);return(0,n.useEffect)(()=>(P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{try{localStorage.setItem("settings",JSON.stringify({fogEnabled:l,highQualityFog:c,speedMultiplier:d,fov:f,audioEnabled:g,animationEnabled:_,debugMode:x,touchMode:S,warriorName:T}))}catch(e){}},500),()=>{P.current&&clearTimeout(P.current)}),[l,c,d,f,g,_,x,S,T]),(0,t.jsx)(i.Provider,{value:A,children:(0,t.jsx)(r.Provider,{value:C,children:(0,t.jsx)(a.Provider,{value:R,children:e})})})}e.s(["SettingsProvider",()=>u,"useControls",()=>l,"useDebug",()=>o,"useSettings",()=>s])}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/12261e943ff623d2.js b/docs/_next/static/chunks/82a44da545bac352.js similarity index 99% rename from docs/_next/static/chunks/12261e943ff623d2.js rename to docs/_next/static/chunks/82a44da545bac352.js index cce59bb8..557b25ea 100644 --- a/docs/_next/static/chunks/12261e943ff623d2.js +++ b/docs/_next/static/chunks/82a44da545bac352.js @@ -394,4 +394,4 @@ Error generating stack: `+e.message+` `+r.join(" > ")+` No matching component was found for: - `+e.join(" > ")}return null},rt.getPublicRootInstance=function(e){if(!(e=e.current).child)return null;switch(e.child.tag){case 27:case 5:return rA(e.child.stateNode);default:return e.child.stateNode}},rt.injectIntoDevTools=function(){var e={bundleType:0,version:rT,rendererPackageName:rw,currentDispatcherRef:rM,reconcilerVersion:"19.2.0"};if(null!==rE&&(e.rendererConfig=rE),typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")e=!1;else{var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)e=!0;else{try{sG=t.inject(e),sW=t}catch{}e=!!t.checkDCE}}return e},rt.isAlreadyRendering=function(){return(6&lm)!=0},rt.observeVisibleRects=function(e,t,n,r){if(!r7)throw Error(i(363));var a=as(e=im(e,t),n,r).disconnect;return{disconnect:function(){a()}}},rt.shouldError=function(){return null},rt.shouldSuspend=function(){return!1},rt.startHostTransition=function(e,t,r,a){if(5!==e.tag)throw Error(i(476));var s=tW(e).queue;tG(e,s,t,r4,null===r?n:function(){var t=tW(e);return null===t.next&&(t=e.alternate.memoizedState),tK(e,t.next.queue,{},ig()),r(a)})},rt.updateContainer=function(e,t,n,i){var r=t.current,a=ig();return i9(r,a,e,t,n,i),a},rt.updateContainerSync=function(e,t,n,i){return i9(t.current,2,e,t,n,i),2},rt},hc.exports.default=hc.exports,Object.defineProperty(hc.exports,"__esModule",{value:!0})),hu.exports=hc.exports),(b=hu.exports)&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default"))?b.default:b,hd={},hp=/^three(?=[A-Z])/,hf=e=>`${e[0].toUpperCase()}${e.slice(1)}`,hm=0;function hg(e){if("function"==typeof e){let t=`${hm++}`;return hd[t]=e,t}Object.assign(hd,e)}function hv(e,t){let n=hf(e),i=hd[n];if("primitive"!==e&&!i)throw Error(`R3F: ${n} is not part of the THREE namespace! Did you forget to extend? See: https://docs.pmnd.rs/react-three-fiber/api/objects#using-3rd-party-objects-declaratively`);if("primitive"===e&&!t.object)throw Error("R3F: Primitives without 'object' are invalid!");if(void 0!==t.args&&!Array.isArray(t.args))throw Error("R3F: The args prop must be an array!")}function h_(e){if(e.isHidden){var t;e.props.attach&&null!=(t=e.parent)&&t.object?c0(e.parent,e):c9(e.object)&&!1!==e.props.visible&&(e.object.visible=!0),e.isHidden=!1,c8(e)}}function hy(e,t,n){let i=t.root.getState();if(e.parent||e.object===i.scene){if(!t.object){var r,a;let e=hd[hf(t.type)];t.object=null!=(r=t.props.object)?r:new e(...null!=(a=t.props.args)?a:[]),t.object.__r3f=t}if(c6(t.object,t.props),t.props.attach)c0(e,t);else if(c9(t.object)&&c9(e.object)){let i=e.object.children.indexOf(null==n?void 0:n.object);if(n&&-1!==i){let n=e.object.children.indexOf(t.object);-1!==n?(e.object.children.splice(n,1),e.object.children.splice(n{try{e.dispose()}catch{}};"u">typeof IS_REACT_ACT_ENVIRONMENT?t():(0,cC.unstable_scheduleCallback)(cC.unstable_IdlePriority,t)}}function hM(e,t,n){if(!t)return;t.parent=null;let i=e.children.indexOf(t);-1!==i&&e.children.splice(i,1),t.props.attach?c1(e,t):c9(t.object)&&c9(e.object)&&(e.object.remove(t.object),function(e,t){let{internal:n}=e.getState();n.interaction=n.interaction.filter(e=>e!==t),n.initialHits=n.initialHits.filter(e=>e!==t),n.hovered.forEach((e,i)=>{(e.eventObject===t||e.object===t)&&n.hovered.delete(i)}),n.capturedMap.forEach((e,i)=>{he(n.capturedMap,t,e,i)})}(cB(t),t.object));let r=null!==t.props.dispose&&!1!==n;for(let e=t.children.length-1;e>=0;e--){let n=t.children[e];hM(t,n,r)}t.children.length=0,delete t.object.__r3f,r&&"primitive"!==t.type&&"Scene"!==t.object.type&&hS(t.object),void 0===n&&c8(t)}let hT=[],hw=()=>{},hE={},hA=0,hC=(S={isPrimaryRenderer:!1,warnsIfNotActing:!1,supportsMutation:!0,supportsPersistence:!1,supportsHydration:!1,createInstance:function(e,t,n){var i;return hv(e=hf(e)in hd?e:e.replace(hp,""),t),"primitive"===e&&null!=(i=t.object)&&i.__r3f&&delete t.object.__r3f,cK(t.object,n,e,t)},removeChild:hM,appendChild:hx,appendInitialChild:hx,insertBefore:hb,appendChildToContainer(e,t){let n=e.getState().scene.__r3f;t&&n&&hx(n,t)},removeChildFromContainer(e,t){let n=e.getState().scene.__r3f;t&&n&&hM(n,t)},insertInContainerBefore(e,t,n){let i=e.getState().scene.__r3f;t&&n&&i&&hb(i,t,n)},getRootHostContext:()=>hE,getChildHostContext:()=>hE,commitUpdate(e,t,n,i,r){var a,s,o;hv(t,i);let l=!1;if("primitive"===e.type&&n.object!==i.object||(null==(a=i.args)?void 0:a.length)!==(null==(s=n.args)?void 0:s.length)?l=!0:null!=(o=i.args)&&o.some((e,t)=>{var i;return e!==(null==(i=n.args)?void 0:i[t])})&&(l=!0),l)hT.push([e,{...i},r]);else{let t=function(e,t){let n={};for(let i in t)if(!c2.includes(i)&&!cZ.equ(t[i],e.props[i]))for(let e in n[i]=t[i],t)e.startsWith(`${i}-`)&&(n[e]=t[e]);for(let i in e.props){if(c2.includes(i)||t.hasOwnProperty(i))continue;let{root:r,key:a}=c$(e.object,i);if(r.constructor&&0===r.constructor.length){let e=function(e){let t=c3.get(e.constructor);try{t||(t=new e.constructor,c3.set(e.constructor,t))}catch(e){}return t}(r);cZ.und(e)||(n[a]=e[a])}else n[a]=0}return n}(e,i);Object.keys(t).length&&(Object.assign(e.props,t),c6(e.object,t))}(null===r.sibling||(4&r.flags)==0)&&function(){for(let[e]of hT){let t=e.parent;if(t)for(let n of(e.props.attach?c1(t,e):c9(e.object)&&c9(t.object)&&t.object.remove(e.object),e.children))n.props.attach?c1(e,n):c9(n.object)&&c9(e.object)&&e.object.remove(n.object);e.isHidden&&h_(e),e.object.__r3f&&delete e.object.__r3f,"primitive"!==e.type&&hS(e.object)}for(let[i,r,a]of hT){i.props=r;let s=i.parent;if(s){let r=hd[hf(i.type)];i.object=null!=(e=i.props.object)?e:new r(...null!=(t=i.props.args)?t:[]),i.object.__r3f=i;var e,t,n=i.object;for(let e of[a,a.alternate])if(null!==e)if("function"==typeof e.ref){null==e.refCleanup||e.refCleanup();let t=e.ref(n);"function"==typeof t&&(e.refCleanup=t)}else e.ref&&(e.ref.current=n);for(let e of(c6(i.object,i.props),i.props.attach?c0(s,i):c9(i.object)&&c9(s.object)&&s.object.add(i.object),i.children))e.props.attach?c0(i,e):c9(e.object)&&c9(i.object)&&i.object.add(e.object);c8(i)}}hT.length=0}()},finalizeInitialChildren:()=>!1,commitMount(){},getPublicInstance:e=>null==e?void 0:e.object,prepareForCommit:()=>null,preparePortalMount:e=>cK(e.getState().scene,e,"",{}),resetAfterCommit:()=>{},shouldSetTextContent:()=>!1,clearContainer:()=>!1,hideInstance:function(e){if(!e.isHidden){var t;e.props.attach&&null!=(t=e.parent)&&t.object?c1(e.parent,e):c9(e.object)&&(e.object.visible=!1),e.isHidden=!0,c8(e)}},unhideInstance:h_,createTextInstance:hw,hideTextInstance:hw,unhideTextInstance:hw,scheduleTimeout:"function"==typeof setTimeout?setTimeout:void 0,cancelTimeout:"function"==typeof clearTimeout?clearTimeout:void 0,noTimeout:-1,getInstanceFromNode:()=>null,beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},detachDeletedInstance(){},prepareScopeUpdate(){},getInstanceFromScope:()=>null,shouldAttemptEagerTransition:()=>!1,trackSchedulerEvent:()=>{},resolveEventType:()=>null,resolveEventTimeStamp:()=>-1.1,requestPostPaintCallback(){},maySuspendCommit:()=>!1,preloadInstance:()=>!0,suspendInstance(){},waitForCommitToBeReady:()=>null,NotPendingTransition:null,HostTransitionContext:E.createContext(null),setCurrentUpdatePriority(e){hA=e},getCurrentUpdatePriority:()=>hA,resolveUpdatePriority(){var e;if(0!==hA)return hA;switch("u">typeof window&&(null==(e=window.event)?void 0:e.type)){case"click":case"contextmenu":case"dblclick":case"pointercancel":case"pointerdown":case"pointerup":return 2;case"pointermove":case"pointerout":case"pointerover":case"pointerenter":case"pointerleave":case"wheel":return 8;default:return 32}},resetFormInstance(){},rendererPackageName:"@react-three/fiber",rendererVersion:"9.5.0",applyViewTransitionName(e,t,n){},restoreViewTransitionName(e,t){},cancelViewTransitionName(e,t,n){},cancelRootViewTransitionName(e){},restoreRootViewTransitionName(e){},InstanceMeasurement:null,measureInstance:e=>null,wasInstanceInViewport:e=>!0,hasInstanceChanged:(e,t)=>!1,hasInstanceAffectedParent:(e,t)=>!1,suspendOnActiveViewTransition(e,t){},startGestureTransition:()=>null,startViewTransition:()=>null,stopViewTransition(e){},createViewTransitionInstance:e=>null,getCurrentGestureOffset(e){throw Error("startGestureTransition is not yet supported in react-three-fiber.")},cloneMutableInstance:(e,t)=>e,cloneMutableTextInstance:e=>e,cloneRootViewTransitionContainer(e){throw Error("Not implemented.")},removeRootViewTransitionClone(e,t){throw Error("Not implemented.")},createFragmentInstance:e=>null,updateFragmentInstanceFiber(e,t){},commitNewChildToFragmentInstance(e,t){},deleteChildFromFragmentInstance(e,t){},measureClonedInstance:e=>null,maySuspendCommitOnUpdate:(e,t,n)=>!1,maySuspendCommitInSyncRender:(e,t)=>!1,startSuspendingCommit:()=>null,getSuspendedCommitReason:(e,t)=>null},(_=hh(S)).injectIntoDevTools(),_),hR=new Map,hP={objects:"shallow",strict:!1};function hI(e){var t,n;let i,r,a,s,o,l,u,c=hR.get(e),h=null==c?void 0:c.fiber,d=null==c?void 0:c.store;c&&console.warn("R3F.createRoot should only be called once!");let p="function"==typeof reportError?reportError:console.error,f=d||(t=hX,n=hq,o=(s=(a=(0,cT.createWithEqualityFn)((e,i)=>{let r,a=new ef,s=new ef,o=new ef;function l(e=i().camera,t=s,n=i().size){let{width:r,height:u,top:c,left:h}=n,d=r/u;t.isVector3?o.copy(t):o.set(...t);let p=e.getWorldPosition(a).distanceTo(o);if(e&&e.isOrthographicCamera)return{width:r/e.zoom,height:u/e.zoom,top:c,left:h,factor:1,distance:p,aspect:d};{let t=2*Math.tan(e.fov*Math.PI/180/2)*p,n=r/u*t;return{width:n,height:t,top:c,left:h,factor:r/n,distance:p,aspect:d}}}let u=t=>e(e=>({performance:{...e.performance,current:t}})),c=new ed;return{set:e,get:i,gl:null,camera:null,raycaster:null,events:{priority:1,enabled:!0,connected:!1},scene:null,xr:null,invalidate:(e=1)=>t(i(),e),advance:(e,t)=>n(e,t,i()),legacy:!1,linear:!1,flat:!1,controls:null,clock:new sW,pointer:c,mouse:c,frameloop:"always",onPointerMissed:void 0,performance:{current:1,min:.5,max:1,debounce:200,regress:()=>{let e=i();r&&clearTimeout(r),e.performance.current!==e.performance.min&&u(e.performance.min),r=setTimeout(()=>u(i().performance.max),e.performance.debounce)}},size:{width:0,height:0,top:0,left:0},viewport:{initialDpr:0,dpr:0,width:0,height:0,top:0,left:0,aspect:0,distance:0,factor:0,getCurrentViewport:l},setEvents:t=>e(e=>({...e,events:{...e.events,...t}})),setSize:(t,n,r=0,a=0)=>{let o=i().camera,u={width:t,height:n,top:r,left:a};e(e=>({size:u,viewport:{...e.viewport,...l(o,s,u)}}))},setDpr:t=>e(e=>{let n=cq(t);return{viewport:{...e.viewport,dpr:n,initialDpr:e.viewport.initialDpr||n}}}),setFrameloop:(t="always")=>{let n=i().clock;n.stop(),n.elapsedTime=0,"never"!==t&&(n.start(),n.elapsedTime=0),e(()=>({frameloop:t}))},previousRoot:void 0,internal:{interaction:[],hovered:new Map,subscribers:[],initialClick:[0,0],initialHits:[],capturedMap:new Map,lastEvent:E.createRef(),active:!1,frames:0,priority:0,subscribe:(e,t,n)=>{let r=i().internal;return r.priority=r.priority+ +(t>0),r.subscribers.push({ref:e,priority:t,store:n}),r.subscribers=r.subscribers.sort((e,t)=>e.priority-t.priority),()=>{let n=i().internal;null!=n&&n.subscribers&&(n.priority=n.priority-(t>0),n.subscribers=n.subscribers.filter(t=>t.ref!==e))}}}}})).getState()).size,l=s.viewport.dpr,u=s.camera,a.subscribe(()=>{let{camera:e,size:t,viewport:n,gl:i,set:r}=a.getState();if(t.width!==o.width||t.height!==o.height||n.dpr!==l){o=t,l=n.dpr;!e.manual&&(e&&e.isOrthographicCamera?(e.left=-(t.width/2),e.right=t.width/2,e.top=t.height/2,e.bottom=-(t.height/2)):e.aspect=t.width/t.height,e.updateProjectionMatrix());n.dpr>0&&i.setPixelRatio(n.dpr);let r="u">typeof HTMLCanvasElement&&i.domElement instanceof HTMLCanvasElement;i.setSize(t.width,t.height,r)}e!==u&&(u=e,r(t=>({viewport:{...t.viewport,...t.viewport.getCurrentViewport(e)}})))}),a.subscribe(e=>t(e)),a),m=h||hC.createContainer(f,1,null,!1,null,"",p,p,p,null);c||hR.set(e,{fiber:m,store:f});let g=!1,v=null;return{async configure(t={}){var n,a;let s;v=new Promise(e=>s=e);let{gl:o,size:l,scene:u,events:c,onCreated:h,shadows:d=!1,linear:p=!1,flat:m=!1,legacy:_=!1,orthographic:y=!1,frameloop:x="always",dpr:b=[1,2],performance:S,raycaster:M,camera:T,onPointerMissed:w}=t,E=f.getState(),A=E.gl;if(!E.gl){let t={canvas:e,powerPreference:"high-performance",antialias:!0,alpha:!0},n="function"==typeof o?await o(t):o;A=ht(n)?n:new cM({...t,...o}),E.set({gl:A})}let C=E.raycaster;C||E.set({raycaster:C=new op});let{params:R,...P}=M||{};if(cZ.equ(P,C,hP)||c6(C,{...P}),cZ.equ(R,C.params,hP)||c6(C,{params:{...C.params,...R}}),!E.camera||E.camera===r&&!cZ.equ(r,T,hP)){r=T;let e=null==T?void 0:T.isCamera,t=e?T:y?new sx(0,0,0,0,.1,1e3):new nO(75,0,.1,1e3);!e&&(t.position.z=5,T&&(c6(t,T),!t.manual&&("aspect"in T||"left"in T||"right"in T||"bottom"in T||"top"in T)&&(t.manual=!0,t.updateProjectionMatrix())),E.camera||null!=T&&T.rotation||t.lookAt(0,0,0)),E.set({camera:t}),C.camera=t}if(!E.scene){let e;null!=u&&u.isScene?cK(e=u,f,"",{}):(cK(e=new nj,f,"",{}),u&&c6(e,u)),E.set({scene:e})}c&&!E.events.handlers&&E.set({events:c(f)});let N=function(e,t){if(!t&&"u">typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement&&e.parentElement){let{width:t,height:n,top:i,left:r}=e.parentElement.getBoundingClientRect();return{width:t,height:n,top:i,left:r}}return!t&&"u">typeof OffscreenCanvas&&e instanceof OffscreenCanvas?{width:e.width,height:e.height,top:0,left:0}:{width:0,height:0,top:0,left:0,...t}}(e,l);if(cZ.equ(N,E.size,hP)||E.setSize(N.width,N.height,N.top,N.left),b&&E.viewport.dpr!==cq(b)&&E.setDpr(b),E.frameloop!==x&&E.setFrameloop(x),E.onPointerMissed||E.set({onPointerMissed:w}),S&&!cZ.equ(S,E.performance,hP)&&E.set(e=>({performance:{...e.performance,...S}})),!E.xr){let e=(e,t)=>{let n=f.getState();"never"!==n.frameloop&&hq(e,!0,n,t)},t=()=>{let t=f.getState();t.gl.xr.enabled=t.gl.xr.isPresenting,t.gl.xr.setAnimationLoop(t.gl.xr.isPresenting?e:null),t.gl.xr.isPresenting||hX(t)},i={connect(){let e=f.getState().gl;e.xr.addEventListener("sessionstart",t),e.xr.addEventListener("sessionend",t)},disconnect(){let e=f.getState().gl;e.xr.removeEventListener("sessionstart",t),e.xr.removeEventListener("sessionend",t)}};"function"==typeof(null==(n=A.xr)?void 0:n.addEventListener)&&i.connect(),E.set({xr:i})}if(A.shadowMap){let e=A.shadowMap.enabled,t=A.shadowMap.type;A.shadowMap.enabled=!!d,cZ.boo(d)?A.shadowMap.type=2:cZ.str(d)?A.shadowMap.type=null!=(a=({basic:0,percentage:1,soft:2,variance:3})[d])?a:2:cZ.obj(d)&&Object.assign(A.shadowMap,d),(e!==A.shadowMap.enabled||t!==A.shadowMap.type)&&(A.shadowMap.needsUpdate=!0)}return eb.enabled=!_,g||(A.outputColorSpace=p?L:I,A.toneMapping=4*!m),E.legacy!==_&&E.set(()=>({legacy:_})),E.linear!==p&&E.set(()=>({linear:p})),E.flat!==m&&E.set(()=>({flat:m})),!o||cZ.fun(o)||ht(o)||cZ.equ(o,A,hP)||c6(A,o),i=h,g=!0,s(),this},render(t){return g||v||this.configure(),v.then(()=>{hC.updateContainer((0,cR.jsx)(hL,{store:f,children:t,onCreated:i,rootElement:e}),m,null,()=>void 0)}),f},unmount(){hN(e)}}}function hL({store:e,children:t,onCreated:n,rootElement:i}){return cH(()=>{let t=e.getState();t.set(e=>({internal:{...e.internal,active:!0}})),n&&n(t),e.getState().events.connected||null==t.events.connect||t.events.connect(i)},[]),(0,cR.jsx)(hn.Provider,{value:e,children:t})}function hN(e,t){let n=hR.get(e),i=null==n?void 0:n.fiber;if(i){let r=null==n?void 0:n.store.getState();r&&(r.internal.active=!1),hC.updateContainer(null,i,null,()=>{r&&setTimeout(()=>{try{null==r.events.disconnect||r.events.disconnect(),null==(n=r.gl)||null==(i=n.renderLists)||null==i.dispose||i.dispose(),null==(a=r.gl)||null==a.forceContextLoss||a.forceContextLoss(),null!=(s=r.gl)&&s.xr&&r.xr.disconnect();var n,i,a,s,o=r.scene;for(let e in"Scene"!==o.type&&(null==o.dispose||o.dispose()),o){let t=o[e];(null==t?void 0:t.type)!=="Scene"&&(null==t||null==t.dispose||t.dispose())}hR.delete(e),t&&t(e)}catch(e){}},500)})}}function hU(e,t){let n={callback:e};return t.add(n),()=>void t.delete(n)}let hD=new Set,hO=new Set,hF=new Set,hz=e=>hU(e,hD),hB=e=>hU(e,hO);function hk(e,t){if(e.size)for(let{callback:n}of e.values())n(t)}function hV(e,t){switch(e){case"before":return hk(hD,t);case"after":return hk(hO,t);case"tail":return hk(hF,t)}}function hH(e,t,n){let i=t.clock.getDelta();"never"===t.frameloop&&"number"==typeof e&&(i=e-t.clock.elapsedTime,t.clock.oldTime=t.clock.elapsedTime,t.clock.elapsedTime=e),s=t.internal.subscribers;for(let e=0;e0)&&!(null!=(t=c.gl.xr)&&t.isPresenting)&&(l+=hH(e,c))}if(hW=!1,hV("after",e),0===l)return hV("tail",e),hG=!1,cancelAnimationFrame(u)}function hX(e,t=1){var n;if(!e)return hR.forEach(e=>hX(e.store.getState(),t));(null==(n=e.gl.xr)||!n.isPresenting)&&e.internal.active&&"never"!==e.frameloop&&(t>1?e.internal.frames=Math.min(60,e.internal.frames+t):hW?e.internal.frames=2:e.internal.frames=1,hG||(hG=!0,requestAnimationFrame(hj)))}function hq(e,t=!0,n,i){if(t&&hV("before",e),n)hH(e,n,i);else for(let t of hR.values())hH(e,t.store.getState());t&&hV("after",e)}let hY={onClick:["click",!1],onContextMenu:["contextmenu",!1],onDoubleClick:["dblclick",!1],onWheel:["wheel",!0],onPointerDown:["pointerdown",!0],onPointerUp:["pointerup",!0],onPointerLeave:["pointerleave",!0],onPointerMove:["pointermove",!0],onPointerCancel:["pointercancel",!0],onLostPointerCapture:["lostpointercapture",!0]};function hZ(e){let{handlePointer:t}=function(e){function t(e){return e.filter(e=>["Move","Over","Enter","Out","Leave"].some(t=>{var n;return null==(n=e.__r3f)?void 0:n.handlers["onPointer"+t]}))}function n(t){let{internal:n}=e.getState();for(let e of n.hovered.values())if(!t.length||!t.find(t=>t.object===e.object&&t.index===e.index&&t.instanceId===e.instanceId)){let i=e.eventObject.__r3f;if(n.hovered.delete(c7(e)),null!=i&&i.eventCount){let n=i.handlers,r={...e,intersections:t};null==n.onPointerOut||n.onPointerOut(r),null==n.onPointerLeave||n.onPointerLeave(r)}}}function i(e,t){for(let n=0;nn([]);case"onLostPointerCapture":return t=>{let{internal:i}=e.getState();"pointerId"in t&&i.capturedMap.has(t.pointerId)&&requestAnimationFrame(()=>{i.capturedMap.has(t.pointerId)&&(i.capturedMap.delete(t.pointerId),n([]))})}}return function(a){let{onPointerMissed:s,internal:o}=e.getState();o.lastEvent.current=a;let l="onPointerMove"===r,u="onClick"===r||"onContextMenu"===r||"onDoubleClick"===r,c=function(t,n){let i=e.getState(),r=new Set,a=[],s=n?n(i.internal.interaction):i.internal.interaction;for(let e=0;e{let n=cY(e.object),i=cY(t.object);return n&&i&&i.events.priority-n.events.priority||e.distance-t.distance}).filter(e=>{let t=c7(e);return!r.has(t)&&(r.add(t),!0)});for(let e of(i.events.filter&&(o=i.events.filter(o,i)),o)){let t=e.object;for(;t;){var l;null!=(l=t.__r3f)&&l.eventCount&&a.push({...e,eventObject:t}),t=t.parent}}if("pointerId"in t&&i.internal.capturedMap.has(t.pointerId))for(let e of i.internal.capturedMap.get(t.pointerId).values())r.has(c7(e.intersection))||a.push(e.intersection);return a}(a,l?t:void 0),h=u?function(t){let{internal:n}=e.getState(),i=t.offsetX-n.initialClick[0],r=t.offsetY-n.initialClick[1];return Math.round(Math.sqrt(i*i+r*r))}(a):0;"onPointerDown"===r&&(o.initialClick=[a.offsetX,a.offsetY],o.initialHits=c.map(e=>e.eventObject)),u&&!c.length&&h<=2&&(i(a,o.interaction),s&&s(a)),l&&n(c),!function(e,t,i,r){if(e.length){let a={stopped:!1};for(let s of e){let o=cY(s.object);if(o||s.object.traverseAncestors(e=>{let t=cY(e);if(t)return o=t,!1}),o){let{raycaster:l,pointer:u,camera:c,internal:h}=o,d=new ef(u.x,u.y,0).unproject(c),p=e=>{var t,n;return null!=(t=null==(n=h.capturedMap.get(e))?void 0:n.has(s.eventObject))&&t},f=e=>{let n={intersection:s,target:t.target};h.capturedMap.has(e)?h.capturedMap.get(e).set(s.eventObject,n):h.capturedMap.set(e,new Map([[s.eventObject,n]])),t.target.setPointerCapture(e)},m=e=>{let t=h.capturedMap.get(e);t&&he(h.capturedMap,s.eventObject,t,e)},g={};for(let e in t){let n=t[e];"function"!=typeof n&&(g[e]=n)}let v={...s,...g,pointer:u,intersections:e,stopped:a.stopped,delta:i,unprojectedPoint:d,ray:l.ray,camera:c,stopPropagation(){let i="pointerId"in t&&h.capturedMap.get(t.pointerId);(!i||i.has(s.eventObject))&&(v.stopped=a.stopped=!0,h.hovered.size&&Array.from(h.hovered.values()).find(e=>e.eventObject===s.eventObject)&&n([...e.slice(0,e.indexOf(s)),s]))},target:{hasPointerCapture:p,setPointerCapture:f,releasePointerCapture:m},currentTarget:{hasPointerCapture:p,setPointerCapture:f,releasePointerCapture:m},nativeEvent:t};if(r(v),!0===a.stopped)break}}}}(c,a,h,function(e){let t=e.eventObject,n=t.__r3f;if(!(null!=n&&n.eventCount))return;let s=n.handlers;if(l){if(s.onPointerOver||s.onPointerEnter||s.onPointerOut||s.onPointerLeave){let t=c7(e),n=o.hovered.get(t);n?n.stopped&&e.stopPropagation():(o.hovered.set(t,e),null==s.onPointerOver||s.onPointerOver(e),null==s.onPointerEnter||s.onPointerEnter(e))}null==s.onPointerMove||s.onPointerMove(e)}else{let n=s[r];n?(!u||o.initialHits.includes(t))&&(i(a,o.interaction.filter(e=>!o.initialHits.includes(e))),n(e)):u&&o.initialHits.includes(t)&&i(a,o.interaction.filter(e=>!o.initialHits.includes(e)))}})}}}}(e);return{priority:1,enabled:!0,compute(e,t,n){t.pointer.set(e.offsetX/t.size.width*2-1,-(2*(e.offsetY/t.size.height))+1),t.raycaster.setFromCamera(t.pointer,t.camera)},connected:void 0,handlers:Object.keys(hY).reduce((e,n)=>({...e,[n]:t(n)}),{}),update:()=>{var t;let{events:n,internal:i}=e.getState();null!=(t=i.lastEvent)&&t.current&&n.handlers&&n.handlers.onPointerMove(i.lastEvent.current)},connect:t=>{let{set:n,events:i}=e.getState();if(null==i.disconnect||i.disconnect(),n(e=>({events:{...e.events,connected:t}})),i.handlers)for(let e in i.handlers){let n=i.handlers[e],[r,a]=hY[e];t.addEventListener(r,n,{passive:a})}},disconnect:()=>{let{set:t,events:n}=e.getState();if(n.connected){if(n.handlers)for(let e in n.handlers){let t=n.handlers[e],[i]=hY[e];n.connected.removeEventListener(i,t)}t(e=>({events:{...e.events,connected:void 0}}))}}}}e.s(["B",()=>cj,"C",()=>hr,"D",()=>ha,"E",()=>cX,"G",()=>hl,"a",()=>cG,"b",()=>cH,"c",()=>hI,"d",()=>hN,"e",()=>hg,"f",()=>hZ,"i",()=>ck,"j",()=>hz,"k",()=>hB,"u",()=>cW],40859)},15080,e=>{"use strict";var t=e.i(40859);e.s(["useThree",()=>t.C])},71753,e=>{"use strict";var t=e.i(40859);e.s(["useFrame",()=>t.D])},79123,e=>{"use strict";var t=e.i(43476),n=e.i(71645);let i=(0,n.createContext)(null),r=(0,n.createContext)(null),a=(0,n.createContext)(null);function s(){return(0,n.useContext)(i)}function o(){return(0,n.useContext)(r)}function l(){return(0,n.useContext)(a)}function u({children:e,fogEnabledOverride:s,onClearFogEnabledOverride:o}){let[l,u]=(0,n.useState)(!0),[c,h]=(0,n.useState)(!1),[d,p]=(0,n.useState)(1),[f,m]=(0,n.useState)(90),[g,v]=(0,n.useState)(!1),[_,y]=(0,n.useState)(!0),[x,b]=(0,n.useState)(!1),[S,M]=(0,n.useState)("moveLookStick"),T=(0,n.useCallback)(e=>{u(e),o()},[o]),w=(0,n.useMemo)(()=>({fogEnabled:s??l,setFogEnabled:T,highQualityFog:c,setHighQualityFog:h,fov:f,setFov:m,audioEnabled:g,setAudioEnabled:v,animationEnabled:_,setAnimationEnabled:y}),[l,s,T,c,f,g,_]),E=(0,n.useMemo)(()=>({debugMode:x,setDebugMode:b}),[x,b]),A=(0,n.useMemo)(()=>({speedMultiplier:d,setSpeedMultiplier:p,touchMode:S,setTouchMode:M}),[d,p,S,M]);(0,n.useLayoutEffect)(()=>{let e={};try{e=JSON.parse(localStorage.getItem("settings"))||{}}catch(e){}null!=e.debugMode&&b(e.debugMode),null!=e.audioEnabled&&v(e.audioEnabled),null!=e.animationEnabled&&y(e.animationEnabled),null!=e.fogEnabled&&u(e.fogEnabled),null!=e.highQualityFog&&h(e.highQualityFog),null!=e.speedMultiplier&&p(e.speedMultiplier),null!=e.fov&&m(e.fov),null!=e.touchMode&&M(e.touchMode)},[]);let C=(0,n.useRef)(null);return(0,n.useEffect)(()=>(C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{try{localStorage.setItem("settings",JSON.stringify({fogEnabled:l,highQualityFog:c,speedMultiplier:d,fov:f,audioEnabled:g,animationEnabled:_,debugMode:x,touchMode:S}))}catch(e){}},500),()=>{C.current&&clearTimeout(C.current)}),[l,c,d,f,g,_,x,S]),(0,t.jsx)(i.Provider,{value:w,children:(0,t.jsx)(r.Provider,{value:E,children:(0,t.jsx)(a.Provider,{value:A,children:e})})})}e.s(["SettingsProvider",()=>u,"useControls",()=>l,"useDebug",()=>o,"useSettings",()=>s])}]); \ No newline at end of file + `+e.join(" > ")}return null},rt.getPublicRootInstance=function(e){if(!(e=e.current).child)return null;switch(e.child.tag){case 27:case 5:return rA(e.child.stateNode);default:return e.child.stateNode}},rt.injectIntoDevTools=function(){var e={bundleType:0,version:rT,rendererPackageName:rw,currentDispatcherRef:rM,reconcilerVersion:"19.2.0"};if(null!==rE&&(e.rendererConfig=rE),typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")e=!1;else{var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)e=!0;else{try{sG=t.inject(e),sW=t}catch{}e=!!t.checkDCE}}return e},rt.isAlreadyRendering=function(){return(6&lm)!=0},rt.observeVisibleRects=function(e,t,n,r){if(!r7)throw Error(i(363));var a=as(e=im(e,t),n,r).disconnect;return{disconnect:function(){a()}}},rt.shouldError=function(){return null},rt.shouldSuspend=function(){return!1},rt.startHostTransition=function(e,t,r,a){if(5!==e.tag)throw Error(i(476));var s=tW(e).queue;tG(e,s,t,r4,null===r?n:function(){var t=tW(e);return null===t.next&&(t=e.alternate.memoizedState),tK(e,t.next.queue,{},ig()),r(a)})},rt.updateContainer=function(e,t,n,i){var r=t.current,a=ig();return i9(r,a,e,t,n,i),a},rt.updateContainerSync=function(e,t,n,i){return i9(t.current,2,e,t,n,i),2},rt},hc.exports.default=hc.exports,Object.defineProperty(hc.exports,"__esModule",{value:!0})),hu.exports=hc.exports),(b=hu.exports)&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default"))?b.default:b,hd={},hp=/^three(?=[A-Z])/,hf=e=>`${e[0].toUpperCase()}${e.slice(1)}`,hm=0;function hg(e){if("function"==typeof e){let t=`${hm++}`;return hd[t]=e,t}Object.assign(hd,e)}function hv(e,t){let n=hf(e),i=hd[n];if("primitive"!==e&&!i)throw Error(`R3F: ${n} is not part of the THREE namespace! Did you forget to extend? See: https://docs.pmnd.rs/react-three-fiber/api/objects#using-3rd-party-objects-declaratively`);if("primitive"===e&&!t.object)throw Error("R3F: Primitives without 'object' are invalid!");if(void 0!==t.args&&!Array.isArray(t.args))throw Error("R3F: The args prop must be an array!")}function h_(e){if(e.isHidden){var t;e.props.attach&&null!=(t=e.parent)&&t.object?c0(e.parent,e):c9(e.object)&&!1!==e.props.visible&&(e.object.visible=!0),e.isHidden=!1,c8(e)}}function hy(e,t,n){let i=t.root.getState();if(e.parent||e.object===i.scene){if(!t.object){var r,a;let e=hd[hf(t.type)];t.object=null!=(r=t.props.object)?r:new e(...null!=(a=t.props.args)?a:[]),t.object.__r3f=t}if(c6(t.object,t.props),t.props.attach)c0(e,t);else if(c9(t.object)&&c9(e.object)){let i=e.object.children.indexOf(null==n?void 0:n.object);if(n&&-1!==i){let n=e.object.children.indexOf(t.object);-1!==n?(e.object.children.splice(n,1),e.object.children.splice(n{try{e.dispose()}catch{}};"u">typeof IS_REACT_ACT_ENVIRONMENT?t():(0,cC.unstable_scheduleCallback)(cC.unstable_IdlePriority,t)}}function hM(e,t,n){if(!t)return;t.parent=null;let i=e.children.indexOf(t);-1!==i&&e.children.splice(i,1),t.props.attach?c1(e,t):c9(t.object)&&c9(e.object)&&(e.object.remove(t.object),function(e,t){let{internal:n}=e.getState();n.interaction=n.interaction.filter(e=>e!==t),n.initialHits=n.initialHits.filter(e=>e!==t),n.hovered.forEach((e,i)=>{(e.eventObject===t||e.object===t)&&n.hovered.delete(i)}),n.capturedMap.forEach((e,i)=>{he(n.capturedMap,t,e,i)})}(cB(t),t.object));let r=null!==t.props.dispose&&!1!==n;for(let e=t.children.length-1;e>=0;e--){let n=t.children[e];hM(t,n,r)}t.children.length=0,delete t.object.__r3f,r&&"primitive"!==t.type&&"Scene"!==t.object.type&&hS(t.object),void 0===n&&c8(t)}let hT=[],hw=()=>{},hE={},hA=0,hC=(S={isPrimaryRenderer:!1,warnsIfNotActing:!1,supportsMutation:!0,supportsPersistence:!1,supportsHydration:!1,createInstance:function(e,t,n){var i;return hv(e=hf(e)in hd?e:e.replace(hp,""),t),"primitive"===e&&null!=(i=t.object)&&i.__r3f&&delete t.object.__r3f,cK(t.object,n,e,t)},removeChild:hM,appendChild:hx,appendInitialChild:hx,insertBefore:hb,appendChildToContainer(e,t){let n=e.getState().scene.__r3f;t&&n&&hx(n,t)},removeChildFromContainer(e,t){let n=e.getState().scene.__r3f;t&&n&&hM(n,t)},insertInContainerBefore(e,t,n){let i=e.getState().scene.__r3f;t&&n&&i&&hb(i,t,n)},getRootHostContext:()=>hE,getChildHostContext:()=>hE,commitUpdate(e,t,n,i,r){var a,s,o;hv(t,i);let l=!1;if("primitive"===e.type&&n.object!==i.object||(null==(a=i.args)?void 0:a.length)!==(null==(s=n.args)?void 0:s.length)?l=!0:null!=(o=i.args)&&o.some((e,t)=>{var i;return e!==(null==(i=n.args)?void 0:i[t])})&&(l=!0),l)hT.push([e,{...i},r]);else{let t=function(e,t){let n={};for(let i in t)if(!c2.includes(i)&&!cZ.equ(t[i],e.props[i]))for(let e in n[i]=t[i],t)e.startsWith(`${i}-`)&&(n[e]=t[e]);for(let i in e.props){if(c2.includes(i)||t.hasOwnProperty(i))continue;let{root:r,key:a}=c$(e.object,i);if(r.constructor&&0===r.constructor.length){let e=function(e){let t=c3.get(e.constructor);try{t||(t=new e.constructor,c3.set(e.constructor,t))}catch(e){}return t}(r);cZ.und(e)||(n[a]=e[a])}else n[a]=0}return n}(e,i);Object.keys(t).length&&(Object.assign(e.props,t),c6(e.object,t))}(null===r.sibling||(4&r.flags)==0)&&function(){for(let[e]of hT){let t=e.parent;if(t)for(let n of(e.props.attach?c1(t,e):c9(e.object)&&c9(t.object)&&t.object.remove(e.object),e.children))n.props.attach?c1(e,n):c9(n.object)&&c9(e.object)&&e.object.remove(n.object);e.isHidden&&h_(e),e.object.__r3f&&delete e.object.__r3f,"primitive"!==e.type&&hS(e.object)}for(let[i,r,a]of hT){i.props=r;let s=i.parent;if(s){let r=hd[hf(i.type)];i.object=null!=(e=i.props.object)?e:new r(...null!=(t=i.props.args)?t:[]),i.object.__r3f=i;var e,t,n=i.object;for(let e of[a,a.alternate])if(null!==e)if("function"==typeof e.ref){null==e.refCleanup||e.refCleanup();let t=e.ref(n);"function"==typeof t&&(e.refCleanup=t)}else e.ref&&(e.ref.current=n);for(let e of(c6(i.object,i.props),i.props.attach?c0(s,i):c9(i.object)&&c9(s.object)&&s.object.add(i.object),i.children))e.props.attach?c0(i,e):c9(e.object)&&c9(i.object)&&i.object.add(e.object);c8(i)}}hT.length=0}()},finalizeInitialChildren:()=>!1,commitMount(){},getPublicInstance:e=>null==e?void 0:e.object,prepareForCommit:()=>null,preparePortalMount:e=>cK(e.getState().scene,e,"",{}),resetAfterCommit:()=>{},shouldSetTextContent:()=>!1,clearContainer:()=>!1,hideInstance:function(e){if(!e.isHidden){var t;e.props.attach&&null!=(t=e.parent)&&t.object?c1(e.parent,e):c9(e.object)&&(e.object.visible=!1),e.isHidden=!0,c8(e)}},unhideInstance:h_,createTextInstance:hw,hideTextInstance:hw,unhideTextInstance:hw,scheduleTimeout:"function"==typeof setTimeout?setTimeout:void 0,cancelTimeout:"function"==typeof clearTimeout?clearTimeout:void 0,noTimeout:-1,getInstanceFromNode:()=>null,beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},detachDeletedInstance(){},prepareScopeUpdate(){},getInstanceFromScope:()=>null,shouldAttemptEagerTransition:()=>!1,trackSchedulerEvent:()=>{},resolveEventType:()=>null,resolveEventTimeStamp:()=>-1.1,requestPostPaintCallback(){},maySuspendCommit:()=>!1,preloadInstance:()=>!0,suspendInstance(){},waitForCommitToBeReady:()=>null,NotPendingTransition:null,HostTransitionContext:E.createContext(null),setCurrentUpdatePriority(e){hA=e},getCurrentUpdatePriority:()=>hA,resolveUpdatePriority(){var e;if(0!==hA)return hA;switch("u">typeof window&&(null==(e=window.event)?void 0:e.type)){case"click":case"contextmenu":case"dblclick":case"pointercancel":case"pointerdown":case"pointerup":return 2;case"pointermove":case"pointerout":case"pointerover":case"pointerenter":case"pointerleave":case"wheel":return 8;default:return 32}},resetFormInstance(){},rendererPackageName:"@react-three/fiber",rendererVersion:"9.5.0",applyViewTransitionName(e,t,n){},restoreViewTransitionName(e,t){},cancelViewTransitionName(e,t,n){},cancelRootViewTransitionName(e){},restoreRootViewTransitionName(e){},InstanceMeasurement:null,measureInstance:e=>null,wasInstanceInViewport:e=>!0,hasInstanceChanged:(e,t)=>!1,hasInstanceAffectedParent:(e,t)=>!1,suspendOnActiveViewTransition(e,t){},startGestureTransition:()=>null,startViewTransition:()=>null,stopViewTransition(e){},createViewTransitionInstance:e=>null,getCurrentGestureOffset(e){throw Error("startGestureTransition is not yet supported in react-three-fiber.")},cloneMutableInstance:(e,t)=>e,cloneMutableTextInstance:e=>e,cloneRootViewTransitionContainer(e){throw Error("Not implemented.")},removeRootViewTransitionClone(e,t){throw Error("Not implemented.")},createFragmentInstance:e=>null,updateFragmentInstanceFiber(e,t){},commitNewChildToFragmentInstance(e,t){},deleteChildFromFragmentInstance(e,t){},measureClonedInstance:e=>null,maySuspendCommitOnUpdate:(e,t,n)=>!1,maySuspendCommitInSyncRender:(e,t)=>!1,startSuspendingCommit:()=>null,getSuspendedCommitReason:(e,t)=>null},(_=hh(S)).injectIntoDevTools(),_),hR=new Map,hP={objects:"shallow",strict:!1};function hI(e){var t,n;let i,r,a,s,o,l,u,c=hR.get(e),h=null==c?void 0:c.fiber,d=null==c?void 0:c.store;c&&console.warn("R3F.createRoot should only be called once!");let p="function"==typeof reportError?reportError:console.error,f=d||(t=hX,n=hq,o=(s=(a=(0,cT.createWithEqualityFn)((e,i)=>{let r,a=new ef,s=new ef,o=new ef;function l(e=i().camera,t=s,n=i().size){let{width:r,height:u,top:c,left:h}=n,d=r/u;t.isVector3?o.copy(t):o.set(...t);let p=e.getWorldPosition(a).distanceTo(o);if(e&&e.isOrthographicCamera)return{width:r/e.zoom,height:u/e.zoom,top:c,left:h,factor:1,distance:p,aspect:d};{let t=2*Math.tan(e.fov*Math.PI/180/2)*p,n=r/u*t;return{width:n,height:t,top:c,left:h,factor:r/n,distance:p,aspect:d}}}let u=t=>e(e=>({performance:{...e.performance,current:t}})),c=new ed;return{set:e,get:i,gl:null,camera:null,raycaster:null,events:{priority:1,enabled:!0,connected:!1},scene:null,xr:null,invalidate:(e=1)=>t(i(),e),advance:(e,t)=>n(e,t,i()),legacy:!1,linear:!1,flat:!1,controls:null,clock:new sW,pointer:c,mouse:c,frameloop:"always",onPointerMissed:void 0,performance:{current:1,min:.5,max:1,debounce:200,regress:()=>{let e=i();r&&clearTimeout(r),e.performance.current!==e.performance.min&&u(e.performance.min),r=setTimeout(()=>u(i().performance.max),e.performance.debounce)}},size:{width:0,height:0,top:0,left:0},viewport:{initialDpr:0,dpr:0,width:0,height:0,top:0,left:0,aspect:0,distance:0,factor:0,getCurrentViewport:l},setEvents:t=>e(e=>({...e,events:{...e.events,...t}})),setSize:(t,n,r=0,a=0)=>{let o=i().camera,u={width:t,height:n,top:r,left:a};e(e=>({size:u,viewport:{...e.viewport,...l(o,s,u)}}))},setDpr:t=>e(e=>{let n=cq(t);return{viewport:{...e.viewport,dpr:n,initialDpr:e.viewport.initialDpr||n}}}),setFrameloop:(t="always")=>{let n=i().clock;n.stop(),n.elapsedTime=0,"never"!==t&&(n.start(),n.elapsedTime=0),e(()=>({frameloop:t}))},previousRoot:void 0,internal:{interaction:[],hovered:new Map,subscribers:[],initialClick:[0,0],initialHits:[],capturedMap:new Map,lastEvent:E.createRef(),active:!1,frames:0,priority:0,subscribe:(e,t,n)=>{let r=i().internal;return r.priority=r.priority+ +(t>0),r.subscribers.push({ref:e,priority:t,store:n}),r.subscribers=r.subscribers.sort((e,t)=>e.priority-t.priority),()=>{let n=i().internal;null!=n&&n.subscribers&&(n.priority=n.priority-(t>0),n.subscribers=n.subscribers.filter(t=>t.ref!==e))}}}}})).getState()).size,l=s.viewport.dpr,u=s.camera,a.subscribe(()=>{let{camera:e,size:t,viewport:n,gl:i,set:r}=a.getState();if(t.width!==o.width||t.height!==o.height||n.dpr!==l){o=t,l=n.dpr;!e.manual&&(e&&e.isOrthographicCamera?(e.left=-(t.width/2),e.right=t.width/2,e.top=t.height/2,e.bottom=-(t.height/2)):e.aspect=t.width/t.height,e.updateProjectionMatrix());n.dpr>0&&i.setPixelRatio(n.dpr);let r="u">typeof HTMLCanvasElement&&i.domElement instanceof HTMLCanvasElement;i.setSize(t.width,t.height,r)}e!==u&&(u=e,r(t=>({viewport:{...t.viewport,...t.viewport.getCurrentViewport(e)}})))}),a.subscribe(e=>t(e)),a),m=h||hC.createContainer(f,1,null,!1,null,"",p,p,p,null);c||hR.set(e,{fiber:m,store:f});let g=!1,v=null;return{async configure(t={}){var n,a;let s;v=new Promise(e=>s=e);let{gl:o,size:l,scene:u,events:c,onCreated:h,shadows:d=!1,linear:p=!1,flat:m=!1,legacy:_=!1,orthographic:y=!1,frameloop:x="always",dpr:b=[1,2],performance:S,raycaster:M,camera:T,onPointerMissed:w}=t,E=f.getState(),A=E.gl;if(!E.gl){let t={canvas:e,powerPreference:"high-performance",antialias:!0,alpha:!0},n="function"==typeof o?await o(t):o;A=ht(n)?n:new cM({...t,...o}),E.set({gl:A})}let C=E.raycaster;C||E.set({raycaster:C=new op});let{params:R,...P}=M||{};if(cZ.equ(P,C,hP)||c6(C,{...P}),cZ.equ(R,C.params,hP)||c6(C,{params:{...C.params,...R}}),!E.camera||E.camera===r&&!cZ.equ(r,T,hP)){r=T;let e=null==T?void 0:T.isCamera,t=e?T:y?new sx(0,0,0,0,.1,1e3):new nO(75,0,.1,1e3);!e&&(t.position.z=5,T&&(c6(t,T),!t.manual&&("aspect"in T||"left"in T||"right"in T||"bottom"in T||"top"in T)&&(t.manual=!0,t.updateProjectionMatrix())),E.camera||null!=T&&T.rotation||t.lookAt(0,0,0)),E.set({camera:t}),C.camera=t}if(!E.scene){let e;null!=u&&u.isScene?cK(e=u,f,"",{}):(cK(e=new nj,f,"",{}),u&&c6(e,u)),E.set({scene:e})}c&&!E.events.handlers&&E.set({events:c(f)});let N=function(e,t){if(!t&&"u">typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement&&e.parentElement){let{width:t,height:n,top:i,left:r}=e.parentElement.getBoundingClientRect();return{width:t,height:n,top:i,left:r}}return!t&&"u">typeof OffscreenCanvas&&e instanceof OffscreenCanvas?{width:e.width,height:e.height,top:0,left:0}:{width:0,height:0,top:0,left:0,...t}}(e,l);if(cZ.equ(N,E.size,hP)||E.setSize(N.width,N.height,N.top,N.left),b&&E.viewport.dpr!==cq(b)&&E.setDpr(b),E.frameloop!==x&&E.setFrameloop(x),E.onPointerMissed||E.set({onPointerMissed:w}),S&&!cZ.equ(S,E.performance,hP)&&E.set(e=>({performance:{...e.performance,...S}})),!E.xr){let e=(e,t)=>{let n=f.getState();"never"!==n.frameloop&&hq(e,!0,n,t)},t=()=>{let t=f.getState();t.gl.xr.enabled=t.gl.xr.isPresenting,t.gl.xr.setAnimationLoop(t.gl.xr.isPresenting?e:null),t.gl.xr.isPresenting||hX(t)},i={connect(){let e=f.getState().gl;e.xr.addEventListener("sessionstart",t),e.xr.addEventListener("sessionend",t)},disconnect(){let e=f.getState().gl;e.xr.removeEventListener("sessionstart",t),e.xr.removeEventListener("sessionend",t)}};"function"==typeof(null==(n=A.xr)?void 0:n.addEventListener)&&i.connect(),E.set({xr:i})}if(A.shadowMap){let e=A.shadowMap.enabled,t=A.shadowMap.type;A.shadowMap.enabled=!!d,cZ.boo(d)?A.shadowMap.type=2:cZ.str(d)?A.shadowMap.type=null!=(a=({basic:0,percentage:1,soft:2,variance:3})[d])?a:2:cZ.obj(d)&&Object.assign(A.shadowMap,d),(e!==A.shadowMap.enabled||t!==A.shadowMap.type)&&(A.shadowMap.needsUpdate=!0)}return eb.enabled=!_,g||(A.outputColorSpace=p?L:I,A.toneMapping=4*!m),E.legacy!==_&&E.set(()=>({legacy:_})),E.linear!==p&&E.set(()=>({linear:p})),E.flat!==m&&E.set(()=>({flat:m})),!o||cZ.fun(o)||ht(o)||cZ.equ(o,A,hP)||c6(A,o),i=h,g=!0,s(),this},render(t){return g||v||this.configure(),v.then(()=>{hC.updateContainer((0,cR.jsx)(hL,{store:f,children:t,onCreated:i,rootElement:e}),m,null,()=>void 0)}),f},unmount(){hN(e)}}}function hL({store:e,children:t,onCreated:n,rootElement:i}){return cH(()=>{let t=e.getState();t.set(e=>({internal:{...e.internal,active:!0}})),n&&n(t),e.getState().events.connected||null==t.events.connect||t.events.connect(i)},[]),(0,cR.jsx)(hn.Provider,{value:e,children:t})}function hN(e,t){let n=hR.get(e),i=null==n?void 0:n.fiber;if(i){let r=null==n?void 0:n.store.getState();r&&(r.internal.active=!1),hC.updateContainer(null,i,null,()=>{r&&setTimeout(()=>{try{null==r.events.disconnect||r.events.disconnect(),null==(n=r.gl)||null==(i=n.renderLists)||null==i.dispose||i.dispose(),null==(a=r.gl)||null==a.forceContextLoss||a.forceContextLoss(),null!=(s=r.gl)&&s.xr&&r.xr.disconnect();var n,i,a,s,o=r.scene;for(let e in"Scene"!==o.type&&(null==o.dispose||o.dispose()),o){let t=o[e];(null==t?void 0:t.type)!=="Scene"&&(null==t||null==t.dispose||t.dispose())}hR.delete(e),t&&t(e)}catch(e){}},500)})}}function hU(e,t){let n={callback:e};return t.add(n),()=>void t.delete(n)}let hD=new Set,hO=new Set,hF=new Set,hz=e=>hU(e,hD),hB=e=>hU(e,hO);function hk(e,t){if(e.size)for(let{callback:n}of e.values())n(t)}function hV(e,t){switch(e){case"before":return hk(hD,t);case"after":return hk(hO,t);case"tail":return hk(hF,t)}}function hH(e,t,n){let i=t.clock.getDelta();"never"===t.frameloop&&"number"==typeof e&&(i=e-t.clock.elapsedTime,t.clock.oldTime=t.clock.elapsedTime,t.clock.elapsedTime=e),s=t.internal.subscribers;for(let e=0;e0)&&!(null!=(t=c.gl.xr)&&t.isPresenting)&&(l+=hH(e,c))}if(hW=!1,hV("after",e),0===l)return hV("tail",e),hG=!1,cancelAnimationFrame(u)}function hX(e,t=1){var n;if(!e)return hR.forEach(e=>hX(e.store.getState(),t));(null==(n=e.gl.xr)||!n.isPresenting)&&e.internal.active&&"never"!==e.frameloop&&(t>1?e.internal.frames=Math.min(60,e.internal.frames+t):hW?e.internal.frames=2:e.internal.frames=1,hG||(hG=!0,requestAnimationFrame(hj)))}function hq(e,t=!0,n,i){if(t&&hV("before",e),n)hH(e,n,i);else for(let t of hR.values())hH(e,t.store.getState());t&&hV("after",e)}let hY={onClick:["click",!1],onContextMenu:["contextmenu",!1],onDoubleClick:["dblclick",!1],onWheel:["wheel",!0],onPointerDown:["pointerdown",!0],onPointerUp:["pointerup",!0],onPointerLeave:["pointerleave",!0],onPointerMove:["pointermove",!0],onPointerCancel:["pointercancel",!0],onLostPointerCapture:["lostpointercapture",!0]};function hZ(e){let{handlePointer:t}=function(e){function t(e){return e.filter(e=>["Move","Over","Enter","Out","Leave"].some(t=>{var n;return null==(n=e.__r3f)?void 0:n.handlers["onPointer"+t]}))}function n(t){let{internal:n}=e.getState();for(let e of n.hovered.values())if(!t.length||!t.find(t=>t.object===e.object&&t.index===e.index&&t.instanceId===e.instanceId)){let i=e.eventObject.__r3f;if(n.hovered.delete(c7(e)),null!=i&&i.eventCount){let n=i.handlers,r={...e,intersections:t};null==n.onPointerOut||n.onPointerOut(r),null==n.onPointerLeave||n.onPointerLeave(r)}}}function i(e,t){for(let n=0;nn([]);case"onLostPointerCapture":return t=>{let{internal:i}=e.getState();"pointerId"in t&&i.capturedMap.has(t.pointerId)&&requestAnimationFrame(()=>{i.capturedMap.has(t.pointerId)&&(i.capturedMap.delete(t.pointerId),n([]))})}}return function(a){let{onPointerMissed:s,internal:o}=e.getState();o.lastEvent.current=a;let l="onPointerMove"===r,u="onClick"===r||"onContextMenu"===r||"onDoubleClick"===r,c=function(t,n){let i=e.getState(),r=new Set,a=[],s=n?n(i.internal.interaction):i.internal.interaction;for(let e=0;e{let n=cY(e.object),i=cY(t.object);return n&&i&&i.events.priority-n.events.priority||e.distance-t.distance}).filter(e=>{let t=c7(e);return!r.has(t)&&(r.add(t),!0)});for(let e of(i.events.filter&&(o=i.events.filter(o,i)),o)){let t=e.object;for(;t;){var l;null!=(l=t.__r3f)&&l.eventCount&&a.push({...e,eventObject:t}),t=t.parent}}if("pointerId"in t&&i.internal.capturedMap.has(t.pointerId))for(let e of i.internal.capturedMap.get(t.pointerId).values())r.has(c7(e.intersection))||a.push(e.intersection);return a}(a,l?t:void 0),h=u?function(t){let{internal:n}=e.getState(),i=t.offsetX-n.initialClick[0],r=t.offsetY-n.initialClick[1];return Math.round(Math.sqrt(i*i+r*r))}(a):0;"onPointerDown"===r&&(o.initialClick=[a.offsetX,a.offsetY],o.initialHits=c.map(e=>e.eventObject)),u&&!c.length&&h<=2&&(i(a,o.interaction),s&&s(a)),l&&n(c),!function(e,t,i,r){if(e.length){let a={stopped:!1};for(let s of e){let o=cY(s.object);if(o||s.object.traverseAncestors(e=>{let t=cY(e);if(t)return o=t,!1}),o){let{raycaster:l,pointer:u,camera:c,internal:h}=o,d=new ef(u.x,u.y,0).unproject(c),p=e=>{var t,n;return null!=(t=null==(n=h.capturedMap.get(e))?void 0:n.has(s.eventObject))&&t},f=e=>{let n={intersection:s,target:t.target};h.capturedMap.has(e)?h.capturedMap.get(e).set(s.eventObject,n):h.capturedMap.set(e,new Map([[s.eventObject,n]])),t.target.setPointerCapture(e)},m=e=>{let t=h.capturedMap.get(e);t&&he(h.capturedMap,s.eventObject,t,e)},g={};for(let e in t){let n=t[e];"function"!=typeof n&&(g[e]=n)}let v={...s,...g,pointer:u,intersections:e,stopped:a.stopped,delta:i,unprojectedPoint:d,ray:l.ray,camera:c,stopPropagation(){let i="pointerId"in t&&h.capturedMap.get(t.pointerId);(!i||i.has(s.eventObject))&&(v.stopped=a.stopped=!0,h.hovered.size&&Array.from(h.hovered.values()).find(e=>e.eventObject===s.eventObject)&&n([...e.slice(0,e.indexOf(s)),s]))},target:{hasPointerCapture:p,setPointerCapture:f,releasePointerCapture:m},currentTarget:{hasPointerCapture:p,setPointerCapture:f,releasePointerCapture:m},nativeEvent:t};if(r(v),!0===a.stopped)break}}}}(c,a,h,function(e){let t=e.eventObject,n=t.__r3f;if(!(null!=n&&n.eventCount))return;let s=n.handlers;if(l){if(s.onPointerOver||s.onPointerEnter||s.onPointerOut||s.onPointerLeave){let t=c7(e),n=o.hovered.get(t);n?n.stopped&&e.stopPropagation():(o.hovered.set(t,e),null==s.onPointerOver||s.onPointerOver(e),null==s.onPointerEnter||s.onPointerEnter(e))}null==s.onPointerMove||s.onPointerMove(e)}else{let n=s[r];n?(!u||o.initialHits.includes(t))&&(i(a,o.interaction.filter(e=>!o.initialHits.includes(e))),n(e)):u&&o.initialHits.includes(t)&&i(a,o.interaction.filter(e=>!o.initialHits.includes(e)))}})}}}}(e);return{priority:1,enabled:!0,compute(e,t,n){t.pointer.set(e.offsetX/t.size.width*2-1,-(2*(e.offsetY/t.size.height))+1),t.raycaster.setFromCamera(t.pointer,t.camera)},connected:void 0,handlers:Object.keys(hY).reduce((e,n)=>({...e,[n]:t(n)}),{}),update:()=>{var t;let{events:n,internal:i}=e.getState();null!=(t=i.lastEvent)&&t.current&&n.handlers&&n.handlers.onPointerMove(i.lastEvent.current)},connect:t=>{let{set:n,events:i}=e.getState();if(null==i.disconnect||i.disconnect(),n(e=>({events:{...e.events,connected:t}})),i.handlers)for(let e in i.handlers){let n=i.handlers[e],[r,a]=hY[e];t.addEventListener(r,n,{passive:a})}},disconnect:()=>{let{set:t,events:n}=e.getState();if(n.connected){if(n.handlers)for(let e in n.handlers){let t=n.handlers[e],[i]=hY[e];n.connected.removeEventListener(i,t)}t(e=>({events:{...e.events,connected:void 0}}))}}}}e.s(["B",()=>cj,"C",()=>hr,"D",()=>ha,"E",()=>cX,"G",()=>hl,"a",()=>cG,"b",()=>cH,"c",()=>hI,"d",()=>hN,"e",()=>hg,"f",()=>hZ,"i",()=>ck,"j",()=>hz,"k",()=>hB,"u",()=>cW],40859)},15080,e=>{"use strict";var t=e.i(40859);e.s(["useThree",()=>t.C])},71753,e=>{"use strict";var t=e.i(40859);e.s(["useFrame",()=>t.D])},79123,e=>{"use strict";var t=e.i(43476),n=e.i(71645);let i=(0,n.createContext)(null),r=(0,n.createContext)(null),a=(0,n.createContext)(null);function s(){return(0,n.useContext)(i)}function o(){return(0,n.useContext)(r)}function l(){return(0,n.useContext)(a)}function u({children:e,fogEnabledOverride:s,onClearFogEnabledOverride:o}){let[l,u]=(0,n.useState)(!0),[c,h]=(0,n.useState)(!1),[d,p]=(0,n.useState)(1),[f,m]=(0,n.useState)(90),[g,v]=(0,n.useState)(!1),[_,y]=(0,n.useState)(!0),[x,b]=(0,n.useState)(!1),[S,M]=(0,n.useState)("moveLookStick"),[T,w]=(0,n.useState)("MapGenius"),E=(0,n.useCallback)(e=>{u(e),o()},[o]),A=(0,n.useMemo)(()=>({fogEnabled:s??l,setFogEnabled:E,highQualityFog:c,setHighQualityFog:h,fov:f,setFov:m,audioEnabled:g,setAudioEnabled:v,animationEnabled:_,setAnimationEnabled:y,warriorName:T,setWarriorName:w}),[l,s,E,c,f,g,_,T]),C=(0,n.useMemo)(()=>({debugMode:x,setDebugMode:b}),[x,b]),R=(0,n.useMemo)(()=>({speedMultiplier:d,setSpeedMultiplier:p,touchMode:S,setTouchMode:M}),[d,p,S,M]);(0,n.useLayoutEffect)(()=>{let e={};try{e=JSON.parse(localStorage.getItem("settings"))||{}}catch(e){}null!=e.debugMode&&b(e.debugMode),null!=e.audioEnabled&&v(e.audioEnabled),null!=e.animationEnabled&&y(e.animationEnabled),null!=e.fogEnabled&&u(e.fogEnabled),null!=e.highQualityFog&&h(e.highQualityFog),null!=e.speedMultiplier&&p(e.speedMultiplier),null!=e.fov&&m(e.fov),null!=e.touchMode&&M(e.touchMode),null!=e.warriorName&&w(e.warriorName)},[]);let P=(0,n.useRef)(null);return(0,n.useEffect)(()=>(P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{try{localStorage.setItem("settings",JSON.stringify({fogEnabled:l,highQualityFog:c,speedMultiplier:d,fov:f,audioEnabled:g,animationEnabled:_,debugMode:x,touchMode:S,warriorName:T}))}catch(e){}},500),()=>{P.current&&clearTimeout(P.current)}),[l,c,d,f,g,_,x,S,T]),(0,t.jsx)(i.Provider,{value:A,children:(0,t.jsx)(r.Provider,{value:C,children:(0,t.jsx)(a.Provider,{value:R,children:e})})})}e.s(["SettingsProvider",()=>u,"useControls",()=>l,"useDebug",()=>o,"useSettings",()=>s])}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/bd03a29a57c8ca45.css b/docs/_next/static/chunks/9542fc38c512bd1a.css similarity index 89% rename from docs/_next/static/chunks/bd03a29a57c8ca45.css rename to docs/_next/static/chunks/9542fc38c512bd1a.css index cc049d83..8fe9cfc9 100644 --- a/docs/_next/static/chunks/bd03a29a57c8ca45.css +++ b/docs/_next/static/chunks/9542fc38c512bd1a.css @@ -1,5 +1,5 @@ .GuiMarkup-module__CLgNnq__GuiMarkup{white-space:pre-wrap;font-size:14px;line-height:1.5}.GuiMarkup-module__CLgNnq__GuiMarkup a{color:inherit;text-decoration:underline}.GuiMarkup-module__CLgNnq__Bullet{margin-left:.5em;margin-right:.5em} .DialogButton-module__LxvdOa__DialogButton{color:#99fff1;text-shadow:0 -1px 1px #0006;cursor:pointer;background:linear-gradient(#30a497cc,#1f9688cc 33%,#218377cc 67%,#046564cc);border:1px solid #387c74cc;border-top-color:#57b7b9cc;border-radius:4px;padding:4px 18px;font-family:inherit;font-size:14px;font-weight:500;box-shadow:inset 0 0 4px #02808e80}.DialogButton-module__LxvdOa__DialogButton:hover:not(:disabled){color:#b1fff5;border:1px solid #409188e6;border-top-color:#5ac6c2e6;box-shadow:inset 0 0 4px #02808e80,0 0 5px #3effbf80}.DialogButton-module__LxvdOa__DialogButton:active:not(:disabled){transform:translateY(1px)}.DialogButton-module__LxvdOa__DialogButton:disabled{opacity:.4;cursor:not-allowed}.DialogButton-module__LxvdOa__Secondary{box-shadow:none;color:#a2e2cfcc;text-shadow:none;background:0 0;border:1px solid #387c74cc;}.DialogButton-module__LxvdOa__Secondary:hover:not(:disabled){color:#a9ffe5cc;border:1px solid #3f9087e6} -.ServerBrowser-module__kqm3eq__Dialog{color:#b0d5c9;-webkit-user-select:text;user-select:text;-webkit-touch-callout:default;background:#142526cc;border:1px solid #41838b99;border-radius:4px;outline:none;grid-template-rows:auto 1fr auto;grid-template-columns:100%;width:860px;max-width:calc(100dvw - 40px);height:560px;max-height:calc(100dvh - 40px);font-size:14px;line-height:1.5;display:grid;position:relative;overflow:hidden;box-shadow:0 0 50px #0006,inset 0 0 60px #01070d99}.ServerBrowser-module__kqm3eq__Overlay{z-index:10;background:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.ServerBrowser-module__kqm3eq__Header{border-bottom:1px solid #00bedc40;align-items:center;gap:12px;padding:12px 16px 10px;display:flex}.ServerBrowser-module__kqm3eq__Title{color:#7dffff;text-shadow:0 1px 6px #0006;flex:1;margin:0;font-size:18px;font-weight:500}.ServerBrowser-module__kqm3eq__RefreshButton{padding:3px 14px;font-size:12px;}.ServerBrowser-module__kqm3eq__ServerCount{color:#c9dcd866;font-size:12px}.ServerBrowser-module__kqm3eq__TableWrapper{min-height:0;overflow-y:auto}.ServerBrowser-module__kqm3eq__Table{border-collapse:collapse;width:100%;font-size:13px}.ServerBrowser-module__kqm3eq__Table th{text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;letter-spacing:.04em;text-transform:uppercase;color:#7dffff99;background:#0a191af2;border-bottom:1px solid #00bedc33;padding:6px 12px;font-size:11px;font-weight:500;position:sticky;top:0}.ServerBrowser-module__kqm3eq__Table th:hover{color:#7dffff}.ServerBrowser-module__kqm3eq__Table th:nth-child(2),.ServerBrowser-module__kqm3eq__Table td:nth-child(2),.ServerBrowser-module__kqm3eq__Table th:nth-child(3),.ServerBrowser-module__kqm3eq__Table td:nth-child(3){text-align:right}.ServerBrowser-module__kqm3eq__Table td{white-space:nowrap;text-overflow:ellipsis;border-bottom:1px solid #ffffff0a;max-width:340px;padding:3px 12px;font-weight:500;overflow:hidden}.ServerBrowser-module__kqm3eq__Table tbody tr{cursor:pointer}.ServerBrowser-module__kqm3eq__Table tbody tr:hover{background:#41838b1f}.ServerBrowser-module__kqm3eq__Selected{color:#1e2828;background:#5dffe1e6!important}.ServerBrowser-module__kqm3eq__PasswordIcon{color:#ffc83c99;margin-right:4px;font-size:11px}.ServerBrowser-module__kqm3eq__Empty{text-align:center;color:#c9dcd84d;font-style:italic;padding:32px 12px!important}.ServerBrowser-module__kqm3eq__Footer{background:#021415b3;border-top:1px solid #00bedc40;flex-shrink:0;align-items:center;gap:16px;padding:10px 12px;display:flex}.ServerBrowser-module__kqm3eq__JoinButton{}.ServerBrowser-module__kqm3eq__CloseButton{}.ServerBrowser-module__kqm3eq__Hint{color:#c9dcd84d;margin-left:auto;font-size:12px}@media (max-width:719px){.ServerBrowser-module__kqm3eq__Dialog{border-radius:0;width:100%;max-width:100dvw;height:100%;max-height:100dvh}.ServerBrowser-module__kqm3eq__Hint{display:none}.ServerBrowser-module__kqm3eq__Table td{max-width:200px}} +.ServerBrowser-module__kqm3eq__Dialog{color:#b0d5c9;-webkit-user-select:text;user-select:text;-webkit-touch-callout:default;background:#142526cc;border:1px solid #41838b99;border-radius:4px;outline:none;grid-template-rows:auto 1fr auto;grid-template-columns:100%;width:860px;max-width:calc(100dvw - 40px);height:560px;max-height:calc(100dvh - 40px);font-size:14px;line-height:1.5;display:grid;position:relative;overflow:hidden;box-shadow:0 0 50px #0006,inset 0 0 60px #01070d99}.ServerBrowser-module__kqm3eq__Overlay{z-index:10;background:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.ServerBrowser-module__kqm3eq__Header{border-bottom:1px solid #00bedc40;align-items:center;gap:12px;padding:12px 16px 10px;display:flex}.ServerBrowser-module__kqm3eq__Title{color:#7dffff;text-shadow:0 1px 6px #0006;flex:1;margin:0;font-size:18px;font-weight:500}.ServerBrowser-module__kqm3eq__RefreshButton{padding:3px 14px;font-size:12px;}.ServerBrowser-module__kqm3eq__ServerCount{color:#c9dcd866;font-size:12px}.ServerBrowser-module__kqm3eq__TableWrapper{min-height:0;overflow-y:auto}.ServerBrowser-module__kqm3eq__Table{border-collapse:collapse;width:100%;font-size:13px}.ServerBrowser-module__kqm3eq__Table th{text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;letter-spacing:.04em;text-transform:uppercase;color:#7dffff99;background:#0a191af2;border-bottom:1px solid #00bedc33;padding:6px 12px;font-size:11px;font-weight:500;position:sticky;top:0}.ServerBrowser-module__kqm3eq__Table th:hover{color:#7dffff}.ServerBrowser-module__kqm3eq__Table th:nth-child(2),.ServerBrowser-module__kqm3eq__Table td:nth-child(2),.ServerBrowser-module__kqm3eq__Table th:nth-child(3),.ServerBrowser-module__kqm3eq__Table td:nth-child(3){text-align:right}.ServerBrowser-module__kqm3eq__Table td{white-space:nowrap;text-overflow:ellipsis;border-bottom:1px solid #ffffff0a;max-width:340px;padding:3px 12px;font-weight:500;overflow:hidden}.ServerBrowser-module__kqm3eq__Table tbody tr{cursor:pointer}.ServerBrowser-module__kqm3eq__Table tbody tr:hover{background:#41838b1f}.ServerBrowser-module__kqm3eq__Selected{color:#1e2828;background:#5dffe1e6!important}.ServerBrowser-module__kqm3eq__PasswordIcon{color:#ffc83c99;margin-right:4px;font-size:11px}.ServerBrowser-module__kqm3eq__Empty{text-align:center;color:#c9dcd84d;font-style:italic;padding:32px 12px!important}.ServerBrowser-module__kqm3eq__Footer{background:#021415b3;border-top:1px solid #00bedc40;flex-shrink:0;align-items:center;gap:16px;padding:10px 12px;display:flex}.ServerBrowser-module__kqm3eq__JoinButton{min-width:100px;}.ServerBrowser-module__kqm3eq__CloseButton{}.ServerBrowser-module__kqm3eq__WarriorField{align-items:center;gap:8px;display:flex}.ServerBrowser-module__kqm3eq__WarriorLabel{color:#7dffff99;font-size:12px;font-weight:500}.ServerBrowser-module__kqm3eq__WarriorInput{color:#b0d5c9;background:#00323ccc;border:1px solid #41838b80;border-radius:2px;outline:none;width:130px;padding:4px 6px;font-family:inherit;font-size:13px}.ServerBrowser-module__kqm3eq__WarriorInput:focus{border-color:#7dffff99}.ServerBrowser-module__kqm3eq__WarriorInput::placeholder{color:#c9dcd84d}.ServerBrowser-module__kqm3eq__Hint{color:#c9dcd84d;margin:0 auto;font-size:12px}@media (max-width:719px){.ServerBrowser-module__kqm3eq__Dialog{border-radius:0;width:100%;max-width:100dvw;height:100%;max-height:100dvh}.ServerBrowser-module__kqm3eq__Hint{display:none}.ServerBrowser-module__kqm3eq__Table td{max-width:200px}} .page-module__E0kJGG__CanvasContainer{z-index:0;position:absolute;inset:0}.page-module__E0kJGG__LoadingIndicator{pointer-events:none;z-index:1;opacity:.8;flex-direction:column;align-items:center;gap:16px;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.page-module__E0kJGG__LoadingIndicator[data-complete=true]{animation:.3s ease-out forwards page-module__E0kJGG__loadingComplete}.page-module__E0kJGG__Spinner{border:4px solid #fff3;border-top-color:#fff;border-radius:50%;width:48px;height:48px;animation:1s linear infinite page-module__E0kJGG__spin}.page-module__E0kJGG__Progress{background:#fff3;border-radius:2px;width:200px;height:4px;overflow:hidden}.page-module__E0kJGG__ProgressBar{background:#fff;border-radius:2px;height:100%;transition:width .1s ease-out}.page-module__E0kJGG__ProgressText{color:#ffffffb3;font-variant-numeric:tabular-nums;font-size:14px}@keyframes page-module__E0kJGG__spin{to{transform:rotate(360deg)}}@keyframes page-module__E0kJGG__loadingComplete{0%{opacity:1}to{opacity:0}} .MapInfoDialog-module__m0lXla__Dialog{color:#bccec3;-webkit-user-select:text;user-select:text;-webkit-touch-callout:default;background:#142526cc;border:1px solid #41838b99;border-radius:4px;outline:none;grid-template-rows:1fr auto;grid-template-columns:100%;width:800px;max-width:calc(100dvw - 40px);height:600px;max-height:calc(100dvh - 40px);font-size:14px;line-height:1.5;display:grid;position:relative;overflow:hidden;box-shadow:0 0 50px #0006,inset 0 0 60px #01070d99}.MapInfoDialog-module__m0lXla__Overlay{z-index:10;background:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.MapInfoDialog-module__m0lXla__Body{grid-template-rows:100%;grid-template-columns:1fr auto;min-height:0;display:grid;overflow:hidden}.MapInfoDialog-module__m0lXla__Left{padding:24px 28px;overflow-y:auto}.MapInfoDialog-module__m0lXla__PreviewImage{border-left:1px solid #00bedc40;height:100%;display:block}.MapInfoDialog-module__m0lXla__PreviewImageFloating{float:right;clear:right;width:auto;max-width:30%;max-height:260px;margin:0 0 16px 20px;display:block}.MapInfoDialog-module__m0lXla__Title{color:#7dffff;text-shadow:0 1px 6px #0006;margin:0;font-size:26px;font-weight:500}.MapInfoDialog-module__m0lXla__MapMeta{flex-wrap:wrap;gap:8px 16px;margin-bottom:4px;font-size:15px;font-weight:400;display:flex}.MapInfoDialog-module__m0lXla__MapPlanet{color:#dbcaa8b3}.MapInfoDialog-module__m0lXla__MapQuote{border-left:2px solid #00bedc59;margin:16px 0;padding:0 0 0 14px;font-style:italic}.MapInfoDialog-module__m0lXla__MapQuote p{white-space:pre-line;margin:0 0 4px}.MapInfoDialog-module__m0lXla__MapQuote cite{color:#ffffff73;font-size:12px;font-style:normal;display:block}.MapInfoDialog-module__m0lXla__MapBlurb{margin:0 0 16px;font-size:13px}.MapInfoDialog-module__m0lXla__Section{margin-top:20px}.MapInfoDialog-module__m0lXla__SectionTitle{color:#7dffff;letter-spacing:.04em;text-transform:uppercase;text-shadow:0 0 16px #00d2f040;margin:0 0 8px;font-size:16px;font-weight:500}.MapInfoDialog-module__m0lXla__MusicTrack{color:#cad0ac80;align-items:center;gap:6px;margin-top:16px;font-size:14px;font-style:italic;display:flex}.MapInfoDialog-module__m0lXla__MusicTrack[data-playing=true]{color:#f7fdd8b3}.MapInfoDialog-module__m0lXla__MusicButton{cursor:pointer;color:#557663;opacity:.5;background:0 0;border:0;border-radius:20px;flex-shrink:0;place-content:center;width:32px;height:32px;padding:0;font-size:20px;font-style:normal;line-height:1;display:grid}.MapInfoDialog-module__m0lXla__MusicTrack[data-playing=true] .MapInfoDialog-module__m0lXla__MusicButton{color:#6dffaa;opacity:1}.MapInfoDialog-module__m0lXla__MusicTrack[data-playing=true] .MapInfoDialog-module__m0lXla__MusicButton:hover{opacity:.7}.MapInfoDialog-module__m0lXla__Footer{background:#021415b3;border-top:1px solid #00bedc40;flex-shrink:0;align-items:center;gap:16px;padding:10px 12px;display:flex}.MapInfoDialog-module__m0lXla__CloseButton{}.MapInfoDialog-module__m0lXla__Hint{color:#c9dcd84d;margin-left:auto;font-size:12px}.MapInfoDialog-module__m0lXla__MusicTrackName{text-transform:capitalize}@media (max-width:719px){.MapInfoDialog-module__m0lXla__Body{display:block;overflow:auto}.MapInfoDialog-module__m0lXla__Hint{display:none}.MapInfoDialog-module__m0lXla__Left{width:100%;height:auto;margin:0;padding:16px 20px;overflow:auto}.MapInfoDialog-module__m0lXla__PreviewImage{width:auto;height:auto;margin:16px auto}.MapInfoDialog-module__m0lXla__CloseButton{width:220px;height:36px;margin:0 auto}} diff --git a/docs/_next/static/chunks/12ed5d454f7c6ac3.css b/docs/_next/static/chunks/a2e31798d9bc121e.css similarity index 81% rename from docs/_next/static/chunks/12ed5d454f7c6ac3.css rename to docs/_next/static/chunks/a2e31798d9bc121e.css index daec829c..47650970 100644 --- a/docs/_next/static/chunks/12ed5d454f7c6ac3.css +++ b/docs/_next/static/chunks/a2e31798d9bc121e.css @@ -9,5 +9,5 @@ .FloatingLabel-module__8y09Ka__Label{color:#fff;white-space:nowrap;text-align:center;background:#00000080;border-radius:1px;padding:1px 3px;font-size:11px} .PlayerNameplate-module__zYDm0a__Root{pointer-events:none;white-space:nowrap;flex-direction:column;align-items:center;display:inline-flex}.PlayerNameplate-module__zYDm0a__Top{padding-bottom:20px;}.PlayerNameplate-module__zYDm0a__Bottom{padding-top:20px;}.PlayerNameplate-module__zYDm0a__IffArrow{width:12px;height:12px;image-rendering:pixelated;filter:drop-shadow(0 1px 2px #000000b3)}.PlayerNameplate-module__zYDm0a__Name{color:#fff;text-shadow:0 1px 3px #000000e6,0 0 1px #000000b3;font-size:11px}.PlayerNameplate-module__zYDm0a__HealthBar{background:#00000080;border:1px solid #fff3;width:60px;height:4px;margin:2px auto 0;overflow:hidden}.PlayerNameplate-module__zYDm0a__HealthFill{background:#2ecc40;height:100%} .FlagMarker-module__INpLba__Root{pointer-events:none;white-space:nowrap;flex-direction:column;align-items:center;gap:1px;display:inline-flex}.FlagMarker-module__INpLba__Distance{color:#fff;text-shadow:0 1px 3px #000000e6,0 0 1px #000000b3;opacity:.5;font-size:10px}.FlagMarker-module__INpLba__Icon{width:16px;height:16px;image-rendering:pixelated;opacity:.5;filter:drop-shadow(0 1px 3px #000c);-webkit-mask-image:var(--flag-icon-url);mask-image:var(--flag-icon-url);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--flag-icon-url);-webkit-mask-position:50%;-webkit-mask-size:contain;-webkit-mask-repeat:no-repeat} -.PlayerHUD-module__-E1Scq__PlayerHUD{z-index:1;pointer-events:none;position:absolute;inset:0}.PlayerHUD-module__-E1Scq__TopRight{align-items:flex-start;gap:6px;display:flex;position:absolute;top:56px;right:8px}.PlayerHUD-module__-E1Scq__Compass{flex-shrink:0;width:64px;height:64px;position:relative}.PlayerHUD-module__-E1Scq__CompassRing{image-rendering:auto;width:100%;height:100%;position:absolute;top:0;left:0}.PlayerHUD-module__-E1Scq__CompassNSEW{width:100%;height:100%;image-rendering:pixelated;position:absolute;top:0;left:0}.PlayerHUD-module__-E1Scq__Bars{flex-direction:column;gap:3px;padding-top:10px;display:flex}.PlayerHUD-module__-E1Scq__BarTrack{background:#00000080;border:1px solid #ffffff26;width:120px;height:10px;overflow:hidden}.PlayerHUD-module__-E1Scq__BarFillHealth{background:#2ecc40;height:100%;transition:width .15s ease-out}.PlayerHUD-module__-E1Scq__BarFillEnergy{background:#0af;height:100%;transition:width .15s ease-out}.PlayerHUD-module__-E1Scq__WeaponHUD{flex-direction:column;gap:2px;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}.PlayerHUD-module__-E1Scq__WeaponSeparator{height:6px}.PlayerHUD-module__-E1Scq__ChatWindow{background:#00323ca6;max-width:420px;padding:4px 8px;font-size:12px;line-height:1.3;position:absolute;top:56px;left:0}.PlayerHUD-module__-E1Scq__ChatMessage{color:#2cacb5;padding:1px 0;transition:opacity .3s ease-out}.PlayerHUD-module__-E1Scq__ChatColor0{color:#2cacb5}.PlayerHUD-module__-E1Scq__ChatColor1{color:#04eb69}.PlayerHUD-module__-E1Scq__ChatColor2{color:#dbc880}.PlayerHUD-module__-E1Scq__ChatColor3{color:#4dfd5f}.PlayerHUD-module__-E1Scq__ChatColor4{color:#28e7f0}.PlayerHUD-module__-E1Scq__ChatColor5{color:#c8c832}.PlayerHUD-module__-E1Scq__ChatColor6{color:#c8c8c8}.PlayerHUD-module__-E1Scq__ChatColor7{color:#dcdc14}.PlayerHUD-module__-E1Scq__ChatColor8{color:#9696fa}.PlayerHUD-module__-E1Scq__ChatColor9{color:#3cdc96}.PlayerHUD-module__-E1Scq__TeamScores{font-family:monospace;font-size:12px;position:absolute;bottom:130px;left:0}.PlayerHUD-module__-E1Scq__TeamRow{background:#00323ca6;gap:6px;padding:2px 8px;display:flex}.PlayerHUD-module__-E1Scq__TeamRow+.PlayerHUD-module__-E1Scq__TeamRow{border-top:1px solid #80ffc826}.PlayerHUD-module__-E1Scq__TeamNameFriendly{color:#2ecc40;min-width:60px}.PlayerHUD-module__-E1Scq__TeamNameEnemy{color:#e44;min-width:60px}.PlayerHUD-module__-E1Scq__TeamScore{color:#fff;text-align:right;min-width:24px;font-weight:700}.PlayerHUD-module__-E1Scq__TeamCount{color:#9ba;text-align:right;min-width:24px}.PlayerHUD-module__-E1Scq__PackInventoryHUD{align-items:center;gap:4px;display:flex;position:absolute;bottom:100px;right:8px}.PlayerHUD-module__-E1Scq__PackInvItem{background:#00323ca6;border:1px solid #80ffc826;flex-direction:column;justify-content:center;align-items:center;gap:1px;padding:4px;display:flex}.PlayerHUD-module__-E1Scq__PackInvItemActive{border-color:#80ffc880;box-shadow:0 0 6px #80ffc84d}.PlayerHUD-module__-E1Scq__PackInvItemDim{opacity:.5}.PlayerHUD-module__-E1Scq__PackInvIcon{image-rendering:pixelated;display:block}.PlayerHUD-module__-E1Scq__PackInvCount{color:#bfe;text-align:center;min-width:12px;font-family:monospace;font-size:11px}.PlayerHUD-module__-E1Scq__PackInvInfinity{image-rendering:pixelated;opacity:.8;display:block}.PlayerHUD-module__-E1Scq__Reticle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.PlayerHUD-module__-E1Scq__ReticleImage{opacity:.85;width:64px;height:64px;image-rendering:pixelated}.PlayerHUD-module__-E1Scq__ReticleDot{background:#2ecc40b3;border-radius:50%;width:4px;height:4px;box-shadow:0 0 4px #2ecc4080} +.PlayerHUD-module__-E1Scq__PlayerHUD{z-index:1;pointer-events:none;position:absolute;inset:0}.PlayerHUD-module__-E1Scq__TopRight{align-items:flex-start;gap:6px;display:flex;position:absolute;top:56px;right:8px}.PlayerHUD-module__-E1Scq__Compass{flex-shrink:0;width:64px;height:64px;position:relative}.PlayerHUD-module__-E1Scq__CompassRing{image-rendering:auto;width:100%;height:100%;position:absolute;top:0;left:0}.PlayerHUD-module__-E1Scq__CompassNSEW{width:100%;height:100%;image-rendering:pixelated;position:absolute;top:0;left:0}.PlayerHUD-module__-E1Scq__Bars{flex-direction:column;gap:3px;padding-top:10px;display:flex}.PlayerHUD-module__-E1Scq__BarTrack{background:#00000080;border:1px solid #ffffff26;width:120px;height:10px;overflow:hidden}.PlayerHUD-module__-E1Scq__BarFillHealth{background:#2ecc40;height:100%;transition:width .15s ease-out}.PlayerHUD-module__-E1Scq__BarFillEnergy{background:#0af;height:100%;transition:width .15s ease-out}.PlayerHUD-module__-E1Scq__WeaponHUD{flex-direction:column;gap:2px;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}.PlayerHUD-module__-E1Scq__WeaponSeparator{height:6px}.PlayerHUD-module__-E1Scq__ChatContainer{pointer-events:auto;border:1px solid #2cacb566;flex-direction:column;max-width:420px;display:flex;position:absolute;top:56px;left:0}.PlayerHUD-module__-E1Scq__ChatWindow{-webkit-user-select:text;user-select:text;scrollbar-width:thin;scrollbar-color:#2cacb566 transparent;background:#00323ca6;max-width:450px;max-height:12.5em;padding:6px 8px;font-size:12px;line-height:1.33333;overflow-y:auto}.PlayerHUD-module__-E1Scq__ChatMessage{color:#2cacb5;padding:1px 0}.PlayerHUD-module__-E1Scq__ChatInputForm{display:flex}.PlayerHUD-module__-E1Scq__ChatInput{color:#28e7f0;background:#00323ccc;border:0;border-top:1px solid #4eb3a733;border-radius:0;outline:none;width:100%;margin:0;padding:6px 8px;font-family:inherit;font-size:12px}.PlayerHUD-module__-E1Scq__ChatInput::placeholder{color:#2cacb580}.PlayerHUD-module__-E1Scq__ChatInput:focus{background:#00323ce6}.PlayerHUD-module__-E1Scq__ChatColor0{color:#2cacb5}.PlayerHUD-module__-E1Scq__ChatColor1{color:#04eb69}.PlayerHUD-module__-E1Scq__ChatColor2{color:#dbc880}.PlayerHUD-module__-E1Scq__ChatColor3{color:#4dfd5f}.PlayerHUD-module__-E1Scq__ChatColor4{color:#28e7f0}.PlayerHUD-module__-E1Scq__ChatColor5{color:#c8c832}.PlayerHUD-module__-E1Scq__ChatColor6{color:#c8c8c8}.PlayerHUD-module__-E1Scq__ChatColor7{color:#dcdc14}.PlayerHUD-module__-E1Scq__ChatColor8{color:#9696fa}.PlayerHUD-module__-E1Scq__ChatColor9{color:#3cdc96}.PlayerHUD-module__-E1Scq__TeamScores{font-family:monospace;font-size:12px;position:absolute;bottom:130px;left:0}.PlayerHUD-module__-E1Scq__TeamRow{background:#00323ca6;gap:6px;padding:2px 8px;display:flex}.PlayerHUD-module__-E1Scq__TeamRow+.PlayerHUD-module__-E1Scq__TeamRow{border-top:1px solid #80ffc826}.PlayerHUD-module__-E1Scq__TeamNameFriendly{color:#2ecc40;min-width:60px}.PlayerHUD-module__-E1Scq__TeamNameEnemy{color:#e44;min-width:60px}.PlayerHUD-module__-E1Scq__TeamScore{color:#fff;text-align:right;min-width:24px;font-weight:700}.PlayerHUD-module__-E1Scq__TeamCount{color:#9ba;text-align:right;min-width:24px}.PlayerHUD-module__-E1Scq__PackInventoryHUD{align-items:center;gap:4px;display:flex;position:absolute;bottom:100px;right:8px}.PlayerHUD-module__-E1Scq__PackInvItem{background:#00323ca6;border:1px solid #80ffc826;flex-direction:column;justify-content:center;align-items:center;gap:1px;padding:4px;display:flex}.PlayerHUD-module__-E1Scq__PackInvItemActive{border-color:#80ffc880;box-shadow:0 0 6px #80ffc84d}.PlayerHUD-module__-E1Scq__PackInvItemDim{opacity:.5}.PlayerHUD-module__-E1Scq__PackInvIcon{image-rendering:pixelated;display:block}.PlayerHUD-module__-E1Scq__PackInvCount{color:#bfe;text-align:center;min-width:12px;font-family:monospace;font-size:11px}.PlayerHUD-module__-E1Scq__PackInvInfinity{image-rendering:pixelated;opacity:.8;display:block}.PlayerHUD-module__-E1Scq__Reticle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.PlayerHUD-module__-E1Scq__ReticleImage{opacity:.85;width:64px;height:64px;image-rendering:pixelated}.PlayerHUD-module__-E1Scq__ReticleDot{background:#2ecc40b3;border-radius:50%;width:4px;height:4px;box-shadow:0 0 4px #2ecc4080} .page-module__v6zvCa__CanvasContainer{z-index:0;position:absolute;inset:0}.page-module__v6zvCa__LoadingIndicator{pointer-events:none;z-index:1;opacity:.8;flex-direction:column;align-items:center;gap:16px;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.page-module__v6zvCa__LoadingIndicator[data-complete=true]{animation:.3s ease-out forwards page-module__v6zvCa__loadingComplete}.page-module__v6zvCa__Spinner{border:4px solid #fff3;border-top-color:#fff;border-radius:50%;width:48px;height:48px;animation:1s linear infinite page-module__v6zvCa__spin}@keyframes page-module__v6zvCa__spin{to{transform:rotate(360deg)}}@keyframes page-module__v6zvCa__loadingComplete{0%{opacity:1}to{opacity:0}}.page-module__v6zvCa__Sidebar{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:#fff;z-index:2;background:#000000b3;flex-direction:column;width:260px;font-size:13px;display:flex;position:fixed;top:0;bottom:0;left:0;overflow:hidden}.page-module__v6zvCa__SidebarSection{border-bottom:1px solid #ffffff1a;padding:10px 12px}.page-module__v6zvCa__SidebarSection:last-child{border-bottom:none}.page-module__v6zvCa__SectionLabel{text-transform:uppercase;letter-spacing:.05em;color:#fff6;margin-bottom:6px;font-size:10px}.page-module__v6zvCa__AnimationList{flex:1;padding:0 12px 12px;overflow-y:auto}.page-module__v6zvCa__AnimationItem{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:4px;align-items:center;gap:6px;padding:4px 6px;display:flex}.page-module__v6zvCa__AnimationItem:hover{background:#ffffff14}.page-module__v6zvCa__AnimationItem[data-active=true]{background:#ffffff26}.page-module__v6zvCa__PlayButton{color:#fff9;cursor:pointer;background:#ffffff1a;border:none;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;width:22px;height:22px;padding:0;font-size:11px;display:flex}.page-module__v6zvCa__PlayButton:hover{color:#fff;background:#fff3}.page-module__v6zvCa__AnimationItem[data-active=true] .page-module__v6zvCa__PlayButton{color:#fff;background:#64b4ff4d}.page-module__v6zvCa__AnimationName{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.page-module__v6zvCa__ClipName{color:#ffffff4d;white-space:nowrap;flex-shrink:0;font-size:10px}.page-module__v6zvCa__CyclicIcon{color:#ffffff4d;title:"Cyclic (looping)";flex-shrink:0;font-size:13px}.page-module__v6zvCa__CheckboxField{align-items:center;gap:6px;display:flex} diff --git a/docs/_next/static/chunks/2400be5b6a2e4806.js b/docs/_next/static/chunks/ac206141b5c1882c.js similarity index 96% rename from docs/_next/static/chunks/2400be5b6a2e4806.js rename to docs/_next/static/chunks/ac206141b5c1882c.js index 3fbd96ce..759e547b 100644 --- a/docs/_next/static/chunks/2400be5b6a2e4806.js +++ b/docs/_next/static/chunks/ac206141b5c1882c.js @@ -1 +1 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,85413,e=>{"use strict";var t=Object.defineProperty;class i{constructor(){((e,i,n)=>{let r,s;s=void 0,(r="symbol"!=typeof i?i+"":i)in e?t(e,r,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[r]=s})(this,"_listeners")}addEventListener(e,t){void 0===this._listeners&&(this._listeners={});let i=this._listeners;void 0===i[e]&&(i[e]=[]),-1===i[e].indexOf(t)&&i[e].push(t)}hasEventListener(e,t){if(void 0===this._listeners)return!1;let i=this._listeners;return void 0!==i[e]&&-1!==i[e].indexOf(t)}removeEventListener(e,t){if(void 0===this._listeners)return;let i=this._listeners[e];if(void 0!==i){let e=i.indexOf(t);-1!==e&&i.splice(e,1)}}dispatchEvent(e){if(void 0===this._listeners)return;let t=this._listeners[e.type];if(void 0!==t){e.target=this;let i=t.slice(0);for(let t=0,n=i.length;ti])},32865,e=>{"use strict";var t=e.i(43476),i=e.i(932);e.i(13876);var n=e.i(58647);function r(e){let n,r=(0,i.c)(2),{children:s}=e;return r[0]!==s?(n=(0,t.jsx)(t.Fragment,{children:s}),r[0]=s,r[1]=n):n=r[1],n}function s(){return(0,n.useEngineSelector)(a)}function a(e){return e.playback.recording}function o(){return(0,n.useEngineSelector)(l)}function l(e){return"playing"===e.playback.status}function u(){return(0,n.useEngineSelector)(c)}function c(e){return e.playback.timeMs/1e3}function m(){return(0,n.useEngineSelector)(d)}function d(e){return e.playback.durationMs/1e3}function f(){return(0,n.useEngineSelector)(h)}function h(e){return e.playback.rate}function p(){let e,t,r,a,o,l,u=(0,i.c)(17),c=s(),m=(0,n.useEngineSelector)(v),d=(0,n.useEngineSelector)(b),f=(0,n.useEngineSelector)(g),h=(0,n.useEngineSelector)(y);u[0]!==m?(e=e=>{m(e)},u[0]=m,u[1]=e):e=u[1];let p=e;u[2]!==c||u[3]!==d?(t=()=>{c&&d("playing")},u[2]=c,u[3]=d,u[4]=t):t=u[4];let x=t;u[5]!==d?(r=()=>{d("paused")},u[5]=d,u[6]=r):r=u[6];let k=r;u[7]!==f?(a=e=>{f(1e3*e)},u[7]=f,u[8]=a):a=u[8];let S=a;u[9]!==h?(o=e=>{h(e)},u[9]=h,u[10]=o):o=u[10];let w=o;return u[11]!==k||u[12]!==x||u[13]!==S||u[14]!==p||u[15]!==w?(l={setRecording:p,play:x,pause:k,seek:S,setSpeed:w},u[11]=k,u[12]=x,u[13]=S,u[14]=p,u[15]=w,u[16]=l):l=u[16],l}function y(e){return e.setPlaybackRate}function g(e){return e.setPlaybackTime}function b(e){return e.setPlaybackStatus}function v(e){return e.setRecording}e.s(["RecordingProvider",()=>r,"useCurrentTime",()=>u,"useDuration",()=>m,"useIsPlaying",()=>o,"usePlaybackActions",()=>p,"useRecording",()=>s,"useSpeed",()=>f])},9672,e=>{"use strict";function t(e,t){return e[t.toLowerCase()]}function i(e,i){let n=t(e,i);if(null==n)return;let r=parseFloat(n);return Number.isFinite(r)?r:void 0}function n(e,i){let n=t(e,i);if(null==n)return;let r=parseInt(n,10);return Number.isFinite(r)?r:void 0}function r(e,t={x:0,y:0,z:0}){if(!e)return t;let i=e.split(" ").map(Number);return{x:i[0]??t.x,y:i[1]??t.y,z:i[2]??t.z}}function s(e,t={r:0,g:0,b:0}){if(!e)return t;let i=e.split(" ").map(Number);return{r:i[0]??t.r,g:i[1]??t.g,b:i[2]??t.b}}function a(e,t={r:.5,g:.5,b:.5,a:1}){if(!e)return t;let i=e.split(" ").map(Number);return{r:i[0]??t.r,g:i[1]??t.g,b:i[2]??t.b,a:i[3]??t.a}}function o(e,t){let i=r(e),n=(t??"1 0 0 0").split(" ").map(Number),s=n[0]??1,a=n[1]??0,o=n[2]??0,l=Math.PI/180*(n[3]??0),u=Math.sqrt(s*s+a*a+o*o),c=0,m=0,d=1;u>1e-8&&(c=s/u,m=a/u,d=o/u);let f=Math.cos(l),h=Math.sin(l),p=1-f,y=Array(16).fill(0);return y[0]=p*c*c+f,y[1]=p*c*m+h*d,y[2]=p*c*d-h*m,y[4]=p*c*m-h*d,y[5]=p*m*m+f,y[6]=p*m*d+h*c,y[8]=p*c*d+h*m,y[9]=p*m*d-h*c,y[10]=p*d*d+f,y[12]=i.x,y[13]=i.y,y[14]=i.z,y[15]=1,{elements:y,position:i}}function l(e){return{className:"TerrainBlock",ghostIndex:e._id,terrFileName:t(e,"terrainFile")??"",detailTextureName:t(e,"detailTexture")??"",squareSize:n(e,"squareSize")??8,emptySquareRuns:function(e){if(!e)return;let t=e.split(/\s+/).map(Number).filter(Number.isFinite);return t.length>0?t:void 0}(t(e,"emptySquares"))}}function u(e){return{className:"InteriorInstance",ghostIndex:e._id,interiorFile:t(e,"interiorFile")??"",transform:o(t(e,"position"),t(e,"rotation")),scale:r(t(e,"scale"),{x:1,y:1,z:1}),showTerrainInside:"1"===t(e,"showTerrainInside"),skinBase:t(e,"skinBase")??"",alarmState:!1}}function c(e){let a=[];for(let i=1;i<=3;i++){let n=function(e){if(!e)return null;let t=e.split(/\s+/).map(Number),i=t[0]??0,n=t[1]??0,r=t[2]??0;return 0===i&&0===n&&0===r?null:{visibleDistance:i,minHeight:n,maxHeight:r,color:{r:.5,g:.5,b:.5}}}(t(e,`fogVolume${i}`));n&&a.push(n)}let o=[];for(let n=0;n<3;n++){let r=t(e,`cloudText${n+1}`)??"",s=i(e,`cloudHeightPer[${n}]`)??i(e,`cloudheightper${n}`)??[.35,.25,.2][n],a=i(e,`cloudSpeed${n+1}`)??[1e-4,2e-4,3e-4][n];o.push({texture:r,heightPercent:s,speed:a})}return{className:"Sky",ghostIndex:e._id,materialList:t(e,"materialList")??"",fogColor:s(t(e,"fogColor")),visibleDistance:i(e,"visibleDistance")??1e3,fogDistance:i(e,"fogDistance")??0,skySolidColor:s(t(e,"SkySolidColor")),useSkyTextures:(n(e,"useSkyTextures")??1)!==0,fogVolumes:a,cloudLayers:o,windVelocity:r(t(e,"windVelocity"))}}function m(e){return{className:"Sun",ghostIndex:e._id,direction:r(t(e,"direction"),{x:.57735,y:.57735,z:-.57735}),color:a(t(e,"color"),{r:.7,g:.7,b:.7,a:1}),ambient:a(t(e,"ambient"),{r:.5,g:.5,b:.5,a:1})}}function d(e){let n=t(e,"area"),r={x:-512,y:-512,w:1024,h:1024};if(n){let e=n.split(/\s+/).map(Number);r={x:e[0]??r.x,y:e[1]??r.y,w:e[2]??r.w,h:e[3]??r.h}}return{className:"MissionArea",ghostIndex:e._id,area:r,flightCeiling:i(e,"flightCeiling")??2e3,flightCeilingRange:i(e,"flightCeilingRange")??50}}function f(e){return{className:"WaterBlock",ghostIndex:e._id,transform:o(t(e,"position"),t(e,"rotation")),scale:r(t(e,"scale"),{x:1,y:1,z:1}),surfaceName:t(e,"surfaceTexture")??"",envMapName:t(e,"envMapTexture")??"",surfaceOpacity:i(e,"surfaceOpacity")??.75,waveMagnitude:i(e,"waveMagnitude")??1,envMapIntensity:i(e,"envMapIntensity")??1}}e.s(["interiorFromMis",()=>u,"missionAreaFromMis",()=>d,"skyFromMis",()=>c,"sunFromMis",()=>m,"terrainFromMis",()=>l,"waterBlockFromMis",()=>f])},19402,47566,e=>{"use strict";function t(e,i={x:0,y:0,z:0}){return e&&"object"==typeof e&&"x"in e?e:i}function i(e,t={r:0,g:0,b:0}){return e&&"object"==typeof e&&"r"in e?e:t}function n(e,t={r:.5,g:.5,b:.5,a:1}){return e&&"object"==typeof e&&"r"in e?e:t}function r(e){if(e&&"object"==typeof e&&"elements"in e&&Array.isArray(e.elements))return e;if(e&&"object"==typeof e&&"position"in e&&"rotation"in e){let{position:t,rotation:i}=e,n=i.x*i.x,r=i.y*i.y,s=i.z*i.z,a=i.x*i.y,o=i.x*i.z,l=i.y*i.z,u=i.w*i.x,c=i.w*i.y,m=i.w*i.z;return{elements:[1-2*(r+s),2*(a+m),2*(o-c),0,2*(a-m),1-2*(n+s),2*(l+u),0,2*(o+c),2*(l-u),1-2*(n+r),0,t.x,t.y,t.z,1],position:{x:t.x,y:t.y,z:t.z}}}return{elements:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],position:{x:0,y:0,z:0}}}function s(e,s,a){switch(e){case"TerrainBlock":return{className:"TerrainBlock",ghostIndex:s,terrFileName:a.terrFileName??"",detailTextureName:a.detailTextureName??"",squareSize:a.squareSize??8,emptySquareRuns:a.emptySquareRuns};case"InteriorInstance":return{className:"InteriorInstance",ghostIndex:s,interiorFile:a.interiorFile??"",transform:r(a.transform),scale:t(a.scale,{x:1,y:1,z:1}),showTerrainInside:a.showTerrainInside??!1,skinBase:a.skinBase??"",alarmState:a.alarmState??!1};case"TSStatic":return{className:"TSStatic",ghostIndex:s,shapeName:a.shapeName??"",transform:r(a.transform),scale:t(a.scale,{x:1,y:1,z:1})};case"Sky":let o,l;return o=Array.isArray(a.fogVolumes)?a.fogVolumes.map(e=>({visibleDistance:e.visibleDistance??0,minHeight:e.minHeight??0,maxHeight:e.maxHeight??0,color:i(e.color)})):[],l=Array.isArray(a.cloudLayers)?a.cloudLayers.map(e=>({texture:e.texture??"",heightPercent:e.heightPercent??0,speed:e.speed??0})):[],{className:"Sky",ghostIndex:s,materialList:a.materialList??"",fogColor:i(a.fogColor),visibleDistance:a.visibleDistance??1e3,fogDistance:a.fogDistance??0,skySolidColor:i(a.skySolidColor),useSkyTextures:a.useSkyTextures??!0,fogVolumes:o,cloudLayers:l,windVelocity:t(a.windVelocity)};case"Sun":return{className:"Sun",ghostIndex:s,direction:t(a.direction,{x:.57735,y:.57735,z:-.57735}),color:n(a.color,{r:.7,g:.7,b:.7,a:1}),ambient:n(a.ambient,{r:.5,g:.5,b:.5,a:1}),textures:Array.isArray(a.textures)?a.textures:void 0};case"MissionArea":return{className:"MissionArea",ghostIndex:s,area:a.area??{x:-512,y:-512,w:1024,h:1024},flightCeiling:a.flightCeiling??2e3,flightCeilingRange:a.flightCeilingRange??50};case"WaterBlock":return{className:"WaterBlock",ghostIndex:s,transform:r(a.transform),scale:t(a.scale,{x:1,y:1,z:1}),surfaceName:a.surfaceName??"",envMapName:a.envMapName??"",surfaceOpacity:a.surfaceOpacity??.75,waveMagnitude:a.waveMagnitude??1,envMapIntensity:a.envMapIntensity??1};default:return null}}e.s([],19402),e.s(["ghostToSceneObject",()=>s],47566)},70847,e=>{"use strict";e.i(19402),e.i(47566),e.i(9672),e.i(63318),e.s([])},51434,e=>{"use strict";var t=e.i(43476),i=e.i(932),n=e.i(71645),r=e.i(15080),s=e.i(90072);e.i(13876);var a=e.i(58647);let o=(0,n.createContext)(void 0);function l(e){let l,m,d,f,h=(0,i.c)(7),{children:p}=e,{camera:y}=(0,r.useThree)();h[0]===Symbol.for("react.memo_cache_sentinel")?(l={audioLoader:null,audioListener:null},h[0]=l):l=h[0];let[g,b]=(0,n.useState)(l);return h[1]!==y?(m=()=>{let e=new s.AudioLoader,t=y.children.find(c);t||(t=new s.AudioListener,y.add(t)),t.setMasterVolume(.8),b({audioLoader:e,audioListener:t});let i=()=>{let e=t?.context;e&&"suspended"===e.state&&e.resume().finally(()=>{document.removeEventListener("click",i),document.removeEventListener("keydown",i)})};document.addEventListener("click",i),document.addEventListener("keydown",i);let n=a.engineStore.subscribe(u,e=>{let i=t?.context;i&&("paused"===e?i.suspend():"suspended"===i.state&&i.resume())});return()=>{document.removeEventListener("click",i),document.removeEventListener("keydown",i),n(),t&&y.remove(t)}},d=[y],h[1]=y,h[2]=m,h[3]=d):(m=h[2],d=h[3]),(0,n.useEffect)(m,d),h[4]!==g||h[5]!==p?(f=(0,t.jsx)(o.Provider,{value:g,children:p}),h[4]=g,h[5]=p,h[6]=f):f=h[6],f}function u(e){return e.playback.status}function c(e){return e instanceof s.AudioListener}function m(){let e=(0,n.useContext)(o);if(void 0===e)throw Error("useAudio must be used within AudioProvider");return e}e.s(["AudioProvider",()=>l,"useAudio",()=>m])},66027,e=>{"use strict";var t=e.i(69230),i=e.i(69637);function n(e,n){return(0,i.useBaseQuery)(e,t.QueryObserver,n)}e.s(["useQuery",()=>n])},63318,e=>{"use strict";var t=e.i(90072);function i(e){return[e.y,e.z,e.x]}function n(e){return[e.y,e.z,e.x]}function r(e){let i=e.elements,n=new t.Matrix4,r=n.elements;r[0]=i[5],r[1]=i[6],r[2]=i[4],r[3]=0,r[4]=i[9],r[5]=i[10],r[6]=i[8],r[7]=0,r[8]=i[1],r[9]=i[2],r[10]=i[0],r[11]=0,r[12]=0,r[13]=0,r[14]=0,r[15]=1;let s=new t.Quaternion;return s.setFromRotationMatrix(n),s.conjugate(),s}e.s(["matrixFToQuaternion",()=>r,"torqueScaleToThree",()=>n,"torqueToThree",()=>i])},68294,e=>{"use strict";var t=e.i(43476),i=e.i(90072),n=e.i(15080),r=e.i(71645);let s=(0,r.createContext)(null);function a(){let e=(0,r.useContext)(s);if(!e)throw Error("useCameras must be used within CamerasProvider");return e}function o({children:e}){let{camera:a}=(0,n.useThree)(),[o,l]=(0,r.useState)(-1),[u,c]=(0,r.useState)({}),[m,d]=(0,r.useState)(()=>({initialized:!1,position:null,quarternion:null})),f=(0,r.useCallback)(e=>{c(t=>({...t,[e.id]:e}))},[]),h=(0,r.useCallback)(e=>{c(t=>{let{[e.id]:i,...n}=t;return n})},[]),p=Object.keys(u).length,y=(0,r.useCallback)(e=>{if(e>=0&&e{y(p?(o+1)%p:-1)},[p,o,y]);(0,r.useEffect)(()=>{let e=()=>{let e=window.location.hash;if(e.startsWith("#c")){let[t,n]=e.slice(2).split("~"),r=t.split(",").map(e=>parseFloat(e)),s=n.split(",").map(e=>parseFloat(e));d({initialized:!0,position:new i.Vector3(...r),quarternion:new i.Quaternion(...s)})}else d({initialized:!0,position:null,quarternion:null})};return window.addEventListener("hashchange",e),e(),()=>{window.removeEventListener("hashchange",e)}},[]),(0,r.useEffect)(()=>{m.initialized&&m.position&&(a.position.copy(m.position),m.quarternion&&a.quaternion.copy(m.quarternion))},[a,m]),(0,r.useEffect)(()=>{m.initialized&&!m.position&&p>0&&-1===o&&y(0)},[p,y,o,m]);let b=(0,r.useMemo)(()=>({registerCamera:f,unregisterCamera:h,nextCamera:g,setCameraIndex:y,cameraCount:p}),[f,h,g,y,p]);return 0===p&&-1!==o&&l(-1),(0,t.jsx)(s.Provider,{value:b,children:e})}e.s(["CamerasProvider",()=>o,"useCameras",()=>a])},93784,e=>{"use strict";let t=(0,e.i(8155).createStore)()(()=>({time:0,playback:null,root:null,freeFlyCamera:!1,entities:new Map}));function i(){t.setState({time:0,playback:null,freeFlyCamera:!1})}e.s(["resetStreamPlayback",()=>i,"streamPlaybackStore",0,t])},8328,e=>{"use strict";let t=null;function i(e){t=e}function n(e,i){return t?t(e,i):null}function r(e,t){return(i,n)=>{let r=Math.max(0,Math.min(255,i/t+128)),s=Math.max(0,Math.min(255,n/t+128)),a=Math.floor(r),o=Math.floor(s),l=Math.min(a+1,255),u=Math.min(o+1,255),c=r-a,m=s-o;return((e[256*o+a]*(1-c)+e[256*o+l]*c)*(1-m)+(e[256*u+a]*(1-c)+e[256*u+l]*c)*m)/65535*2048}}e.s(["createTerrainHeightSampler",()=>r,"getTerrainHeightAt",()=>n,"setTerrainHeightSampler",()=>i])},84968,e=>{e.v(t=>Promise.all(["static/chunks/6e9a6efec350bf8d.js"].map(t=>e.l(t))).then(()=>t(90208)))},30814,e=>{e.v(t=>Promise.all(["static/chunks/1fe5719635cf5984.js"].map(t=>e.l(t))).then(()=>t(9721)))},44325,e=>{e.v(t=>Promise.all(["static/chunks/aed6ada67562a5fc.js"].map(t=>e.l(t))).then(()=>t(66789)))},62125,e=>{e.v(t=>Promise.all(["static/chunks/e5617268e3c7a140.js"].map(t=>e.l(t))).then(()=>t(64972)))},25147,e=>{e.v(t=>Promise.all(["static/chunks/6f1c1038c8b3b80c.js"].map(t=>e.l(t))).then(()=>t(63724)))},61921,e=>{e.v(t=>Promise.all(["static/chunks/687860f86433eb04.js"].map(t=>e.l(t))).then(()=>t(29055)))},18599,e=>{e.v(t=>Promise.all(["static/chunks/796073b9f885dcbc.js"].map(t=>e.l(t))).then(()=>t(42585)))},96239,e=>{e.v(t=>Promise.all(["static/chunks/1fe5719635cf5984.js","static/chunks/0c29da8d7ee18a67.js"].map(t=>e.l(t))).then(()=>t(21500)))},93884,e=>{e.v(t=>Promise.all(["static/chunks/99bc9f3ae93187f1.css","static/chunks/ca289845e0f08110.js"].map(t=>e.l(t))).then(()=>t(94737)))},96145,e=>{e.v(t=>Promise.all(["static/chunks/2677e6a5750bb60c.js"].map(t=>e.l(t))).then(()=>t(60505)))},38496,e=>{e.v(t=>Promise.all(["static/chunks/e16c267496b8de91.js"].map(t=>e.l(t))).then(()=>t(9962)))},59197,e=>{e.v(t=>Promise.all(["static/chunks/bd03a29a57c8ca45.css","static/chunks/718b5c36c0eed37e.js"].map(t=>e.l(t))).then(()=>t(94247)))}]); \ No newline at end of file +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,85413,e=>{"use strict";var t=Object.defineProperty;class i{constructor(){((e,i,n)=>{let r,s;s=void 0,(r="symbol"!=typeof i?i+"":i)in e?t(e,r,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[r]=s})(this,"_listeners")}addEventListener(e,t){void 0===this._listeners&&(this._listeners={});let i=this._listeners;void 0===i[e]&&(i[e]=[]),-1===i[e].indexOf(t)&&i[e].push(t)}hasEventListener(e,t){if(void 0===this._listeners)return!1;let i=this._listeners;return void 0!==i[e]&&-1!==i[e].indexOf(t)}removeEventListener(e,t){if(void 0===this._listeners)return;let i=this._listeners[e];if(void 0!==i){let e=i.indexOf(t);-1!==e&&i.splice(e,1)}}dispatchEvent(e){if(void 0===this._listeners)return;let t=this._listeners[e.type];if(void 0!==t){e.target=this;let i=t.slice(0);for(let t=0,n=i.length;ti])},32865,e=>{"use strict";var t=e.i(43476),i=e.i(932);e.i(13876);var n=e.i(58647);function r(e){let n,r=(0,i.c)(2),{children:s}=e;return r[0]!==s?(n=(0,t.jsx)(t.Fragment,{children:s}),r[0]=s,r[1]=n):n=r[1],n}function s(){return(0,n.useEngineSelector)(a)}function a(e){return e.playback.recording}function o(){return(0,n.useEngineSelector)(l)}function l(e){return"playing"===e.playback.status}function u(){return(0,n.useEngineSelector)(c)}function c(e){return e.playback.timeMs/1e3}function m(){return(0,n.useEngineSelector)(d)}function d(e){return e.playback.durationMs/1e3}function f(){return(0,n.useEngineSelector)(h)}function h(e){return e.playback.rate}function p(){let e,t,r,a,o,l,u=(0,i.c)(17),c=s(),m=(0,n.useEngineSelector)(v),d=(0,n.useEngineSelector)(b),f=(0,n.useEngineSelector)(g),h=(0,n.useEngineSelector)(y);u[0]!==m?(e=e=>{m(e)},u[0]=m,u[1]=e):e=u[1];let p=e;u[2]!==c||u[3]!==d?(t=()=>{c&&d("playing")},u[2]=c,u[3]=d,u[4]=t):t=u[4];let x=t;u[5]!==d?(r=()=>{d("paused")},u[5]=d,u[6]=r):r=u[6];let k=r;u[7]!==f?(a=e=>{f(1e3*e)},u[7]=f,u[8]=a):a=u[8];let S=a;u[9]!==h?(o=e=>{h(e)},u[9]=h,u[10]=o):o=u[10];let w=o;return u[11]!==k||u[12]!==x||u[13]!==S||u[14]!==p||u[15]!==w?(l={setRecording:p,play:x,pause:k,seek:S,setSpeed:w},u[11]=k,u[12]=x,u[13]=S,u[14]=p,u[15]=w,u[16]=l):l=u[16],l}function y(e){return e.setPlaybackRate}function g(e){return e.setPlaybackTime}function b(e){return e.setPlaybackStatus}function v(e){return e.setRecording}e.s(["RecordingProvider",()=>r,"useCurrentTime",()=>u,"useDuration",()=>m,"useIsPlaying",()=>o,"usePlaybackActions",()=>p,"useRecording",()=>s,"useSpeed",()=>f])},9672,e=>{"use strict";function t(e,t){return e[t.toLowerCase()]}function i(e,i){let n=t(e,i);if(null==n)return;let r=parseFloat(n);return Number.isFinite(r)?r:void 0}function n(e,i){let n=t(e,i);if(null==n)return;let r=parseInt(n,10);return Number.isFinite(r)?r:void 0}function r(e,t={x:0,y:0,z:0}){if(!e)return t;let i=e.split(" ").map(Number);return{x:i[0]??t.x,y:i[1]??t.y,z:i[2]??t.z}}function s(e,t={r:0,g:0,b:0}){if(!e)return t;let i=e.split(" ").map(Number);return{r:i[0]??t.r,g:i[1]??t.g,b:i[2]??t.b}}function a(e,t={r:.5,g:.5,b:.5,a:1}){if(!e)return t;let i=e.split(" ").map(Number);return{r:i[0]??t.r,g:i[1]??t.g,b:i[2]??t.b,a:i[3]??t.a}}function o(e,t){let i=r(e),n=(t??"1 0 0 0").split(" ").map(Number),s=n[0]??1,a=n[1]??0,o=n[2]??0,l=Math.PI/180*(n[3]??0),u=Math.sqrt(s*s+a*a+o*o),c=0,m=0,d=1;u>1e-8&&(c=s/u,m=a/u,d=o/u);let f=Math.cos(l),h=Math.sin(l),p=1-f,y=Array(16).fill(0);return y[0]=p*c*c+f,y[1]=p*c*m+h*d,y[2]=p*c*d-h*m,y[4]=p*c*m-h*d,y[5]=p*m*m+f,y[6]=p*m*d+h*c,y[8]=p*c*d+h*m,y[9]=p*m*d-h*c,y[10]=p*d*d+f,y[12]=i.x,y[13]=i.y,y[14]=i.z,y[15]=1,{elements:y,position:i}}function l(e){return{className:"TerrainBlock",ghostIndex:e._id,terrFileName:t(e,"terrainFile")??"",detailTextureName:t(e,"detailTexture")??"",squareSize:n(e,"squareSize")??8,emptySquareRuns:function(e){if(!e)return;let t=e.split(/\s+/).map(Number).filter(Number.isFinite);return t.length>0?t:void 0}(t(e,"emptySquares"))}}function u(e){return{className:"InteriorInstance",ghostIndex:e._id,interiorFile:t(e,"interiorFile")??"",transform:o(t(e,"position"),t(e,"rotation")),scale:r(t(e,"scale"),{x:1,y:1,z:1}),showTerrainInside:"1"===t(e,"showTerrainInside"),skinBase:t(e,"skinBase")??"",alarmState:!1}}function c(e){let a=[];for(let i=1;i<=3;i++){let n=function(e){if(!e)return null;let t=e.split(/\s+/).map(Number),i=t[0]??0,n=t[1]??0,r=t[2]??0;return 0===i&&0===n&&0===r?null:{visibleDistance:i,minHeight:n,maxHeight:r,color:{r:.5,g:.5,b:.5}}}(t(e,`fogVolume${i}`));n&&a.push(n)}let o=[];for(let n=0;n<3;n++){let r=t(e,`cloudText${n+1}`)??"",s=i(e,`cloudHeightPer[${n}]`)??i(e,`cloudheightper${n}`)??[.35,.25,.2][n],a=i(e,`cloudSpeed${n+1}`)??[1e-4,2e-4,3e-4][n];o.push({texture:r,heightPercent:s,speed:a})}return{className:"Sky",ghostIndex:e._id,materialList:t(e,"materialList")??"",fogColor:s(t(e,"fogColor")),visibleDistance:i(e,"visibleDistance")??1e3,fogDistance:i(e,"fogDistance")??0,skySolidColor:s(t(e,"SkySolidColor")),useSkyTextures:(n(e,"useSkyTextures")??1)!==0,fogVolumes:a,cloudLayers:o,windVelocity:r(t(e,"windVelocity"))}}function m(e){return{className:"Sun",ghostIndex:e._id,direction:r(t(e,"direction"),{x:.57735,y:.57735,z:-.57735}),color:a(t(e,"color"),{r:.7,g:.7,b:.7,a:1}),ambient:a(t(e,"ambient"),{r:.5,g:.5,b:.5,a:1})}}function d(e){let n=t(e,"area"),r={x:-512,y:-512,w:1024,h:1024};if(n){let e=n.split(/\s+/).map(Number);r={x:e[0]??r.x,y:e[1]??r.y,w:e[2]??r.w,h:e[3]??r.h}}return{className:"MissionArea",ghostIndex:e._id,area:r,flightCeiling:i(e,"flightCeiling")??2e3,flightCeilingRange:i(e,"flightCeilingRange")??50}}function f(e){return{className:"WaterBlock",ghostIndex:e._id,transform:o(t(e,"position"),t(e,"rotation")),scale:r(t(e,"scale"),{x:1,y:1,z:1}),surfaceName:t(e,"surfaceTexture")??"",envMapName:t(e,"envMapTexture")??"",surfaceOpacity:i(e,"surfaceOpacity")??.75,waveMagnitude:i(e,"waveMagnitude")??1,envMapIntensity:i(e,"envMapIntensity")??1}}e.s(["interiorFromMis",()=>u,"missionAreaFromMis",()=>d,"skyFromMis",()=>c,"sunFromMis",()=>m,"terrainFromMis",()=>l,"waterBlockFromMis",()=>f])},19402,47566,e=>{"use strict";function t(e,i={x:0,y:0,z:0}){return e&&"object"==typeof e&&"x"in e?e:i}function i(e,t={r:0,g:0,b:0}){return e&&"object"==typeof e&&"r"in e?e:t}function n(e,t={r:.5,g:.5,b:.5,a:1}){return e&&"object"==typeof e&&"r"in e?e:t}function r(e){if(e&&"object"==typeof e&&"elements"in e&&Array.isArray(e.elements))return e;if(e&&"object"==typeof e&&"position"in e&&"rotation"in e){let{position:t,rotation:i}=e,n=i.x*i.x,r=i.y*i.y,s=i.z*i.z,a=i.x*i.y,o=i.x*i.z,l=i.y*i.z,u=i.w*i.x,c=i.w*i.y,m=i.w*i.z;return{elements:[1-2*(r+s),2*(a+m),2*(o-c),0,2*(a-m),1-2*(n+s),2*(l+u),0,2*(o+c),2*(l-u),1-2*(n+r),0,t.x,t.y,t.z,1],position:{x:t.x,y:t.y,z:t.z}}}return{elements:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],position:{x:0,y:0,z:0}}}function s(e,s,a){switch(e){case"TerrainBlock":return{className:"TerrainBlock",ghostIndex:s,terrFileName:a.terrFileName??"",detailTextureName:a.detailTextureName??"",squareSize:a.squareSize??8,emptySquareRuns:a.emptySquareRuns};case"InteriorInstance":return{className:"InteriorInstance",ghostIndex:s,interiorFile:a.interiorFile??"",transform:r(a.transform),scale:t(a.scale,{x:1,y:1,z:1}),showTerrainInside:a.showTerrainInside??!1,skinBase:a.skinBase??"",alarmState:a.alarmState??!1};case"TSStatic":return{className:"TSStatic",ghostIndex:s,shapeName:a.shapeName??"",transform:r(a.transform),scale:t(a.scale,{x:1,y:1,z:1})};case"Sky":let o,l;return o=Array.isArray(a.fogVolumes)?a.fogVolumes.map(e=>({visibleDistance:e.visibleDistance??0,minHeight:e.minHeight??0,maxHeight:e.maxHeight??0,color:i(e.color)})):[],l=Array.isArray(a.cloudLayers)?a.cloudLayers.map(e=>({texture:e.texture??"",heightPercent:e.heightPercent??0,speed:e.speed??0})):[],{className:"Sky",ghostIndex:s,materialList:a.materialList??"",fogColor:i(a.fogColor),visibleDistance:a.visibleDistance??1e3,fogDistance:a.fogDistance??0,skySolidColor:i(a.skySolidColor),useSkyTextures:a.useSkyTextures??!0,fogVolumes:o,cloudLayers:l,windVelocity:t(a.windVelocity)};case"Sun":return{className:"Sun",ghostIndex:s,direction:t(a.direction,{x:.57735,y:.57735,z:-.57735}),color:n(a.color,{r:.7,g:.7,b:.7,a:1}),ambient:n(a.ambient,{r:.5,g:.5,b:.5,a:1}),textures:Array.isArray(a.textures)?a.textures:void 0};case"MissionArea":return{className:"MissionArea",ghostIndex:s,area:a.area??{x:-512,y:-512,w:1024,h:1024},flightCeiling:a.flightCeiling??2e3,flightCeilingRange:a.flightCeilingRange??50};case"WaterBlock":return{className:"WaterBlock",ghostIndex:s,transform:r(a.transform),scale:t(a.scale,{x:1,y:1,z:1}),surfaceName:a.surfaceName??"",envMapName:a.envMapName??"",surfaceOpacity:a.surfaceOpacity??.75,waveMagnitude:a.waveMagnitude??1,envMapIntensity:a.envMapIntensity??1};default:return null}}e.s([],19402),e.s(["ghostToSceneObject",()=>s],47566)},70847,e=>{"use strict";e.i(19402),e.i(47566),e.i(9672),e.i(63318),e.s([])},51434,e=>{"use strict";var t=e.i(43476),i=e.i(932),n=e.i(71645),r=e.i(15080),s=e.i(90072);e.i(13876);var a=e.i(58647);let o=(0,n.createContext)(void 0);function l(e){let l,m,d,f,h=(0,i.c)(7),{children:p}=e,{camera:y}=(0,r.useThree)();h[0]===Symbol.for("react.memo_cache_sentinel")?(l={audioLoader:null,audioListener:null},h[0]=l):l=h[0];let[g,b]=(0,n.useState)(l);return h[1]!==y?(m=()=>{let e=new s.AudioLoader,t=y.children.find(c);t||(t=new s.AudioListener,y.add(t)),t.setMasterVolume(.8),b({audioLoader:e,audioListener:t});let i=()=>{let e=t?.context;e&&"suspended"===e.state&&e.resume().finally(()=>{document.removeEventListener("click",i),document.removeEventListener("keydown",i)})};document.addEventListener("click",i),document.addEventListener("keydown",i);let n=a.engineStore.subscribe(u,e=>{let i=t?.context;i&&("paused"===e?i.suspend():"suspended"===i.state&&i.resume())});return()=>{document.removeEventListener("click",i),document.removeEventListener("keydown",i),n(),t&&y.remove(t)}},d=[y],h[1]=y,h[2]=m,h[3]=d):(m=h[2],d=h[3]),(0,n.useEffect)(m,d),h[4]!==g||h[5]!==p?(f=(0,t.jsx)(o.Provider,{value:g,children:p}),h[4]=g,h[5]=p,h[6]=f):f=h[6],f}function u(e){return e.playback.status}function c(e){return e instanceof s.AudioListener}function m(){let e=(0,n.useContext)(o);if(void 0===e)throw Error("useAudio must be used within AudioProvider");return e}e.s(["AudioProvider",()=>l,"useAudio",()=>m])},66027,e=>{"use strict";var t=e.i(69230),i=e.i(69637);function n(e,n){return(0,i.useBaseQuery)(e,t.QueryObserver,n)}e.s(["useQuery",()=>n])},63318,e=>{"use strict";var t=e.i(90072);function i(e){return[e.y,e.z,e.x]}function n(e){return[e.y,e.z,e.x]}function r(e){let i=e.elements,n=new t.Matrix4,r=n.elements;r[0]=i[5],r[1]=i[6],r[2]=i[4],r[3]=0,r[4]=i[9],r[5]=i[10],r[6]=i[8],r[7]=0,r[8]=i[1],r[9]=i[2],r[10]=i[0],r[11]=0,r[12]=0,r[13]=0,r[14]=0,r[15]=1;let s=new t.Quaternion;return s.setFromRotationMatrix(n),s.conjugate(),s}e.s(["matrixFToQuaternion",()=>r,"torqueScaleToThree",()=>n,"torqueToThree",()=>i])},68294,e=>{"use strict";var t=e.i(43476),i=e.i(90072),n=e.i(15080),r=e.i(71645);let s=(0,r.createContext)(null);function a(){let e=(0,r.useContext)(s);if(!e)throw Error("useCameras must be used within CamerasProvider");return e}function o({children:e}){let{camera:a}=(0,n.useThree)(),[o,l]=(0,r.useState)(-1),[u,c]=(0,r.useState)({}),[m,d]=(0,r.useState)(()=>({initialized:!1,position:null,quarternion:null})),f=(0,r.useCallback)(e=>{c(t=>({...t,[e.id]:e}))},[]),h=(0,r.useCallback)(e=>{c(t=>{let{[e.id]:i,...n}=t;return n})},[]),p=Object.keys(u).length,y=(0,r.useCallback)(e=>{if(e>=0&&e{y(p?(o+1)%p:-1)},[p,o,y]);(0,r.useEffect)(()=>{let e=()=>{let e=window.location.hash;if(e.startsWith("#c")){let[t,n]=e.slice(2).split("~"),r=t.split(",").map(e=>parseFloat(e)),s=n.split(",").map(e=>parseFloat(e));d({initialized:!0,position:new i.Vector3(...r),quarternion:new i.Quaternion(...s)})}else d({initialized:!0,position:null,quarternion:null})};return window.addEventListener("hashchange",e),e(),()=>{window.removeEventListener("hashchange",e)}},[]),(0,r.useEffect)(()=>{m.initialized&&m.position&&(a.position.copy(m.position),m.quarternion&&a.quaternion.copy(m.quarternion))},[a,m]),(0,r.useEffect)(()=>{m.initialized&&!m.position&&p>0&&-1===o&&y(0)},[p,y,o,m]);let b=(0,r.useMemo)(()=>({registerCamera:f,unregisterCamera:h,nextCamera:g,setCameraIndex:y,cameraCount:p}),[f,h,g,y,p]);return 0===p&&-1!==o&&l(-1),(0,t.jsx)(s.Provider,{value:b,children:e})}e.s(["CamerasProvider",()=>o,"useCameras",()=>a])},93784,e=>{"use strict";let t=(0,e.i(8155).createStore)()(()=>({time:0,playback:null,root:null,freeFlyCamera:!1,entities:new Map}));function i(){t.setState({time:0,playback:null,freeFlyCamera:!1})}e.s(["resetStreamPlayback",()=>i,"streamPlaybackStore",0,t])},8328,e=>{"use strict";let t=null;function i(e){t=e}function n(e,i){return t?t(e,i):null}function r(e,t){return(i,n)=>{let r=Math.max(0,Math.min(255,i/t+128)),s=Math.max(0,Math.min(255,n/t+128)),a=Math.floor(r),o=Math.floor(s),l=Math.min(a+1,255),u=Math.min(o+1,255),c=r-a,m=s-o;return((e[256*o+a]*(1-c)+e[256*o+l]*c)*(1-m)+(e[256*u+a]*(1-c)+e[256*u+l]*c)*m)/65535*2048}}e.s(["createTerrainHeightSampler",()=>r,"getTerrainHeightAt",()=>n,"setTerrainHeightSampler",()=>i])},84968,e=>{e.v(t=>Promise.all(["static/chunks/6e9a6efec350bf8d.js"].map(t=>e.l(t))).then(()=>t(90208)))},30814,e=>{e.v(t=>Promise.all(["static/chunks/463a5d636c02e0db.js"].map(t=>e.l(t))).then(()=>t(9721)))},44325,e=>{e.v(t=>Promise.all(["static/chunks/aed6ada67562a5fc.js"].map(t=>e.l(t))).then(()=>t(66789)))},62125,e=>{e.v(t=>Promise.all(["static/chunks/e5617268e3c7a140.js"].map(t=>e.l(t))).then(()=>t(64972)))},25147,e=>{e.v(t=>Promise.all(["static/chunks/6f1c1038c8b3b80c.js"].map(t=>e.l(t))).then(()=>t(63724)))},61921,e=>{e.v(t=>Promise.all(["static/chunks/687860f86433eb04.js"].map(t=>e.l(t))).then(()=>t(29055)))},18599,e=>{e.v(t=>Promise.all(["static/chunks/796073b9f885dcbc.js"].map(t=>e.l(t))).then(()=>t(42585)))},67521,e=>{e.v(t=>Promise.all(["static/chunks/463a5d636c02e0db.js","static/chunks/3fc0c5e684385765.js"].map(t=>e.l(t))).then(()=>t(53272)))},93884,e=>{e.v(t=>Promise.all(["static/chunks/99bc9f3ae93187f1.css","static/chunks/ca289845e0f08110.js"].map(t=>e.l(t))).then(()=>t(94737)))},96145,e=>{e.v(t=>Promise.all(["static/chunks/d16b6f1b4eacbf2b.js"].map(t=>e.l(t))).then(()=>t(60505)))},38496,e=>{e.v(t=>Promise.all(["static/chunks/e16c267496b8de91.js"].map(t=>e.l(t))).then(()=>t(9962)))},59197,e=>{e.v(t=>Promise.all(["static/chunks/9542fc38c512bd1a.css","static/chunks/718b5c36c0eed37e.js"].map(t=>e.l(t))).then(()=>t(94247)))}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/b07469fc6c6cd3bb.js b/docs/_next/static/chunks/b07469fc6c6cd3bb.js deleted file mode 100644 index b170a52d..00000000 --- a/docs/_next/static/chunks/b07469fc6c6cd3bb.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,13070,e=>{e.v({Arrow:"KeyboardOverlay-module__HsRBsa__Arrow",Column:"KeyboardOverlay-module__HsRBsa__Column",Key:"KeyboardOverlay-module__HsRBsa__Key",Root:"KeyboardOverlay-module__HsRBsa__Root",Row:"KeyboardOverlay-module__HsRBsa__Row",Spacer:"KeyboardOverlay-module__HsRBsa__Spacer"})},78295,e=>{e.v({Joystick:"TouchControls-module__AkxfgW__Joystick",Left:"TouchControls-module__AkxfgW__Left TouchControls-module__AkxfgW__Joystick",Right:"TouchControls-module__AkxfgW__Right TouchControls-module__AkxfgW__Joystick"})},65883,e=>{e.v({ButtonLabel:"InspectorControls-module__gNRB6W__ButtonLabel",CheckboxField:"InspectorControls-module__gNRB6W__CheckboxField",Controls:"InspectorControls-module__gNRB6W__Controls",Dropdown:"InspectorControls-module__gNRB6W__Dropdown",Field:"InspectorControls-module__gNRB6W__Field",Group:"InspectorControls-module__gNRB6W__Group",IconButton:"InspectorControls-module__gNRB6W__IconButton",LabelledButton:"InspectorControls-module__gNRB6W__LabelledButton",MapInfoButton:"InspectorControls-module__gNRB6W__MapInfoButton InspectorControls-module__gNRB6W__IconButton InspectorControls-module__gNRB6W__LabelledButton",MissionSelectWrapper:"InspectorControls-module__gNRB6W__MissionSelectWrapper",Toggle:"InspectorControls-module__gNRB6W__Toggle InspectorControls-module__gNRB6W__IconButton"})},36679,e=>{e.v({ButtonLabel:"CopyCoordinatesButton-module__BxovtG__ButtonLabel "+e.i(65883).ButtonLabel,ClipboardCheck:"CopyCoordinatesButton-module__BxovtG__ClipboardCheck",MapPin:"CopyCoordinatesButton-module__BxovtG__MapPin",Root:"CopyCoordinatesButton-module__BxovtG__Root "+e.i(65883).IconButton+" "+e.i(65883).LabelledButton,showClipboardCheck:"CopyCoordinatesButton-module__BxovtG__showClipboardCheck"})},28903,e=>{e.v({ButtonLabel:"LoadDemoButton-module__kGZaoW__ButtonLabel "+e.i(65883).ButtonLabel,DemoIcon:"LoadDemoButton-module__kGZaoW__DemoIcon",Root:"LoadDemoButton-module__kGZaoW__Root "+e.i(65883).IconButton+" "+e.i(65883).LabelledButton})},9607,e=>{e.v({LiveIcon:"JoinServerButton-module__DIR70a__LiveIcon",PingLabel:"JoinServerButton-module__DIR70a__PingLabel "+e.i(65883).ButtonLabel,Pulsing:"JoinServerButton-module__DIR70a__Pulsing",Root:"JoinServerButton-module__DIR70a__Root "+e.i(65883).IconButton+" "+e.i(65883).LabelledButton,TextLabel:"JoinServerButton-module__DIR70a__TextLabel "+e.i(65883).ButtonLabel,blink:"JoinServerButton-module__DIR70a__blink"})},75840,e=>{e.v({BarFillEnergy:"PlayerHUD-module__-E1Scq__BarFillEnergy",BarFillHealth:"PlayerHUD-module__-E1Scq__BarFillHealth",BarTrack:"PlayerHUD-module__-E1Scq__BarTrack",Bars:"PlayerHUD-module__-E1Scq__Bars",ChatColor0:"PlayerHUD-module__-E1Scq__ChatColor0",ChatColor1:"PlayerHUD-module__-E1Scq__ChatColor1",ChatColor2:"PlayerHUD-module__-E1Scq__ChatColor2",ChatColor3:"PlayerHUD-module__-E1Scq__ChatColor3",ChatColor4:"PlayerHUD-module__-E1Scq__ChatColor4",ChatColor5:"PlayerHUD-module__-E1Scq__ChatColor5",ChatColor6:"PlayerHUD-module__-E1Scq__ChatColor6",ChatColor7:"PlayerHUD-module__-E1Scq__ChatColor7",ChatColor8:"PlayerHUD-module__-E1Scq__ChatColor8",ChatColor9:"PlayerHUD-module__-E1Scq__ChatColor9",ChatMessage:"PlayerHUD-module__-E1Scq__ChatMessage",ChatWindow:"PlayerHUD-module__-E1Scq__ChatWindow",Compass:"PlayerHUD-module__-E1Scq__Compass",CompassNSEW:"PlayerHUD-module__-E1Scq__CompassNSEW",CompassRing:"PlayerHUD-module__-E1Scq__CompassRing",PackInvCount:"PlayerHUD-module__-E1Scq__PackInvCount",PackInvIcon:"PlayerHUD-module__-E1Scq__PackInvIcon",PackInvInfinity:"PlayerHUD-module__-E1Scq__PackInvInfinity",PackInvItem:"PlayerHUD-module__-E1Scq__PackInvItem",PackInvItemActive:"PlayerHUD-module__-E1Scq__PackInvItemActive",PackInvItemDim:"PlayerHUD-module__-E1Scq__PackInvItemDim",PackInventoryHUD:"PlayerHUD-module__-E1Scq__PackInventoryHUD",PlayerHUD:"PlayerHUD-module__-E1Scq__PlayerHUD",Reticle:"PlayerHUD-module__-E1Scq__Reticle",ReticleDot:"PlayerHUD-module__-E1Scq__ReticleDot",ReticleImage:"PlayerHUD-module__-E1Scq__ReticleImage",TeamCount:"PlayerHUD-module__-E1Scq__TeamCount",TeamNameEnemy:"PlayerHUD-module__-E1Scq__TeamNameEnemy",TeamNameFriendly:"PlayerHUD-module__-E1Scq__TeamNameFriendly",TeamRow:"PlayerHUD-module__-E1Scq__TeamRow",TeamScore:"PlayerHUD-module__-E1Scq__TeamScore",TeamScores:"PlayerHUD-module__-E1Scq__TeamScores",TopRight:"PlayerHUD-module__-E1Scq__TopRight",WeaponHUD:"PlayerHUD-module__-E1Scq__WeaponHUD",WeaponSeparator:"PlayerHUD-module__-E1Scq__WeaponSeparator"})},56614,e=>{e.v({CloseButton:"ServerBrowser-module__kqm3eq__CloseButton "+e.i(6090).Secondary,Dialog:"ServerBrowser-module__kqm3eq__Dialog",Empty:"ServerBrowser-module__kqm3eq__Empty",Footer:"ServerBrowser-module__kqm3eq__Footer",Header:"ServerBrowser-module__kqm3eq__Header",Hint:"ServerBrowser-module__kqm3eq__Hint",JoinButton:"ServerBrowser-module__kqm3eq__JoinButton "+e.i(6090).DialogButton,Overlay:"ServerBrowser-module__kqm3eq__Overlay",PasswordIcon:"ServerBrowser-module__kqm3eq__PasswordIcon",RefreshButton:"ServerBrowser-module__kqm3eq__RefreshButton "+e.i(6090).DialogButton,Selected:"ServerBrowser-module__kqm3eq__Selected",ServerCount:"ServerBrowser-module__kqm3eq__ServerCount",Table:"ServerBrowser-module__kqm3eq__Table",TableWrapper:"ServerBrowser-module__kqm3eq__TableWrapper",Title:"ServerBrowser-module__kqm3eq__Title"})},3011,e=>{e.v({CanvasContainer:"page-module__E0kJGG__CanvasContainer",LoadingIndicator:"page-module__E0kJGG__LoadingIndicator",Progress:"page-module__E0kJGG__Progress",ProgressBar:"page-module__E0kJGG__ProgressBar",ProgressText:"page-module__E0kJGG__ProgressText",Spinner:"page-module__E0kJGG__Spinner",loadingComplete:"page-module__E0kJGG__loadingComplete",spin:"page-module__E0kJGG__spin"})},31713,e=>{"use strict";var t=e.i(43476),a=e.i(932),r=e.i(71645),n=e.i(75056),s=e.i(90072),o=e.i(66027),l=e.i(54970),i=e.i(12979),c=e.i(32424);let u=(0,r.createContext)(null);function d(e){let r,n=(0,a.c)(3),{runtime:s,children:o}=e;return n[0]!==o||n[1]!==s?(r=(0,t.jsx)(u.Provider,{value:s,children:o}),n[0]=o,n[1]=s,n[2]=r):r=n[2],r}var m=e.i(86608),h=e.i(38433),p=e.i(33870),f=e.i(91996);let _=(0,r.createContext)(null).Provider;e.i(13876);var g=e.i(58647),y=e.i(92224),v=e.i(7368),x=e.i(62395),b=e.i(9672);function k(e,t){if(t)return e.state.datablocks.get(t)}let S=(0,c.createScriptLoader)(),C=(0,p.createScriptCache)(),j={findFiles:e=>{let t=(0,l.default)(e,{nocase:!0});return(0,f.getResourceList)().filter(e=>t(e)).map(e=>{let[,t]=(0,f.getSourceAndPath)(e);return t})},isFile:e=>null!=(0,f.getResourceMap)()[(0,f.getResourceKey)(e)]};function w(e){"batch.flushed"===e.type&&g.engineStore.getState().applyRuntimeBatch(e.events,{tick:e.tick})}function N(e){e instanceof Error&&"AbortError"===e.name||console.error("Mission runtime failed to become ready:",e)}let I=(0,r.memo)(function(e){let n,s,l,c,u,p,f,I=(0,a.c)(13),{name:T,missionType:P,onLoadingChange:B}=e,{data:D}=((f=(0,a.c)(2))[0]!==T?(p={queryKey:["parsedMission",T],queryFn:()=>(0,i.loadMission)(T)},f[0]=T,f[1]=p):p=f[1],(0,o.useQuery)(p)),{ready:E,runtime:M,progress:R}=function(e,t,n){let s,o,l,i=(0,a.c)(6);i[0]===Symbol.for("react.memo_cache_sentinel")?(s={ready:!1,runtime:void 0,progress:0},i[0]=s):s=i[0];let[c,u]=(0,r.useState)(s);return i[1]!==e||i[2]!==t||i[3]!==n?(o=()=>{if(!n)return;let a=new AbortController,r=!1,s=null,o=(0,h.createProgressTracker)(),l=()=>{u(e=>({...e,progress:o.progress}))};o.on("update",l);let{runtime:i,ready:c}=(0,m.runServer)({missionName:e,missionType:t,runtimeOptions:{loadScript:S,fileSystem:j,cache:C,signal:a.signal,progress:o,ignoreScripts:v.ignoreScripts}});return c.then(()=>{if(r||a.signal.aborted)return;g.engineStore.getState().setRuntime(i);let e=i.getObjectByName("MissionGroup");if(e){let t=function e(t,a,r){let n=[],s=r;if("SimGroup"===t._className){if(t._name?.toLowerCase()==="teams")s=void 0;else if(void 0===s&&t._name){let e=t._name.match(/^team(\d+)$/i);e&&(s=parseInt(e[1],10))}}let o=function(e,t,a){let r=e._className,n=`mission_${e._id}`,s=(0,x.getPosition)(e),o=(0,x.getScale)(e),l=function(e){let[t,a,r,n]=e.split(" ").map(parseFloat),s=-(n||0)*Math.PI/360,o=Math.sin(s),l=Math.cos(s),i=Math.sqrt((a||0)*(a||0)+(r||0)*(r||0)+(t||0)*(t||0));return i<1e-8?[0,0,0,1]:[(a||0)/i*o,(r||0)/i*o,(t||0)/i*o,l]}(e.rotation??"1 0 0 0"),i=(0,x.getProperty)(e,"dataBlock")??"",c=k(t,i),u=(0,x.getProperty)(e,"missionTypesList"),d={id:n,className:r,runtimeObject:e,missionTypesList:u},m={...d,position:s,rotation:l,scale:o};switch(r){case"TerrainBlock":return{...d,renderType:"TerrainBlock",terrainData:(0,b.terrainFromMis)(e)};case"InteriorInstance":return{...d,renderType:"InteriorInstance",interiorData:(0,b.interiorFromMis)(e)};case"Sky":return{...d,renderType:"Sky",skyData:(0,b.skyFromMis)(e)};case"Sun":return{...d,renderType:"Sun",sunData:(0,b.sunFromMis)(e)};case"WaterBlock":return{...d,renderType:"WaterBlock",waterData:(0,b.waterBlockFromMis)(e)};case"MissionArea":return{...d,renderType:"MissionArea",missionAreaData:(0,b.missionAreaFromMis)(e)};case"StaticShape":case"Item":case"Turret":case"TSStatic":var h=m,p=e,f=c,_=t,g=r,y=a,v=i;let S="TSStatic"===g?(0,x.getProperty)(p,"shapeName"):(0,x.getProperty)(f,"shapeFile"),C={...h,renderType:"Shape",shapeName:S,shapeType:"Turret"===g?"Turret":"Item"===g?"Item":"TSStatic"===g?"TSStatic":"StaticShape",dataBlock:v||void 0,teamId:y};if("Item"===g&&(C.rotate=function(e){if("string"==typeof e){let t=e.toLowerCase();return"0"!==t&&"false"!==t&&""!==t}return!!e}((0,x.getProperty)(p,"rotate")??(0,x.getProperty)(f,"rotate"))),"Turret"===g){let e=(0,x.getProperty)(p,"initialBarrel");if(e){let t=k(_,e);C.barrelShapeName=(0,x.getProperty)(t,"shapeFile")}}return C;case"ForceFieldBare":return function(e,t,a,r){let n,s=(0,x.getProperty)(a,"color"),o=s?[(n=s.split(" ").map(e=>parseFloat(e)))[0]??0,n[1]??0,n[2]??0]:[1,1,1],l=parseFloat((0,x.getProperty)(a,"baseTranslucency"))||1,i=parseInt((0,x.getProperty)(a,"numFrames"),10)||1,c=parseFloat((0,x.getProperty)(a,"framesPerSec"))||1,u=parseFloat((0,x.getProperty)(a,"scrollSpeed"))||0,d=parseFloat((0,x.getProperty)(a,"umapping"))||1,m=parseFloat((0,x.getProperty)(a,"vmapping"))||1,h=[];for(let e=0;e{r=!0,o.off("update",l),a.abort(),s?.(),g.engineStore.getState().clearRuntime(),y.gameEntityStore.getState().clearEntities(),i.destroy()}},l=[e,t,n],i[1]=e,i[2]=t,i[3]=n,i[4]=o,i[5]=l):(o=i[4],l=i[5]),(0,r.useEffect)(o,l),c}(T,P,D),L=!D||!E||!M;I[0]!==P||I[1]!==D?(n={metadata:D,missionType:P},I[0]=P,I[1]=D,I[2]=n):n=I[2];let H=n;return(I[3]!==L||I[4]!==B||I[5]!==R?(s=()=>{B?.(L,R)},l=[L,R,B],I[3]=L,I[4]=B,I[5]=R,I[6]=s,I[7]=l):(s=I[6],l=I[7]),(0,r.useEffect)(s,l),L)?null:(I[8]!==M?(c=(0,t.jsx)(d,{runtime:M}),I[8]=M,I[9]=c):c=I[9],I[10]!==H||I[11]!==c?(u=(0,t.jsx)(_,{value:H,children:c}),I[10]=H,I[11]=c,I[12]=u):u=I[12],u)});var T=e.i(17751),P=e.i(12598),B=e.i(5729),D=e.i(12631),E=e.i(32865),M=e.i(13070);function R(){let e,r,n,s,o,l,i,c,u,d,m,h,p,f,_,g,y,v,x,b,k,S,C,j,w=(0,a.c)(51),N=(0,E.useRecording)(),I=(0,D.useKeyboardControls)(z),T=(0,D.useKeyboardControls)(W),P=(0,D.useKeyboardControls)(U),B=(0,D.useKeyboardControls)(A),R=(0,D.useKeyboardControls)(O),K=(0,D.useKeyboardControls)(q),$=(0,D.useKeyboardControls)(G),J=(0,D.useKeyboardControls)(F),V=(0,D.useKeyboardControls)(H),Y=(0,D.useKeyboardControls)(L);return N&&"live"!==N.source?null:(w[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("div",{className:M.default.Spacer}),w[0]=e):e=w[0],w[1]!==I?(r=(0,t.jsx)("div",{className:M.default.Key,"data-pressed":I,children:"W"}),w[1]=I,w[2]=r):r=w[2],w[3]===Symbol.for("react.memo_cache_sentinel")?(n=(0,t.jsx)("div",{className:M.default.Spacer}),w[3]=n):n=w[3],w[4]!==r?(s=(0,t.jsxs)("div",{className:M.default.Row,children:[e,r,n]}),w[4]=r,w[5]=s):s=w[5],w[6]!==P?(o=(0,t.jsx)("div",{className:M.default.Key,"data-pressed":P,children:"A"}),w[6]=P,w[7]=o):o=w[7],w[8]!==T?(l=(0,t.jsx)("div",{className:M.default.Key,"data-pressed":T,children:"S"}),w[8]=T,w[9]=l):l=w[9],w[10]!==B?(i=(0,t.jsx)("div",{className:M.default.Key,"data-pressed":B,children:"D"}),w[10]=B,w[11]=i):i=w[11],w[12]!==o||w[13]!==l||w[14]!==i?(c=(0,t.jsxs)("div",{className:M.default.Row,children:[o,l,i]}),w[12]=o,w[13]=l,w[14]=i,w[15]=c):c=w[15],w[16]!==s||w[17]!==c?(u=(0,t.jsxs)("div",{className:M.default.Column,children:[s,c]}),w[16]=s,w[17]=c,w[18]=u):u=w[18],w[19]===Symbol.for("react.memo_cache_sentinel")?(d=(0,t.jsx)("span",{className:M.default.Arrow,children:"↑"}),w[19]=d):d=w[19],w[20]!==R?(m=(0,t.jsx)("div",{className:M.default.Row,children:(0,t.jsxs)("div",{className:M.default.Key,"data-pressed":R,children:[d," Space"]})}),w[20]=R,w[21]=m):m=w[21],w[22]===Symbol.for("react.memo_cache_sentinel")?(h=(0,t.jsx)("span",{className:M.default.Arrow,children:"↓"}),w[22]=h):h=w[22],w[23]!==K?(p=(0,t.jsx)("div",{className:M.default.Row,children:(0,t.jsxs)("div",{className:M.default.Key,"data-pressed":K,children:[h," Shift"]})}),w[23]=K,w[24]=p):p=w[24],w[25]!==m||w[26]!==p?(f=(0,t.jsxs)("div",{className:M.default.Column,children:[m,p]}),w[25]=m,w[26]=p,w[27]=f):f=w[27],w[28]===Symbol.for("react.memo_cache_sentinel")?(_=(0,t.jsx)("div",{className:M.default.Spacer}),w[28]=_):_=w[28],w[29]!==$?(g=(0,t.jsx)("div",{className:M.default.Key,"data-pressed":$,children:"↑"}),w[29]=$,w[30]=g):g=w[30],w[31]===Symbol.for("react.memo_cache_sentinel")?(y=(0,t.jsx)("div",{className:M.default.Spacer}),w[31]=y):y=w[31],w[32]!==g?(v=(0,t.jsxs)("div",{className:M.default.Row,children:[_,g,y]}),w[32]=g,w[33]=v):v=w[33],w[34]!==V?(x=(0,t.jsx)("div",{className:M.default.Key,"data-pressed":V,children:"←"}),w[34]=V,w[35]=x):x=w[35],w[36]!==J?(b=(0,t.jsx)("div",{className:M.default.Key,"data-pressed":J,children:"↓"}),w[36]=J,w[37]=b):b=w[37],w[38]!==Y?(k=(0,t.jsx)("div",{className:M.default.Key,"data-pressed":Y,children:"→"}),w[38]=Y,w[39]=k):k=w[39],w[40]!==x||w[41]!==b||w[42]!==k?(S=(0,t.jsxs)("div",{className:M.default.Row,children:[x,b,k]}),w[40]=x,w[41]=b,w[42]=k,w[43]=S):S=w[43],w[44]!==v||w[45]!==S?(C=(0,t.jsxs)("div",{className:M.default.Column,children:[v,S]}),w[44]=v,w[45]=S,w[46]=C):C=w[46],w[47]!==f||w[48]!==C||w[49]!==u?(j=(0,t.jsxs)("div",{className:M.default.Root,children:[u,f,C]}),w[47]=f,w[48]=C,w[49]=u,w[50]=j):j=w[50],j)}function L(e){return e.lookRight}function H(e){return e.lookLeft}function F(e){return e.lookDown}function G(e){return e.lookUp}function q(e){return e.down}function O(e){return e.up}function A(e){return e.right}function U(e){return e.left}function W(e){return e.backward}function z(e){return e.forward}var K=e.i(71753),$=e.i(15080),J=e.i(79123),V=e.i(78295);function Y(e){let t=e.querySelector(".back");t&&(t.style.background="rgba(3, 79, 76, 0.6)",t.style.border="1px solid rgba(0, 219, 223, 0.5)",t.style.boxShadow="inset 0 0 10px rgba(0, 0, 0, 0.7)");let a=e.querySelector(".front");a&&(a.style.background="radial-gradient(circle at 50% 50%, rgba(23, 247, 198, 0.9) 0%, rgba(9, 184, 170, 0.95) 100%)",a.style.border="2px solid rgba(255, 255, 255, 0.4)",a.style.boxShadow="0 2px 4px rgba(0, 0, 0, 0.5), 0 1px 1px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15), inset 0 -1px 2px rgba(0, 0, 0, 0.3)")}let X=Math.PI/2-.01;function Z({joystickState:a,joystickZone:n,lookJoystickState:s,lookJoystickZone:o}){let{touchMode:l}=(0,J.useControls)();(0,r.useEffect)(()=>{let t=n.current;if(!t)return;let r=null,s=!1;return e.A(84968).then(e=>{s||(r=e.default.create({zone:t,mode:"static",position:{left:"70px",bottom:"70px"},size:120,restOpacity:.9}),Y(t),r.on("move",(e,t)=>{a.current.angle=t.angle.radian,a.current.force=Math.min(1,t.force)}),r.on("end",()=>{a.current.force=0}))}),()=>{s=!0,r?.destroy()}},[a,n,l]),(0,r.useEffect)(()=>{if("dualStick"!==l)return;let t=o.current;if(!t)return;let a=null,r=!1;return e.A(84968).then(e=>{r||(a=e.default.create({zone:t,mode:"static",position:{right:"70px",bottom:"70px"},size:120,restOpacity:.9}),Y(t),a.on("move",(e,t)=>{s.current.angle=t.angle.radian,s.current.force=Math.min(1,t.force)}),a.on("end",()=>{s.current.force=0}))}),()=>{r=!0,a?.destroy()}},[l,s,o]);let i=()=>{document.activeElement instanceof HTMLElement&&document.activeElement.blur()};return"dualStick"===l?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{ref:n,className:V.default.Left,onContextMenu:e=>e.preventDefault(),onTouchStart:i}),(0,t.jsx)("div",{ref:o,className:V.default.Right,onContextMenu:e=>e.preventDefault(),onTouchStart:i})]}):(0,t.jsx)("div",{ref:n,className:V.default.Joystick,onContextMenu:e=>e.preventDefault(),onTouchStart:i})}function Q(e){let t,n,o,l,i,c,u,d,m,h,p=(0,a.c)(25),{joystickState:f,joystickZone:_,lookJoystickState:g}=e,{speedMultiplier:y,touchMode:v}=(0,J.useControls)(),{camera:x,gl:b}=(0,$.useThree)();p[0]===Symbol.for("react.memo_cache_sentinel")?(t=new s.Euler(0,0,0,"YXZ"),p[0]=t):t=p[0];let k=(0,r.useRef)(t),S=(0,r.useRef)(null);p[1]===Symbol.for("react.memo_cache_sentinel")?(n={x:0,y:0},p[1]=n):n=p[1];let C=(0,r.useRef)(n);p[2]===Symbol.for("react.memo_cache_sentinel")?(o=new s.Vector3,p[2]=o):o=p[2];let j=(0,r.useRef)(o);p[3]===Symbol.for("react.memo_cache_sentinel")?(l=new s.Vector3,p[3]=l):l=p[3];let w=(0,r.useRef)(l);p[4]===Symbol.for("react.memo_cache_sentinel")?(i=new s.Vector3,p[4]=i):i=p[4];let N=(0,r.useRef)(i);return p[5]!==x.quaternion?(c=()=>{k.current.setFromQuaternion(x.quaternion,"YXZ")},p[5]=x.quaternion,p[6]=c):c=p[6],p[7]!==x?(u=[x],p[7]=x,p[8]=u):u=p[8],(0,r.useEffect)(c,u),p[9]!==x.quaternion||p[10]!==b.domElement||p[11]!==_||p[12]!==v?(d=()=>{if("moveLookStick"!==v)return;let e=b.domElement,t=e=>{let t=_.current;if(!t)return!1;let a=t.getBoundingClientRect();return e.clientX>=a.left&&e.clientX<=a.right&&e.clientY>=a.top&&e.clientY<=a.bottom},a=e=>{if(null===S.current)for(let a=0;a{if(null!==S.current)for(let t=0;t{for(let t=0;t{e.removeEventListener("touchstart",a),e.removeEventListener("touchmove",r),e.removeEventListener("touchend",n),e.removeEventListener("touchcancel",n),S.current=null}},p[9]=x.quaternion,p[10]=b.domElement,p[11]=_,p[12]=v,p[13]=d):d=p[13],p[14]!==x||p[15]!==b.domElement||p[16]!==_||p[17]!==v?(m=[x,b.domElement,_,v],p[14]=x,p[15]=b.domElement,p[16]=_,p[17]=v,p[18]=m):m=p[18],(0,r.useEffect)(d,m),p[19]!==x||p[20]!==f.current||p[21]!==g||p[22]!==y||p[23]!==v?(h=(e,t)=>{let{force:a,angle:r}=f.current;if("dualStick"===v){let e=g.current;if(e.force>.15){let a=(e.force-.15)/.85,r=Math.cos(e.angle),n=Math.sin(e.angle);k.current.setFromQuaternion(x.quaternion,"YXZ"),k.current.y=k.current.y-r*a*2.5*t,k.current.x=k.current.x+n*a*2.5*t,k.current.x=Math.max(-X,Math.min(X,k.current.x)),x.quaternion.setFromEuler(k.current)}if(a>.08){let e=80*y*((a-.08)/.92),n=Math.cos(r),s=Math.sin(r);x.getWorldDirection(j.current),j.current.normalize(),w.current.crossVectors(x.up,j.current).normalize(),N.current.set(0,0,0).addScaledVector(j.current,s).addScaledVector(w.current,-n),N.current.lengthSq()>0&&(N.current.normalize().multiplyScalar(e*t),x.position.add(N.current))}}else if("moveLookStick"===v&&a>0){let e=80*y*.5;if(x.getWorldDirection(j.current),j.current.normalize(),N.current.copy(j.current).multiplyScalar(e*t),x.position.add(N.current),a>=.15){let e=Math.cos(r),n=Math.sin(r),s=(a-.15)/.85;k.current.setFromQuaternion(x.quaternion,"YXZ"),k.current.y=k.current.y-e*s*1.25*t,k.current.x=k.current.x+n*s*1.25*t,k.current.x=Math.max(-X,Math.min(X,k.current.x)),x.quaternion.setFromEuler(k.current)}}},p[19]=x,p[20]=f.current,p[21]=g,p[22]=y,p[23]=v,p[24]=h):h=p[24],(0,K.useFrame)(h),null}var ee=e.i(11889),et=e.i(56373),ea=e.i(86447),er=e.i(1559),en=e.i(78440),es=e.i(59129),eo=e.i(25998),el=e.i(18364),ei=e.i(70238),ec=e.i(29402),eu=e.i(97442);let ed=new Set(["SkiFree","SkiFree_Daily","SkiFree_Randomizer"]),em={"missions.vl2":"Official","TR2final105-client.vl2":"Team Rabbit 2","z_mappacks/CTF/Classic_maps_v1.vl2":"Classic","z_mappacks/CTF/DynamixFinalPack.vl2":"Official","z_mappacks/CTF/KryMapPack_b3EDIT.vl2":"KryMapPack","z_mappacks/CTF/S5maps.vl2":"S5","z_mappacks/CTF/S8maps.vl2":"S8","z_mappacks/CTF/TWL-MapPack.vl2":"TWL","z_mappacks/CTF/TWL-MapPackEDIT.vl2":"TWL","z_mappacks/CTF/TWL2-MapPack.vl2":"TWL2","z_mappacks/CTF/TWL2-MapPackEDIT.vl2":"TWL2","z_mappacks/TWL_T2arenaOfficialMaps.vl2":"Arena","z_mappacks/xPack2.vl2":"xPack2","z_mappacks/z_DMP2-V0.6.vl2":"DMP2 (Discord Map Pack)","z_mappacks/zDMP-4.7.3DX.vl2":"DMP (Discord Map Pack)","z_mappacks/zDMP-4.7.3DX-ServerOnly.vl2":"DMP (Discord Map Pack)"},eh={"z_mappacks/DM":"DM","z_mappacks/LCTF":"LCTF","z_mappacks/Lak":"LakRabbit"},ep=(0,f.getMissionList)().filter(e=>!ed.has(e)).map(e=>{let t,a=(0,f.getMissionInfo)(e),[r]=(0,f.getSourceAndPath)(a.resourcePath),n=(t=r.match(/^(.*)(\/[^/]+)$/))?t[1]:"",s=em[r]??eh[n]??null;return{resourcePath:a.resourcePath,missionName:e,displayName:a.displayName,sourcePath:r,groupName:s,missionTypes:a.missionTypes}}),ef=new Map(ep.map(e=>[e.missionName,e])),e_=function(e){let t=new Map;for(let a of e){let e=t.get(a.groupName)??[];e.push(a),t.set(a.groupName,e)}return t.forEach((e,a)=>{t.set(a,(0,ec.default)(e,[e=>(e.displayName||e.missionName).toLowerCase()],["asc"]))}),(0,ec.default)(Array.from(t.entries()),[([e])=>"Official"===e?0:null==e?2:1,([e])=>e?e.toLowerCase():""],["asc","asc"])}(ep),eg="u">typeof navigator&&/Mac|iPhone|iPad|iPod/.test(navigator.platform);function ey(e){let r,n,s,o,l,i=(0,a.c)(12),{mission:c}=e,u=c.displayName||c.missionName;return i[0]!==u?(r=(0,t.jsx)("span",{className:eu.default.ItemName,children:u}),i[0]=u,i[1]=r):r=i[1],i[2]!==c.missionTypes?(n=c.missionTypes.length>0&&(0,t.jsx)("span",{className:eu.default.ItemTypes,children:c.missionTypes.map(ev)}),i[2]=c.missionTypes,i[3]=n):n=i[3],i[4]!==r||i[5]!==n?(s=(0,t.jsxs)("span",{className:eu.default.ItemHeader,children:[r,n]}),i[4]=r,i[5]=n,i[6]=s):s=i[6],i[7]!==c.missionName?(o=(0,t.jsx)("span",{className:eu.default.ItemMissionName,children:c.missionName}),i[7]=c.missionName,i[8]=o):o=i[8],i[9]!==s||i[10]!==o?(l=(0,t.jsxs)(t.Fragment,{children:[s,o]}),i[9]=s,i[10]=o,i[11]=l):l=i[11],l}function ev(e){return(0,t.jsx)("span",{className:eu.default.ItemType,"data-mission-type":e,children:e},e)}function ex(e){let n,s,o,l,i,c,u,d,m,h,p,_,g,y,v,x,b,k=(0,a.c)(46),{value:S,missionType:C,onChange:j,disabled:w}=e,[N,I]=(0,r.useState)(""),T=(0,r.useRef)(null),P=(0,r.useRef)(C);k[0]===Symbol.for("react.memo_cache_sentinel")?(n=e=>{(0,r.startTransition)(()=>I(e))},k[0]=n):n=k[0];let B=(0,el.useComboboxStore)({resetValueOnHide:!0,selectedValue:S,setSelectedValue:e=>{if(e){let t=P.current,a=(0,f.getMissionInfo)(e).missionTypes;t&&a.includes(t)||(t=a[0]),j({missionName:e,missionType:t}),T.current?.blur()}},setValue:n});k[1]!==B?(s=()=>{let e=e=>{"k"===e.key&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),T.current?.focus(),B.show())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},o=[B],k[1]=B,k[2]=s,k[3]=o):(s=k[2],o=k[3]),(0,r.useEffect)(s,o),k[4]!==S?(l=ef.get(S),k[4]=S,k[5]=l):l=k[5];let D=l;e:{let e,t;if(!N){let e;k[6]===Symbol.for("react.memo_cache_sentinel")?(e={type:"grouped",groups:e_},k[6]=e):e=k[6],i=e;break e}k[7]!==N?(e=(0,ei.matchSorter)(ep,N,{keys:["displayName","missionName","missionTypes","groupName"]}),k[7]=N,k[8]=e):e=k[8];let a=e;k[9]!==a?(t={type:"flat",missions:a},k[9]=a,k[10]=t):t=k[10],i=t}let E=i,M=D?D.displayName||D.missionName:S,R="flat"===E.type?0===E.missions.length:0===E.groups.length,L=e=>(0,t.jsx)(et.ComboboxItem,{value:e.missionName,className:eu.default.Item,focusOnHover:!0,onClick:t=>{if(t.target&&t.target instanceof HTMLElement){let a=t.target.dataset.missionType;a?(P.current=a,e.missionName===S&&j({missionName:e.missionName,missionType:a})):P.current=null}else P.current=null},children:(0,t.jsx)(ey,{mission:e})},e.missionName),H=en.ComboboxProvider;k[11]!==B?(c=()=>{try{document.exitPointerLock()}catch{}B.show()},u=e=>{"Escape"!==e.key||B.getState().open||T.current?.blur()},k[11]=B,k[12]=c,k[13]=u):(c=k[12],u=k[13]),k[14]!==w||k[15]!==M||k[16]!==c||k[17]!==u?(d=(0,t.jsx)(ee.Combobox,{ref:T,autoSelect:!0,disabled:w,placeholder:M,className:eu.default.Input,onFocus:c,onKeyDown:u}),k[14]=w,k[15]=M,k[16]=c,k[17]=u,k[18]=d):d=k[18],k[19]!==M?(m=(0,t.jsx)("span",{className:eu.default.SelectedName,children:M}),k[19]=M,k[20]=m):m=k[20],k[21]!==C?(h=C&&(0,t.jsx)("span",{className:eu.default.ItemType,"data-mission-type":C,children:C}),k[21]=C,k[22]=h):h=k[22],k[23]!==h||k[24]!==m?(p=(0,t.jsxs)("div",{className:eu.default.SelectedValue,children:[m,h]}),k[23]=h,k[24]=m,k[25]=p):p=k[25],k[26]===Symbol.for("react.memo_cache_sentinel")?(_=(0,t.jsx)("kbd",{className:eu.default.Shortcut,children:eg?"⌘K":"^K"}),k[26]=_):_=k[26],k[27]!==p||k[28]!==d?(g=(0,t.jsxs)("div",{className:eu.default.InputWrapper,children:[d,p,_]}),k[27]=p,k[28]=d,k[29]=g):g=k[29];let F=er.ComboboxPopover,G=eu.default,q=ea.ComboboxList,O=eu.default,A="flat"===E.type?E.missions.map(L):E.groups.map(e=>{let[a,n]=e;return a?(0,t.jsxs)(es.ComboboxGroup,{className:eu.default.Group,children:[(0,t.jsx)(eo.ComboboxGroupLabel,{className:eu.default.GroupLabel,children:a}),n.map(L)]},a):(0,t.jsx)(r.Fragment,{children:n.map(L)},"ungrouped")});return k[30]!==R?(y=R&&(0,t.jsx)("div",{className:eu.default.NoResults,children:"No missions found"}),k[30]=R,k[31]=y):y=k[31],k[32]!==q||k[33]!==O.List||k[34]!==A||k[35]!==y?(v=(0,t.jsxs)(q,{className:O.List,children:[A,y]}),k[32]=q,k[33]=O.List,k[34]=A,k[35]=y,k[36]=v):v=k[36],k[37]!==F||k[38]!==G.Popover||k[39]!==v?(x=(0,t.jsx)(F,{gutter:4,fitViewport:!0,autoFocusOnHide:!1,className:G.Popover,children:v}),k[37]=F,k[38]=G.Popover,k[39]=v,k[40]=x):x=k[40],k[41]!==H||k[42]!==B||k[43]!==g||k[44]!==x?(b=(0,t.jsxs)(H,{store:B,children:[g,x]}),k[41]=H,k[42]=B,k[43]=g,k[44]=x,k[45]=b):b=k[45],b}var eb=e.i(11152),ek=e.i(40141);function eS(e){return(0,ek.GenIcon)({tag:"svg",attr:{viewBox:"0 0 384 512"},child:[{tag:"path",attr:{d:"M192 0c-41.8 0-77.4 26.7-90.5 64L64 64C28.7 64 0 92.7 0 128L0 448c0 35.3 28.7 64 64 64l256 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64l-37.5 0C269.4 26.7 233.8 0 192 0zm0 64a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM305 273L177 401c-9.4 9.4-24.6 9.4-33.9 0L79 337c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L271 239c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"},child:[]}]})(e)}var eC=e.i(36679);function ej(e){let n,s,o,l,i,c=(0,a.c)(11),{cameraRef:u,missionName:d,missionType:m}=e,{fogEnabled:h}=(0,J.useSettings)(),[p,f]=(0,r.useState)(!1),_=(0,r.useRef)(null);c[0]!==u||c[1]!==h||c[2]!==d||c[3]!==m?(n=async()=>{clearTimeout(_.current);let e=u.current;if(!e)return;let t=function({position:e,quaternion:t}){let a=e=>parseFloat(e.toFixed(3)),r=`${a(e.x)},${a(e.y)},${a(e.z)}`,n=`${a(t.x)},${a(t.y)},${a(t.z)},${a(t.w)}`;return`#c${r}~${n}`}(e),a=new URLSearchParams;a.set("mission",`${d}~${m}`),a.set("fog",h.toString());let r=`${window.location.pathname}?${a}${t}`,n=`${window.location.origin}${r}`;window.history.replaceState(null,"",r);try{await navigator.clipboard.writeText(n),f(!0),_.current=setTimeout(()=>{f(!1)},1100)}catch(e){console.error(e)}},c[0]=u,c[1]=h,c[2]=d,c[3]=m,c[4]=n):n=c[4];let g=n,y=p?"true":"false";return c[5]===Symbol.for("react.memo_cache_sentinel")?(s=(0,t.jsx)(eb.FaMapPin,{className:eC.default.MapPin}),o=(0,t.jsx)(eS,{className:eC.default.ClipboardCheck}),l=(0,t.jsx)("span",{className:eC.default.ButtonLabel,children:" Copy coordinates URL"}),c[5]=s,c[6]=o,c[7]=l):(s=c[5],o=c[6],l=c[7]),c[8]!==g||c[9]!==y?(i=(0,t.jsxs)("button",{type:"button",className:eC.default.Root,"aria-label":"Copy coordinates URL",title:"Copy coordinates URL",onClick:g,"data-copied":y,id:"copyCoordinatesButton",children:[s,o,l]}),c[8]=g,c[9]=y,c[10]=i):i=c[10],i}function ew(e){return(0,ek.GenIcon)({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"},child:[]},{tag:"path",attr:{d:"M21 3H3c-1.11 0-2 .89-2 2v12a2 2 0 0 0 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5a2 2 0 0 0-2-2zm0 14H3V5h18v12zm-5-6-7 4V7z"},child:[]}]})(e)}e.i(50593);var eN=e.i(17711),eI=e.i(58281);e.i(70847);var eT=e.i(47566),eP=e.i(25311),eB=e.i(89119),eD=e.i(10244);class eE extends eD.StreamEngine{parser;initialBlock;moveTicks=0;absoluteYaw=0;absolutePitch=0;lastAbsYaw=0;lastAbsPitch=0;exhausted=!1;_teamScoresGen=0;_rosterGen=0;_weaponsHudGen=0;_inventoryHudGen=0;_cachedSnapshot=null;_cachedSnapshotTick=-1;_snap=null;constructor(e){super(),this.parser=e,this.registry=e.getRegistry(),this.ghostTracker=e.getGhostTracker();const t=e.initialBlock;this.initialBlock={dataBlocks:t.dataBlocks,initialGhosts:t.initialGhosts,controlObjectGhostIndex:t.controlObjectGhostIndex,controlObjectData:t.controlObjectData,targetEntries:t.targetEntries,sensorGroupColors:t.sensorGroupColors,taggedStrings:t.taggedStrings,initialEvents:t.initialEvents,demoValues:t.demoValues},this.reset()}getDataBlockData(e){let t=this.initialBlock.dataBlocks.get(e);if(t?.data)return t.data;let a=this.parser.getPacketParser();return a.dataBlockDataMap?.get(e)}_shapeConstructorCache=null;getShapeConstructorSequences(e){if(!this._shapeConstructorCache)for(let[,e]of(this._shapeConstructorCache=new Map,this.initialBlock.dataBlocks)){if("TSShapeConstructor"!==e.className||!e.data)continue;let t=e.data.shape,a=e.data.sequences;t&&a&&this._shapeConstructorCache.set(t.toLowerCase(),a)}return this._shapeConstructorCache.get(e.toLowerCase())}getTimeSec(){return this.moveTicks*(eP.TICK_DURATION_MS/1e3)}getCameraYawPitch(e){let t=!this.isPiloting&&"player"===this.lastControlType,a=t?this.absoluteYaw:this.lastAbsYaw,r=t?this.absolutePitch:this.lastAbsPitch;return t&&(this.lastAbsYaw=a,this.lastAbsPitch=r),{yaw:a,pitch:r}}getControlPlayerHeadPitch(e){return(0,eB.clamp)(this.absolutePitch/eB.MAX_PITCH,-1,1)}onTeamScoresChanged(){this._teamScoresGen++}onRosterChanged(){this._rosterGen++}onWeaponsHudChanged(){this._weaponsHudGen++}onInventoryHudChanged(){this._inventoryHudGen++}reset(){for(let[e,t]of(this.parser.reset(),this.ghostTracker=this.parser.getGhostTracker(),this._cachedSnapshot=null,this._cachedSnapshotTick=-1,this._snap=null,this.resetSharedState(),this.initialBlock.taggedStrings))this.netStrings.set(e,t);for(let e of this.initialBlock.targetEntries)e.name&&this.targetNames.set(e.targetId,(0,eB.stripTaggedStringMarkup)(e.name)),this.targetTeams.set(e.targetId,e.sensorGroup),this.targetRenderFlags.set(e.targetId,e.targetData);for(let e of this.initialBlock.sensorGroupColors){let t=this.sensorGroupColors.get(e.group);t||(t=new Map,this.sensorGroupColors.set(e.group,t)),t.set(e.targetGroup,{r:e.r,g:e.g,b:e.b})}if(this.moveTicks=0,this.absoluteYaw=0,this.absolutePitch=0,this.lastAbsYaw=0,this.lastAbsPitch=0,this.lastControlType=(0,eB.detectControlObjectType)(this.initialBlock.controlObjectData)??"player",this.isPiloting="player"===this.lastControlType&&!!(this.initialBlock.controlObjectData?.pilot||this.initialBlock.controlObjectData?.controlObjectGhost!=null),this.lastCameraMode="camera"===this.lastControlType&&"number"==typeof this.initialBlock.controlObjectData?.cameraMode?this.initialBlock.controlObjectData.cameraMode:void 0,this.lastOrbitGhostIndex="camera"===this.lastControlType&&"number"==typeof this.initialBlock.controlObjectData?.orbitObjectGhostIndex?this.initialBlock.controlObjectData.orbitObjectGhostIndex:void 0,"camera"===this.lastControlType){let e=this.initialBlock.controlObjectData?.minOrbitDist,t=this.initialBlock.controlObjectData?.maxOrbitDist,a=this.initialBlock.controlObjectData?.curOrbitDist;"number"==typeof e&&"number"==typeof t&&Number.isFinite(e)&&Number.isFinite(t)?this.lastOrbitDistance=Math.max(0,t-e):"number"==typeof a&&Number.isFinite(a)?this.lastOrbitDistance=Math.max(0,a):this.lastOrbitDistance=void 0}else this.lastOrbitDistance=void 0;let e=this.getAbsoluteRotation(this.initialBlock.controlObjectData);for(let t of(e&&(this.absoluteYaw=e.yaw,this.absolutePitch=e.pitch,this.lastAbsYaw=e.yaw,this.lastAbsPitch=e.pitch),this.exhausted=!1,this.latestFov=100,this.latestControl={ghostIndex:this.initialBlock.controlObjectGhostIndex,data:this.initialBlock.controlObjectData,position:(0,eB.isValidPosition)(this.initialBlock.controlObjectData?.position)?this.initialBlock.controlObjectData?.position:void 0},this.controlPlayerGhostId="player"===this.lastControlType&&this.initialBlock.controlObjectGhostIndex>=0?(0,eP.toEntityId)("Player",this.initialBlock.controlObjectGhostIndex):void 0,this.initialBlock.initialGhosts)){if("create"!==t.type||null==t.classId)continue;let e=this.registry.getGhostParser(t.classId)?.name;if(!e)throw Error(`No ghost parser for classId ${t.classId} (ghost index ${t.index})`);let a=(0,eP.toEntityId)(e,t.index),r={id:a,ghostIndex:t.index,className:e,spawnTick:0,type:(0,eP.toEntityType)(e),rotation:[0,0,0,1]};if(this.applyGhostData(r,t.parsedData),t.parsedData){let a=(0,eT.ghostToSceneObject)(e,t.index,t.parsedData);a&&(r.sceneData=a)}this.entities.set(a,r),this.entityIdByGhostIndex.set(t.index,a)}if(0===this.playerSensorGroup&&"player"===this.lastControlType&&this.latestControl.ghostIndex>=0){let e=this.entityIdByGhostIndex.get(this.latestControl.ghostIndex),t=e?this.entities.get(e):void 0;t?.sensorGroup!=null&&t.sensorGroup>0&&(this.playerSensorGroup=t.sensorGroup)}for(let e of this.initialBlock.initialEvents){let t=this.registry.getEventParser(e.classId)?.name;if("SetSensorGroupEvent"===t&&e.parsedData){let t=e.parsedData.sensorGroup;null!=t&&(this.playerSensorGroup=t)}else if("RemoteCommandEvent"===t&&e.parsedData){let t=this.resolveNetString(e.parsedData.funcName),a=e.parsedData.args;"ServerMessage"===t&&this.handleServerMessage(a),this.handleHudRemoteCommand(t,a)}}let t=function(e){let t={weaponsHud:null,backpackHud:null,inventoryHud:null,teamScores:[],playerRoster:new Map,chatMessages:[],gravity:-20};if(!e.length)return t;let a=0,r=()=>{let t=e[a++];return""===t?"":t??""};if(r(),a>=e.length)return t;let n=parseInt(r(),10)||0,s=new Map;for(let e=0;e0&&s.set(o,(s.get(o)??0)+1)}if(a>=e.length||(r(),a>=e.length))return t;{let e=r().split(" "),a=e[0]??"",n="1"===e[1]||"true"===e[1],s=e[2]??"",o="1"===e[4]||"true"===e[4];n&&a&&(t.backpackHud={packIndex:(0,eB.backpackBitmapToIndex)(a),active:o,text:s})}if(a>=e.length)return t;let o=r().split(" "),l=parseInt(o[4],10)||0,i=parseInt(o[5],10)||0,c=parseInt(o[6],10);for(let e=0;e=e.length)return t;let d=r().split(" "),m=parseInt(d[4],10)||0,h=parseInt(d[5],10)||0,p=parseInt(d[6],10);for(let e=0;e0)||e.set(a,n)}e.size>0&&(t.inventoryHud={slots:e,activeSlot:isNaN(p)?-1:p})}if(a>=e.length)return t;let f=r().split(" "),_=f[1]??"",g=parseInt(f[2],10)||0,y=[];for(let e=0;e=8)for(let e=0;e<2;e++){let a=4*e,r=e+1;t.teamScores.push({teamId:r,name:y[a]??"",score:parseInt(y[a+1],10)||0,playerCount:s.get(r)??0})}else if("TR2Game"===_&&g>=4)for(let e=0;e<2;e++){let a=2*e,r=e+1;t.teamScores.push({teamId:r,name:y[a+1]??"",score:parseInt(y[a],10)||0,playerCount:s.get(r)??0})}if(a>=e.length)return t;r();for(let n=0;n<10&&!(a>=e.length);n++){let e=r();e&&t.chatMessages.push(e)}if(ae.text).join("");if(!a.trim())continue;let r=t[0].colorCode;if(t.some(e=>3===e.colorCode||4===e.colorCode)&&a.includes(": ")){let e=a.indexOf(": ");this.chatMessages.push({timeSec:0,sender:a.slice(0,e),text:a.slice(e+2),kind:"chat",colorCode:r,segments:t})}else this.chatMessages.push({timeSec:0,sender:"",text:a,kind:"server",colorCode:r,segments:t})}this.updateCameraAndHud()}getSnapshot(){if(this._cachedSnapshot&&this._cachedSnapshotTick===this.moveTicks)return this._cachedSnapshot;let e=this.buildSnapshot();return this._cachedSnapshot=e,this._cachedSnapshotTick=this.moveTicks,e}getEffectShapes(){let e=new Set,t=t=>{let a=t.dtsFileName;a&&e.add(a);let r=t.subExplosions;if(Array.isArray(r))for(let t of r){if(null==t)continue;let a=this.getDataBlockData(t);a?.dtsFileName&&e.add(a.dtsFileName)}};for(let[,e]of this.initialBlock.dataBlocks){let a=e.data?.explosion;if(null==a)continue;let r=this.getDataBlockData(a);r&&t(r)}return[...e]}stepToTime(e,t=1/0){let a=Math.floor(1e3*(Number.isFinite(e)?Math.max(0,e):0)/eP.TICK_DURATION_MS),r=!1;a({index:e,ammo:t})),activeIndex:this.weaponsHud.activeIndex},l=r&&r.inventoryHudGen===this._inventoryHudGen?r.inventoryHud:{slots:Array.from(this.inventoryHud.slots.entries()).map(([e,t])=>({slot:e,count:t})),activeSlot:this.inventoryHud.activeSlot},i=r&&r.backpackPackIndex===this.backpackHud.packIndex&&r.backpackActive===this.backpackHud.active&&r.backpackText===this.backpackHud.text?r.backpackHud:this.backpackHud.packIndex>=0?{...this.backpackHud}:null;if(r&&r.teamScoresGen===this._teamScoresGen&&r.rosterGen===this._rosterGen)e=r.teamScores;else{e=this.teamScores.map(e=>({...e}));let t=new Map;for(let{teamId:e}of this.playerRoster.values())e>0&&t.set(e,(t.get(e)??0)+1);for(let a of e)a.playerCount=t.get(a.teamId)??0}return this._snap={teamScoresGen:this._teamScoresGen,rosterGen:this._rosterGen,teamScores:e,weaponsHudGen:this._weaponsHudGen,weaponsHud:o,inventoryHudGen:this._inventoryHudGen,inventoryHud:l,backpackPackIndex:this.backpackHud.packIndex,backpackActive:this.backpackHud.active,backpackText:this.backpackHud.text,backpackHud:i},{timeSec:a,exhausted:this.exhausted,camera:this.camera,entities:t,controlPlayerGhostId:this.controlPlayerGhostId,playerSensorGroup:this.playerSensorGroup,status:this.lastStatus,chatMessages:n,audioEvents:s,weaponsHud:o,backpackHud:i,inventoryHud:l,teamScores:e}}isPacketData(e){return!!e&&"object"==typeof e&&"gameState"in e&&"events"in e&&"ghosts"in e}isMoveData(e){return!!e&&"object"==typeof e&&"yaw"in e}isInfoData(e){return!!e&&"object"==typeof e&&"value2"in e&&"number"==typeof e.value2}}async function eM(e){let t=new eI.DemoParser(new Uint8Array(e)),{header:a,initialBlock:r}=await t.load(),{missionName:n,gameType:s}=function(e){let t=null,a=null;for(let r=0;r{if(h){_.current=_.current+1,p(null);return}f.current?.click()},d[0]=h,d[1]=p,d[2]=e):e=d[2];let g=e;d[3]!==p?(n=async e=>{let t=e.target.files?.[0];if(t){e.target.value="";try{let e=await t.arrayBuffer(),a=_.current+1;_.current=a;let r=await eM(e);if(_.current!==a)return;p(r)}catch(e){console.error("Failed to load demo:",e)}}},d[3]=p,d[4]=n):n=d[4];let y=n;d[5]===Symbol.for("react.memo_cache_sentinel")?(s={display:"none"},d[5]=s):s=d[5],d[6]!==y?(o=(0,t.jsx)("input",{ref:f,type:"file",accept:".rec",style:s,onChange:y}),d[6]=y,d[7]=o):o=d[7];let v=h?"Unload demo":"Load demo (.rec)",x=h?"Unload demo":"Load demo (.rec)",b=h?"true":void 0,k=null!=m&&!h;d[8]===Symbol.for("react.memo_cache_sentinel")?(l=(0,t.jsx)(ew,{className:eR.default.DemoIcon}),d[8]=l):l=d[8];let S=h?"Unload demo":"Demo";return d[9]!==S?(i=(0,t.jsx)("span",{className:eR.default.ButtonLabel,children:S}),d[9]=S,d[10]=i):i=d[10],d[11]!==g||d[12]!==i||d[13]!==v||d[14]!==x||d[15]!==b||d[16]!==k?(c=(0,t.jsxs)("button",{type:"button",className:eR.default.Root,"aria-label":v,title:x,onClick:g,"data-active":b,disabled:k,children:[l,i]}),d[11]=g,d[12]=i,d[13]=v,d[14]=x,d[15]=b,d[16]=k,d[17]=c):c=d[17],d[18]!==c||d[19]!==o?(u=(0,t.jsxs)(t.Fragment,{children:[o,c]}),d[18]=c,d[19]=o,d[20]=u):u=d[20],u}function eH(e){return(0,ek.GenIcon)({tag:"svg",attr:{fill:"currentColor",viewBox:"0 0 16 16"},child:[{tag:"path",attr:{d:"M11.251.068a.5.5 0 0 1 .227.58L9.677 6.5H13a.5.5 0 0 1 .364.843l-8 8.5a.5.5 0 0 1-.842-.49L6.323 9.5H3a.5.5 0 0 1-.364-.843l8-8.5a.5.5 0 0 1 .615-.09z"},child:[]}]})(e)}var eF=e.i(12781),eG=e.i(9607);function eq(e){let r,n,s,o,l,i=(0,a.c)(20),{onOpenServerBrowser:c}=e,u=(0,eF.useLiveConnectionOptional)();if(!u)return null;let d="connected"===u.gameStatus,m="connecting"===u.gameStatus||"challenging"===u.gameStatus||"authenticating"===u.gameStatus,h=d?"Disconnect":"Join server",p=d?"Disconnect":"Join server";i[0]!==d||i[1]!==u||i[2]!==c?(r=()=>{d?u.disconnectServer():c()},i[0]=d,i[1]=u,i[2]=c,i[3]=r):r=i[3];let f=d?"true":void 0,_=`${eG.default.LiveIcon} ${d?eG.default.Pulsing:""}`;if(i[4]!==_?(n=(0,t.jsx)(eH,{className:_}),i[4]=_,i[5]=n):n=i[5],i[6]!==m||i[7]!==d?(s=!d&&(0,t.jsx)("span",{className:eG.default.TextLabel,children:m?"Connecting...":"Connect"}),i[6]=m,i[7]=d,i[8]=s):s=i[8],i[9]!==d||i[10]!==u.ping){var g;o=d&&(0,t.jsx)("span",{className:eG.default.PingLabel,children:null!=u.ping?(g=u.ping)>=1e3?g.toLocaleString()+"ms":g+"ms":"Live"}),i[9]=d,i[10]=u.ping,i[11]=o}else o=i[11];return i[12]!==h||i[13]!==p||i[14]!==r||i[15]!==f||i[16]!==n||i[17]!==s||i[18]!==o?(l=(0,t.jsxs)("button",{type:"button",className:eG.default.Root,"aria-label":h,title:p,onClick:r,"data-active":f,children:[n,s,o]}),i[12]=h,i[13]=p,i[14]=r,i[15]=f,i[16]=n,i[17]=s,i[18]=o,i[19]=l):l=i[19],l}function eO(e){return(0,ek.GenIcon)({tag:"svg",attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"10"},child:[]},{tag:"line",attr:{x1:"12",y1:"16",x2:"12",y2:"12"},child:[]},{tag:"line",attr:{x1:"12",y1:"8",x2:"12.01",y2:"8"},child:[]}]})(e)}function eA(e){return(0,ek.GenIcon)({tag:"svg",attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"3"},child:[]},{tag:"path",attr:{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"},child:[]}]})(e)}var eU=e.i(65883);function eW(e){let n,s,o,l,i,c,u,d,m,h,p,f,_,g,y,v,x,b,k,S,C,j,w,N,I,T,P,B,D,M,R,L,H,F,G,q,O,A,U,W,z=(0,a.c)(95),{missionName:K,missionType:$,onChangeMission:V,onOpenMapInfo:Y,onOpenServerBrowser:X,isTouch:Z,cameraRef:Q}=e,{fogEnabled:ee,setFogEnabled:et,fov:ea,setFov:er,audioEnabled:en,setAudioEnabled:es,animationEnabled:eo,setAnimationEnabled:el}=(0,J.useSettings)(),{speedMultiplier:ei,setSpeedMultiplier:ec,touchMode:eu,setTouchMode:ed}=(0,J.useControls)(),{debugMode:em,setDebugMode:eh}=(0,J.useDebug)(),ep=(0,E.useRecording)(),ef=(0,eF.useLiveConnectionOptional)(),e_=ef?.adapter!=null,eg=null!=ep||e_,ey=eg&&!e_,[ev,eb]=(0,r.useState)(!1),ek=(0,r.useRef)(null),eS=(0,r.useRef)(null),eC=(0,r.useRef)(null);z[0]!==ev?(n=()=>{ev&&ek.current?.focus()},s=[ev],z[0]=ev,z[1]=n,z[2]=s):(n=z[1],s=z[2]),(0,r.useEffect)(n,s),z[3]===Symbol.for("react.memo_cache_sentinel")?(o=e=>{let t=e.relatedTarget;t&&eC.current?.contains(t)||eb(!1)},z[3]=o):o=z[3];let ew=o;z[4]===Symbol.for("react.memo_cache_sentinel")?(l=e=>{"Escape"===e.key&&(eb(!1),eS.current?.focus())},z[4]=l):l=z[4];let eN=l;return z[5]!==eg||z[6]!==K||z[7]!==$||z[8]!==V?(i=(0,t.jsx)("div",{className:eU.default.MissionSelectWrapper,children:(0,t.jsx)(ex,{value:K,missionType:$,onChange:V,disabled:eg})}),z[5]=eg,z[6]=K,z[7]=$,z[8]=V,z[9]=i):i=z[9],z[10]===Symbol.for("react.memo_cache_sentinel")?(c=()=>{eb(ez)},z[10]=c):c=z[10],z[11]===Symbol.for("react.memo_cache_sentinel")?(u=(0,t.jsx)(eA,{}),z[11]=u):u=z[11],z[12]!==ev?(d=(0,t.jsx)("button",{ref:eS,className:eU.default.Toggle,onClick:c,"aria-expanded":ev,"aria-controls":"settingsPanel","aria-label":"Settings",children:u}),z[12]=ev,z[13]=d):d=z[13],z[14]!==Q||z[15]!==K||z[16]!==$?(m=(0,t.jsx)(ej,{missionName:K,missionType:$,cameraRef:Q}),z[14]=Q,z[15]=K,z[16]=$,z[17]=m):m=z[17],z[18]===Symbol.for("react.memo_cache_sentinel")?(h=(0,t.jsx)(eL,{}),z[18]=h):h=z[18],z[19]!==X?(p=X&&(0,t.jsx)(eq,{onOpenServerBrowser:X}),z[19]=X,z[20]=p):p=z[20],z[21]===Symbol.for("react.memo_cache_sentinel")?(f=(0,t.jsx)(eO,{}),_=(0,t.jsx)("span",{className:eU.default.ButtonLabel,children:"Show map info"}),z[21]=f,z[22]=_):(f=z[21],_=z[22]),z[23]!==Y?(g=(0,t.jsxs)("button",{type:"button",className:eU.default.MapInfoButton,"aria-label":"Show map info",onClick:Y,children:[f,_]}),z[23]=Y,z[24]=g):g=z[24],z[25]!==p||z[26]!==g||z[27]!==m?(y=(0,t.jsxs)("div",{className:eU.default.Group,children:[m,h,p,g]}),z[25]=p,z[26]=g,z[27]=m,z[28]=y):y=z[28],z[29]!==et?(v=e=>{et(e.target.checked)},z[29]=et,z[30]=v):v=z[30],z[31]!==ee||z[32]!==v?(x=(0,t.jsx)("input",{id:"fogInput",type:"checkbox",checked:ee,onChange:v}),z[31]=ee,z[32]=v,z[33]=x):x=z[33],z[34]===Symbol.for("react.memo_cache_sentinel")?(b=(0,t.jsx)("label",{htmlFor:"fogInput",children:"Fog?"}),z[34]=b):b=z[34],z[35]!==x?(k=(0,t.jsxs)("div",{className:eU.default.CheckboxField,children:[x,b]}),z[35]=x,z[36]=k):k=z[36],z[37]!==es?(S=e=>{es(e.target.checked)},z[37]=es,z[38]=S):S=z[38],z[39]!==en||z[40]!==S?(C=(0,t.jsx)("input",{id:"audioInput",type:"checkbox",checked:en,onChange:S}),z[39]=en,z[40]=S,z[41]=C):C=z[41],z[42]===Symbol.for("react.memo_cache_sentinel")?(j=(0,t.jsx)("label",{htmlFor:"audioInput",children:"Audio?"}),z[42]=j):j=z[42],z[43]!==C?(w=(0,t.jsxs)("div",{className:eU.default.CheckboxField,children:[C,j]}),z[43]=C,z[44]=w):w=z[44],z[45]!==k||z[46]!==w?(N=(0,t.jsxs)("div",{className:eU.default.Group,children:[k,w]}),z[45]=k,z[46]=w,z[47]=N):N=z[47],z[48]!==el?(I=e=>{el(e.target.checked)},z[48]=el,z[49]=I):I=z[49],z[50]!==eo||z[51]!==I?(T=(0,t.jsx)("input",{id:"animationInput",type:"checkbox",checked:eo,onChange:I}),z[50]=eo,z[51]=I,z[52]=T):T=z[52],z[53]===Symbol.for("react.memo_cache_sentinel")?(P=(0,t.jsx)("label",{htmlFor:"animationInput",children:"Animation?"}),z[53]=P):P=z[53],z[54]!==T?(B=(0,t.jsxs)("div",{className:eU.default.CheckboxField,children:[T,P]}),z[54]=T,z[55]=B):B=z[55],z[56]!==eh?(D=e=>{eh(e.target.checked)},z[56]=eh,z[57]=D):D=z[57],z[58]!==em||z[59]!==D?(M=(0,t.jsx)("input",{id:"debugInput",type:"checkbox",checked:em,onChange:D}),z[58]=em,z[59]=D,z[60]=M):M=z[60],z[61]===Symbol.for("react.memo_cache_sentinel")?(R=(0,t.jsx)("label",{htmlFor:"debugInput",children:"Debug?"}),z[61]=R):R=z[61],z[62]!==M?(L=(0,t.jsxs)("div",{className:eU.default.CheckboxField,children:[M,R]}),z[62]=M,z[63]=L):L=z[63],z[64]!==B||z[65]!==L?(H=(0,t.jsxs)("div",{className:eU.default.Group,children:[B,L]}),z[64]=B,z[65]=L,z[66]=H):H=z[66],z[67]!==ea||z[68]!==ey||z[69]!==er?(F=ey?null:(0,t.jsxs)("div",{className:eU.default.Field,children:[(0,t.jsx)("label",{htmlFor:"fovInput",children:"FOV"}),(0,t.jsx)("input",{id:"fovInput",type:"range",min:75,max:120,step:5,value:ea,onChange:e=>er(parseInt(e.target.value))}),(0,t.jsx)("output",{htmlFor:"fovInput",children:ea})]}),z[67]=ea,z[68]=ey,z[69]=er,z[70]=F):F=z[70],z[71]!==ey||z[72]!==ec||z[73]!==ei?(G=ey?null:(0,t.jsxs)("div",{className:eU.default.Field,children:[(0,t.jsx)("label",{htmlFor:"speedInput",children:"Speed"}),(0,t.jsx)("input",{id:"speedInput",type:"range",min:.1,max:5,step:.05,value:ei,onChange:e=>ec(parseFloat(e.target.value))})]}),z[71]=ey,z[72]=ec,z[73]=ei,z[74]=G):G=z[74],z[75]!==F||z[76]!==G?(q=(0,t.jsxs)("div",{className:eU.default.Group,children:[F,G]}),z[75]=F,z[76]=G,z[77]=q):q=z[77],z[78]!==Z||z[79]!==ed||z[80]!==eu?(O=Z&&(0,t.jsx)("div",{className:eU.default.Group,children:(0,t.jsxs)("div",{className:eU.default.Field,children:[(0,t.jsx)("label",{htmlFor:"touchModeInput",children:"Joystick:"})," ",(0,t.jsxs)("select",{id:"touchModeInput",value:eu,onChange:e=>ed(e.target.value),children:[(0,t.jsx)("option",{value:"dualStick",children:"Dual Stick"}),(0,t.jsx)("option",{value:"moveLookStick",children:"Single Stick"})]})]})}),z[78]=Z,z[79]=ed,z[80]=eu,z[81]=O):O=z[81],z[82]!==ev||z[83]!==y||z[84]!==N||z[85]!==H||z[86]!==q||z[87]!==O?(A=(0,t.jsxs)("div",{className:eU.default.Dropdown,ref:ek,id:"settingsPanel",tabIndex:-1,onKeyDown:eN,onBlur:ew,"data-open":ev,children:[y,N,H,q,O]}),z[82]=ev,z[83]=y,z[84]=N,z[85]=H,z[86]=q,z[87]=O,z[88]=A):A=z[88],z[89]!==A||z[90]!==d?(U=(0,t.jsxs)("div",{ref:eC,children:[d,A]}),z[89]=A,z[90]=d,z[91]=U):U=z[91],z[92]!==U||z[93]!==i?(W=(0,t.jsxs)("div",{id:"controls",className:eU.default.Controls,onKeyDown:eJ,onPointerDown:e$,onClick:eK,children:[i,U]}),z[92]=U,z[93]=i,z[94]=W):W=z[94],W}function ez(e){return!e}function eK(e){return e.stopPropagation()}function e$(e){return e.stopPropagation()}function eJ(e){return e.stopPropagation()}let eV=()=>null;var eY=e.i(31067);let eX=r.forwardRef(({envMap:e,resolution:t=256,frames:a=1/0,makeDefault:n,children:o,...l},i)=>{let c=(0,$.useThree)(({set:e})=>e),u=(0,$.useThree)(({camera:e})=>e),d=(0,$.useThree)(({size:e})=>e),m=r.useRef(null);r.useImperativeHandle(i,()=>m.current,[]);let h=r.useRef(null),p=function(e,t,a){let n=(0,$.useThree)(e=>e.size),o=(0,$.useThree)(e=>e.viewport),l="number"==typeof e?e:n.width*o.dpr,i=n.height*o.dpr,c=("number"==typeof e?void 0:e)||{},{samples:u=0,depth:d,...m}=c,h=null!=d?d:c.depthBuffer,p=r.useMemo(()=>{let e=new s.WebGLRenderTarget(l,i,{minFilter:s.LinearFilter,magFilter:s.LinearFilter,type:s.HalfFloatType,...m});return h&&(e.depthTexture=new s.DepthTexture(l,i,s.FloatType)),e.samples=u,e},[]);return r.useLayoutEffect(()=>{p.setSize(l,i),u&&(p.samples=u)},[u,p,l,i]),r.useEffect(()=>()=>p.dispose(),[]),p}(t);r.useLayoutEffect(()=>{l.manual||(m.current.aspect=d.width/d.height)},[d,l]),r.useLayoutEffect(()=>{m.current.updateProjectionMatrix()});let f=0,_=null,g="function"==typeof o;return(0,K.useFrame)(t=>{g&&(a===1/0||f{if(n)return c(()=>({camera:m.current})),()=>c(()=>({camera:u}))},[m,n,c]),r.createElement(r.Fragment,null,r.createElement("perspectiveCamera",(0,eY.default)({ref:m},l),!g&&o),r.createElement("group",{ref:h},g&&o(p.texture)))});function eZ(){let e,r,n=(0,a.c)(3),{fov:s}=(0,J.useSettings)();return n[0]===Symbol.for("react.memo_cache_sentinel")?(e=[0,256,0],n[0]=e):e=n[0],n[1]!==s?(r=(0,t.jsx)(eX,{makeDefault:!0,position:e,fov:s}),n[1]=s,n[2]=r):r=n[2],r}var eQ=e.i(51434),e0=e.i(86855),e1=e.i(68294),e2=e.i(87297),e3=e.i(51475),e4=e.i(63318),e5=e.i(38437);function e6(){let e,r=(0,a.c)(3),n=(0,y.useSceneSun)();if(!n){let e;return r[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("ambientLight",{color:"#888888",intensity:1}),r[0]=e):e=r[0],e}return r[1]!==n?(e=(0,t.jsx)(e8,{sunData:n}),r[1]=n,r[2]=e):e=r[2],e}function e8(e){let n,o,l,i,c,u,d,m,h,p,f=(0,a.c)(29),{sunData:_}=e;f[0]!==_.direction?(n=(0,e4.torqueToThree)(_.direction),f[0]=_.direction,f[1]=n):n=f[1];let[g,y,v]=n,x=Math.sqrt(g*g+y*y+v*v),b=g/x,k=y/x,S=v/x;f[2]!==b||f[3]!==k||f[4]!==S?(o=new s.Vector3(b,k,S),f[2]=b,f[3]=k,f[4]=S,f[5]=o):o=f[5];let C=o,j=-(5e3*C.x),w=-(5e3*C.y),N=-(5e3*C.z);f[6]!==j||f[7]!==w||f[8]!==N?(l=new s.Vector3(j,w,N),f[6]=j,f[7]=w,f[8]=N,f[9]=l):l=f[9];let I=l;f[10]!==_.color.b||f[11]!==_.color.g||f[12]!==_.color.r?(i=new s.Color(_.color.r,_.color.g,_.color.b),f[10]=_.color.b,f[11]=_.color.g,f[12]=_.color.r,f[13]=i):i=f[13];let T=i;f[14]!==_.ambient.b||f[15]!==_.ambient.g||f[16]!==_.ambient.r?(c=new s.Color(_.ambient.r,_.ambient.g,_.ambient.b),f[14]=_.ambient.b,f[15]=_.ambient.g,f[16]=_.ambient.r,f[17]=c):c=f[17];let P=c,B=C.y<0;return f[18]!==B?(u=()=>{(0,e5.updateGlobalSunUniforms)(B)},d=[B],f[18]=B,f[19]=u,f[20]=d):(u=f[19],d=f[20]),(0,r.useEffect)(u,d),f[21]!==T||f[22]!==I?(m=(0,t.jsx)("directionalLight",{position:I,color:T,intensity:1,castShadow:!0,"shadow-mapSize-width":8192,"shadow-mapSize-height":8192,"shadow-camera-left":-4096,"shadow-camera-right":4096,"shadow-camera-top":4096,"shadow-camera-bottom":-4096,"shadow-camera-near":100,"shadow-camera-far":12e3,"shadow-bias":-1e-5,"shadow-normalBias":.4,"shadow-radius":2}),f[21]=T,f[22]=I,f[23]=m):m=f[23],f[24]!==P?(h=(0,t.jsx)("ambientLight",{color:P,intensity:1}),f[24]=P,f[25]=h):h=f[25],f[26]!==m||f[27]!==h?(p=(0,t.jsxs)(t.Fragment,{children:[m,h]}),f[26]=m,f[27]=h,f[28]=p):p=f[28],p}var e7=e.i(75840);let e9=(0,i.textureToUrl)("gui/hud_new_compass"),te=(0,i.textureToUrl)("gui/hud_new_NSEW");function tt(e){let r,n,s=(0,a.c)(3),{yaw:o}=e;if(null==o)return null;let l=180*o/Math.PI;s[0]===Symbol.for("react.memo_cache_sentinel")?(r=(0,t.jsx)("img",{src:e9,alt:"",className:e7.default.CompassRing}),s[0]=r):r=s[0];let i=`rotate(${-l}deg)`;return s[1]!==i?(n=(0,t.jsxs)("div",{className:e7.default.Compass,children:[r,(0,t.jsx)("img",{src:te,alt:"",className:e7.default.CompassNSEW,style:{transform:i}})]}),s[1]=i,s[2]=n):n=s[2],n}function ta(e){let r,n=(0,a.c)(2),{value:s}=e,o=Math.max(0,Math.min(100,100*s)),l=`${o}%`;return n[0]!==l?(r=(0,t.jsx)("div",{className:e7.default.BarTrack,children:(0,t.jsx)("div",{className:e7.default.BarFillHealth,style:{width:l}})}),n[0]=l,n[1]=r):r=n[1],r}function tr(e){let r,n=(0,a.c)(2),{value:s}=e,o=Math.max(0,Math.min(100,100*s)),l=`${o}%`;return n[0]!==l?(r=(0,t.jsx)("div",{className:e7.default.BarTrack,children:(0,t.jsx)("div",{className:e7.default.BarFillEnergy,style:{width:l}})}),n[0]=l,n[1]=r):r=n[1],r}let tn={weapon_sniper:"gui/hud_ret_sniper",weapon_shocklance:"gui/hud_ret_shocklance",weapon_targeting:"gui/hud_ret_targlaser"};function ts(){let e,r=(0,a.c)(5),n=(0,g.useEngineSelector)(to);if(void 0===n)return null;let s=tn[!n?"":n.replace(/\.dts$/i,"").toLowerCase()];if(s){let e,a;return r[0]!==s?(e=(0,i.textureToUrl)(s),r[0]=s,r[1]=e):e=r[1],r[2]!==e?(a=(0,t.jsx)("div",{className:e7.default.Reticle,children:(0,t.jsx)("img",{src:e,alt:"",className:e7.default.ReticleImage})}),r[2]=e,r[3]=a):a=r[3],a}return r[4]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("div",{className:e7.default.Reticle,children:(0,t.jsx)("div",{className:e7.default.ReticleDot})}),r[4]=e):e=r[4],e}function to(e){let t=e.playback.streamSnapshot;if(!t||t.camera?.mode!=="first-person")return;let a=t.controlPlayerGhostId;if(a)return t.entities.find(e=>e.id===a)?.weaponShape}let tl={0:{icon:"gui/hud_blaster",label:"Blaster"},1:{icon:"gui/hud_plasma",label:"Plasma"},2:{icon:"gui/hud_chaingun",label:"Chaingun"},3:{icon:"gui/hud_disc",label:"Spinfusor"},4:{icon:"gui/hud_grenlaunch",label:"GL"},5:{icon:"gui/hud_sniper",label:"Laser Rifle"},6:{icon:"gui/hud_elfgun",label:"ELF Gun"},7:{icon:"gui/hud_new_mortar",label:"Mortar"},8:{icon:"gui/hud_missiles",label:"Missile"},9:{icon:"gui/hud_targetlaser",label:"Targeting"},10:{icon:"gui/hud_shocklance",label:"Shocklance"},11:{icon:"gui/hud_disc",label:"Spinfusor"},12:{icon:"gui/hud_grenlaunch",label:"GL"},13:{icon:"gui/hud_chaingun",label:"Chaingun"},14:{icon:"gui/hud_targetlaser",label:"Targeting"},15:{icon:"gui/hud_targetlaser",label:"Targeting"},16:{icon:"gui/hud_shocklance",label:"Shocklance"},17:{icon:"gui/hud_new_mortar",label:"Mortar"}},ti=new Map(Object.entries(tl).map(([e,t])=>[Number(e),(0,i.textureToUrl)(t.icon)])),tc=new Set([9,14,15]),tu=(0,i.textureToUrl)("gui/hud_infinity");function td(e){let r,n,s,o,l=(0,a.c)(12),{slot:i,isSelected:c}=e,u=tl[i.index];if(!u)return null;let d=i.ammo<0,m=`${e7.default.PackInvItem} ${c?e7.default.PackInvItemActive:e7.default.PackInvItemDim}`;return l[0]!==i.index?(r=ti.get(i.index),l[0]=i.index,l[1]=r):r=l[1],l[2]!==u.label||l[3]!==r?(n=(0,t.jsx)("img",{src:r,alt:u.label,className:e7.default.PackInvIcon}),l[2]=u.label,l[3]=r,l[4]=n):n=l[4],l[5]!==d||l[6]!==i.ammo?(s=d?(0,t.jsx)("img",{src:tu,alt:"\\u221E",className:e7.default.PackInvInfinity}):(0,t.jsx)("span",{className:e7.default.PackInvCount,children:i.ammo}),l[5]=d,l[6]=i.ammo,l[7]=s):s=l[7],l[8]!==m||l[9]!==n||l[10]!==s?(o=(0,t.jsxs)("div",{className:m,children:[n,s]}),l[8]=m,l[9]=n,l[10]=s,l[11]=o):o=l[11],o}function tm(){let e,r,n,s,o,l,i=(0,a.c)(15),c=(0,g.useEngineSelector)(th);if(!c||!c.slots.length)return null;if(i[0]!==c.slots){for(let t of(r=[],e=[],c.slots))tc.has(t.index)?e.push(t):r.push(t);i[0]=c.slots,i[1]=e,i[2]=r}else e=i[1],r=i[2];return i[3]!==r||i[4]!==c?(n=r.map(e=>(0,t.jsx)(td,{slot:e,isSelected:e.index===c.activeIndex},e.index)),i[3]=r,i[4]=c,i[5]=n):n=i[5],i[6]!==e.length?(s=e.length>0&&(0,t.jsx)("div",{className:e7.default.WeaponSeparator}),i[6]=e.length,i[7]=s):s=i[7],i[8]!==e||i[9]!==c?(o=e.map(e=>(0,t.jsx)(td,{slot:e,isSelected:e.index===c.activeIndex},e.index)),i[8]=e,i[9]=c,i[10]=o):o=i[10],i[11]!==n||i[12]!==s||i[13]!==o?(l=(0,t.jsxs)("div",{className:e7.default.WeaponHUD,children:[n,s,o]}),i[11]=n,i[12]=s,i[13]=o,i[14]=l):l=i[14],l}function th(e){return e.playback.streamSnapshot?.weaponsHud}let tp={1:"Storm",2:"Inferno",3:"Starwolf",4:"Diamond Sword",5:"Blood Eagle",6:"Phoenix"};function tf(){let e,r,n,s=(0,a.c)(11),o=(0,g.useEngineSelector)(tg),l=(0,g.useEngineSelector)(t_);if(!o?.length)return null;if(s[0]!==l||s[1]!==o){let a,n;s[4]!==l?(a=(e,t)=>{if(l){if(e.teamId===l)return -1;if(t.teamId===l)return 1}return e.teamId-t.teamId},s[4]=l,s[5]=a):a=s[5];let i=[...o].sort(a);e=e7.default.TeamScores,s[6]!==l?(n=e=>{let a=l>0&&e.teamId===l,r=e.name||(tp[e.teamId]??`Team ${e.teamId}`);return(0,t.jsxs)("div",{className:e7.default.TeamRow,children:[(0,t.jsx)("span",{className:a?e7.default.TeamNameFriendly:e7.default.TeamNameEnemy,children:r}),(0,t.jsx)("span",{className:e7.default.TeamScore,children:e.score}),(0,t.jsxs)("span",{className:e7.default.TeamCount,children:["(",e.playerCount,")"]})]},e.teamId)},s[6]=l,s[7]=n):n=s[7],r=i.map(n),s[0]=l,s[1]=o,s[2]=e,s[3]=r}else e=s[2],r=s[3];return s[8]!==e||s[9]!==r?(n=(0,t.jsx)("div",{className:e,children:r}),s[8]=e,s[9]=r,s[10]=n):n=s[10],n}function t_(e){return e.playback.streamSnapshot?.playerSensorGroup}function tg(e){return e.playback.streamSnapshot?.teamScores}let ty={0:e7.default.ChatColor0,1:e7.default.ChatColor1,2:e7.default.ChatColor2,3:e7.default.ChatColor3,4:e7.default.ChatColor4,5:e7.default.ChatColor5,6:e7.default.ChatColor6,7:e7.default.ChatColor7,8:e7.default.ChatColor8,9:e7.default.ChatColor9};function tv(){let e,r,n,s,o=(0,a.c)(13),l=(0,g.useEngineSelector)(tk),i=(0,g.useEngineSelector)(tb);if(!l||!l.length||null==i)return null;let c=i-7.5;if(o[0]!==c||o[1]!==l||o[2]!==i){n=Symbol.for("react.early_return_sentinel");e:{let a,s;o[6]!==c?(a=e=>e.timeSec>c&&""!==e.text.trim(),o[6]=c,o[7]=a):a=o[7];let u=l.filter(a);if(!u.length){n=null;break e}e=e7.default.ChatWindow,o[8]!==i?(s=(e,a)=>{let r=i-e.timeSec,n=r<=6?1:Math.max(0,1-(r-6)/1.5);return(0,t.jsx)("div",{className:e7.default.ChatMessage,style:{opacity:n},children:e.segments?e.segments.map(tx):(0,t.jsxs)("span",{className:null!=e.colorCode&&ty[e.colorCode]?ty[e.colorCode]:ty[0],children:[e.sender?`${e.sender}: `:"",e.text]})},`${e.timeSec}-${a}`)},o[8]=i,o[9]=s):s=o[9],r=u.map(s)}o[0]=c,o[1]=l,o[2]=i,o[3]=e,o[4]=r,o[5]=n}else e=o[3],r=o[4],n=o[5];return n!==Symbol.for("react.early_return_sentinel")?n:(o[10]!==e||o[11]!==r?(s=(0,t.jsx)("div",{className:e,children:r}),o[10]=e,o[11]=r,o[12]=s):s=o[12],s)}function tx(e,a){return(0,t.jsx)("span",{className:ty[e.colorCode]??ty[0],children:e.text},a)}function tb(e){return e.playback.streamSnapshot?.timeSec}function tk(e){return e.playback.streamSnapshot?.chatMessages}let tS=new Map(Object.entries({0:"gui/hud_new_packammo",1:"gui/hud_new_packcloak",2:"gui/hud_new_packenergy",3:"gui/hud_new_packrepair",4:"gui/hud_new_packsatchel",5:"gui/hud_new_packshield",6:"gui/hud_new_packinventory",7:"gui/hud_new_packmotionsens",8:"gui/hud_new_packradar",9:"gui/hud_new_packturretout",10:"gui/hud_new_packturretin",11:"gui/hud_new_packsensjam",12:"gui/hud_new_packturret",13:"gui/hud_new_packturret",14:"gui/hud_new_packturret",15:"gui/hud_new_packturret",16:"gui/hud_new_packturret",17:"gui/hud_new_packturret",18:"gui/hud_satchel_unarmed",19:"gui/hud_new_packenergy"}).map(([e,t])=>[Number(e),(0,i.textureToUrl)(t)])),tC=new Map(Object.entries({1:"gui/hud_new_packcloak_armed",3:"gui/hud_new_packrepair_armed",4:"gui/hud_satchel_armed",5:"gui/hud_new_packshield_armed",11:"gui/hud_new_packsensjam_armed"}).map(([e,t])=>[Number(e),(0,i.textureToUrl)(t)])),tj={0:{icon:"gui/hud_handgren",label:"Grenade"},1:{icon:"gui/hud_mine",label:"Mine"},2:{icon:"gui/hud_beacon",label:"Beacon"},3:{icon:"gui/hud_medpack",label:"Repair Kit"}},tw=new Map(Object.entries(tj).map(([e,t])=>[Number(e),(0,i.textureToUrl)(t.icon)]));function tN(){let e,r,n,s,o,l,i,c=(0,a.c)(25),u=(0,g.useEngineSelector)(tP),d=(0,g.useEngineSelector)(tT),m=u&&u.packIndex>=0;if(m){let t,a;c[0]!==u.active||c[1]!==u.packIndex?(t=u.active?tC.get(u.packIndex):void 0,c[0]=u.active,c[1]=u.packIndex,c[2]=t):t=c[2];let r=t;c[3]!==r||c[4]!==u.packIndex?(a=r??tS.get(u.packIndex),c[3]=r,c[4]=u.packIndex,c[5]=a):a=c[5],e=a}if(c[6]!==d){if(r=new Map,d)for(let e of d.slots)r.set(e.slot,e.count);c[6]=d,c[7]=r}else r=c[7];if(c[8]!==u||c[9]!==r||c[10]!==m||c[11]!==e){l=Symbol.for("react.early_return_sentinel");e:{let a,i=Object.keys(tj).map(Number).sort(tI);if(!m&&!r.size){l=null;break e}n=e7.default.PackInventoryHUD,c[16]!==u||c[17]!==e?(s=e&&(0,t.jsxs)("div",{className:`${e7.default.PackInvItem} ${u.active?e7.default.PackInvItemActive:""}`,children:[(0,t.jsx)("img",{src:e,alt:"",className:e7.default.PackInvIcon}),(0,t.jsx)("span",{className:e7.default.PackInvCount,children:u.text||" "})]}),c[16]=u,c[17]=e,c[18]=s):s=c[18],c[19]!==r?(a=e=>{let a=tj[e],n=tw.get(e);return a&&n?(0,t.jsxs)("div",{className:e7.default.PackInvItem,children:[(0,t.jsx)("img",{src:n,alt:a.label,className:e7.default.PackInvIcon}),(0,t.jsx)("span",{className:e7.default.PackInvCount,children:r.get(e)??0})]},e):null},c[19]=r,c[20]=a):a=c[20],o=i.map(a)}c[8]=u,c[9]=r,c[10]=m,c[11]=e,c[12]=n,c[13]=s,c[14]=o,c[15]=l}else n=c[12],s=c[13],o=c[14],l=c[15];return l!==Symbol.for("react.early_return_sentinel")?l:(c[21]!==n||c[22]!==s||c[23]!==o?(i=(0,t.jsxs)("div",{className:n,children:[s,o]}),c[21]=n,c[22]=s,c[23]=o,c[24]=i):i=c[24],i)}function tI(e,t){return e-t}function tT(e){return e.playback.streamSnapshot?.inventoryHud}function tP(e){return e.playback.streamSnapshot?.backpackHud}function tB(){let e,r,n,s,o,l,i,c,u,d,m,h=(0,a.c)(19),p=(0,E.useRecording)(),f=(0,g.useEngineSelector)(tD);if(!p)return null;let _=f?.status;if(!_)return null;h[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)(tv,{}),h[0]=e):e=h[0],h[1]!==_.health?(r=(0,t.jsx)(ta,{value:_.health}),h[1]=_.health,h[2]=r):r=h[2],h[3]!==_.energy?(n=(0,t.jsx)(tr,{value:_.energy}),h[3]=_.energy,h[4]=n):n=h[4],h[5]!==r||h[6]!==n?(s=(0,t.jsxs)("div",{className:e7.default.Bars,children:[r,n]}),h[5]=r,h[6]=n,h[7]=s):s=h[7];let y=f?.camera?.yaw;return h[8]!==y?(o=(0,t.jsx)(tt,{yaw:y}),h[8]=y,h[9]=o):o=h[9],h[10]!==s||h[11]!==o?(l=(0,t.jsxs)("div",{className:e7.default.TopRight,children:[s,o]}),h[10]=s,h[11]=o,h[12]=l):l=h[12],h[13]===Symbol.for("react.memo_cache_sentinel")?(c=(0,t.jsx)(tm,{}),u=(0,t.jsx)(tN,{}),d=(0,t.jsx)(tf,{}),i=(0,t.jsx)(ts,{}),h[13]=i,h[14]=c,h[15]=u,h[16]=d):(i=h[13],c=h[14],u=h[15],d=h[16]),h[17]!==l?(m=(0,t.jsxs)("div",{className:e7.default.PlayerHUD,children:[e,l,c,u,d,i]}),h[17]=l,h[18]=m):m=h[18],m}function tD(e){return e.playback.streamSnapshot}var tE=e.i(56614);function tM({open:e,onClose:a,servers:n,loading:s,onRefresh:o,onJoin:l,wsPing:i}){let[c,u]=(0,r.useState)(null),[d,m]=(0,r.useState)("ping"),[h,p]=(0,r.useState)("asc"),f=(0,r.useRef)(null),_=(0,r.useRef)(o);_.current=o;let g=(0,r.useRef)(!1);(0,r.useEffect)(()=>{if(e){f.current?.focus();try{document.exitPointerLock()}catch{}}else g.current=!1},[e]),(0,r.useEffect)(()=>{e&&0===n.length&&!g.current&&(g.current=!0,_.current())},[e]),(0,r.useEffect)(()=>{if(!e)return;let t=e=>{e.stopPropagation(),"Escape"===e.key&&a()};return window.addEventListener("keydown",t,!0),()=>window.removeEventListener("keydown",t,!0)},[e,a]);let y=(0,r.useCallback)(e=>{d===e?p(e=>"asc"===e?"desc":"asc"):(m(e),p("desc"))},[d]),v=(0,r.useMemo)(()=>[...n].sort((e,t)=>{let a=e[d],r=t[d],n="number"==typeof a&&"number"==typeof r?a-r:String(a).localeCompare(String(r));return"asc"===h?n:-n}),[n,h,d]),x=(0,r.useCallback)(()=>{c&&(l(c),a())},[c,l,a]);return e?(0,t.jsx)("div",{className:tE.default.Overlay,onClick:a,children:(0,t.jsxs)("div",{className:tE.default.Dialog,ref:f,tabIndex:-1,onClick:e=>e.stopPropagation(),children:[(0,t.jsxs)("div",{className:tE.default.Header,children:[(0,t.jsx)("h2",{className:tE.default.Title,children:"Server Browser"}),(0,t.jsxs)("span",{className:tE.default.ServerCount,children:[n.length," server",1!==n.length?"s":""]}),(0,t.jsx)("button",{className:tE.default.RefreshButton,onClick:o,disabled:s,children:s?"Refreshing...":"Refresh"})]}),(0,t.jsx)("div",{className:tE.default.TableWrapper,children:(0,t.jsxs)("table",{className:tE.default.Table,children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{onClick:()=>y("name"),children:"Server Name"}),(0,t.jsx)("th",{onClick:()=>y("playerCount"),children:"Players"}),(0,t.jsx)("th",{onClick:()=>y("ping"),children:"Ping"}),(0,t.jsx)("th",{onClick:()=>y("mapName"),children:"Map"}),(0,t.jsx)("th",{onClick:()=>y("gameType"),children:"Type"}),(0,t.jsx)("th",{onClick:()=>y("mod"),children:"Mod"})]})}),(0,t.jsxs)("tbody",{children:[v.map(e=>(0,t.jsxs)("tr",{className:c===e.address?tE.default.Selected:void 0,onClick:()=>u(e.address),onDoubleClick:()=>{u(e.address),l(e.address),a()},children:[(0,t.jsxs)("td",{children:[e.passwordRequired&&(0,t.jsx)("span",{className:tE.default.PasswordIcon,children:"🔒"}),e.name]}),(0,t.jsxs)("td",{children:[e.playerCount,"/",e.maxPlayers]}),(0,t.jsx)("td",{children:null!=i?(e.ping+i).toLocaleString():"—"}),(0,t.jsx)("td",{children:e.mapName}),(0,t.jsx)("td",{children:e.gameType}),(0,t.jsx)("td",{children:e.mod})]},e.address)),0===v.length&&!s&&(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:6,className:tE.default.Empty,children:"No servers found"})}),s&&0===v.length&&(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:6,className:tE.default.Empty,children:"Querying master server..."})})]})]})}),(0,t.jsxs)("div",{className:tE.default.Footer,children:[(0,t.jsx)("button",{onClick:x,disabled:!c,className:tE.default.JoinButton,children:"Join"}),(0,t.jsx)("button",{onClick:a,className:tE.default.CloseButton,children:"Cancel"}),(0,t.jsx)("span",{className:tE.default.Hint,children:"Double-click a server to join"})]})]})}):null}var tR=e.i(38847);let tL=(0,r.createContext)({live:!1});function tH(e){let n,s,o=(0,a.c)(5),{children:l}=e,[i]=(0,tR.useQueryState)("features",tR.parseAsString);o[0]!==i?(n=()=>({live:new Set((i??"").split(",").map(tF).filter(Boolean)).has("live")}),o[0]=i,o[1]=n):n=o[1];let[c]=(0,r.useState)(n);return o[2]!==l||o[3]!==c?(s=(0,t.jsx)(tL.Provider,{value:c,children:l}),o[2]=l,o[3]=c,o[4]=s):s=o[4],s}function tF(e){return e.trim().toLowerCase()}var tG=e.i(3011);let tq=(0,r.lazy)(()=>e.A(96239).then(e=>({default:e.DemoPlayback}))),tO=(0,r.lazy)(()=>e.A(93884).then(e=>({default:e.DemoPlaybackControls}))),tA=(0,r.lazy)(()=>e.A(96145).then(e=>({default:e.LiveObserver}))),tU=(0,r.lazy)(()=>e.A(38496).then(e=>({default:e.ChatSoundPlayer}))),tW=(0,r.lazy)(()=>e.A(59197).then(e=>({default:e.MapInfoDialog}))),tz=new T.QueryClient,tK={toneMapping:s.NoToneMapping,outputColorSpace:s.SRGBColorSpace},t$=(0,tR.createParser)({parse(e){let[t,a]=e.split("~"),r=a,n=(0,f.getMissionInfo)(t).missionTypes;return a&&n.includes(a)||(r=n[0]),{missionName:t,missionType:r}},serialize:({missionName:e,missionType:t})=>1===(0,f.getMissionInfo)(e).missionTypes.length?e:`${e}~${t}`,eq:(e,t)=>e.missionName===t.missionName&&e.missionType===t.missionType}).withDefault({missionName:"RiverDance",missionType:"CTF"});function tJ(){let e,o,l,i,c,u,d,m,h,p,_,g,y,v,x,b,k,S,C,j,w,N,I,T,M,L,H,F,G,q,O,A,U,W,z,K,$,V,Y,X,Q,ee,et,ea=(0,a.c)(77),[er,en]=(0,tR.useQueryState)("mission",t$),[es,eo]=(0,tR.useQueryState)("fog",tR.parseAsBoolean);ea[0]!==eo?(e=()=>{eo(null)},ea[0]=eo,ea[1]=e):e=ea[1];let el=e;ea[2]!==el||ea[3]!==en?(o=e=>{window.location.hash="",el(),en(e)},ea[2]=el,ea[3]=en,ea[4]=o):o=ea[4];let ei=o,ec=(X=(0,a.c)(2),Q=(0,r.useRef)(null),X[0]===Symbol.for("react.memo_cache_sentinel")?(V=e=>{let t=window.matchMedia("(pointer: coarse)");return t.addEventListener("change",e),Q.current=t,()=>{t.removeEventListener("change",e)}},X[0]=V):V=X[0],ee=V,X[1]===Symbol.for("react.memo_cache_sentinel")?(Y=()=>Q.current?.matches??null,X[1]=Y):Y=X[1],et=Y,(0,r.useSyncExternalStore)(ee,et,eV)),eu=(0,r.useContext)(tL),ed=(0,eF.useLiveConnection)(),{missionName:em,missionType:eh}=er,[ep,ef]=(0,r.useState)(!1),[e_,eg]=(0,r.useState)(!1),[ey,ev]=(0,r.useState)(0),[ex,eb]=(0,r.useState)(!0),ek=null!=ed.adapter?ed.liveReady?1:"connected"===ed.gameStatus?.8:"authenticating"===ed.gameStatus?.6:"challenging"===ed.gameStatus?.3:"connecting"===ed.gameStatus?.2:.1:null;ea[5]!==ek?(l=()=>{null!=ek&&ev(0)},ea[5]=ek,ea[6]=l):l=ea[6];let eS=null!=ek;ea[7]!==eS?(i=[eS],ea[7]=eS,ea[8]=i):i=ea[8],(0,r.useEffect)(l,i);let eC=ek??ey,ej=eC<1;ea[9]!==ej?(c=()=>{if(ej)eb(!0);else{let e=setTimeout(()=>eb(!1),500);return()=>clearTimeout(e)}},u=[ej],ea[9]=ej,ea[10]=c,ea[11]=u):(c=ea[10],u=ea[11]),(0,r.useEffect)(c,u),ea[12]!==ei?(d=()=>(window.setMissionName=e=>{let t=(0,f.getMissionInfo)(e).missionTypes;ei({missionName:e,missionType:t[0]})},window.getMissionList=f.getMissionList,window.getMissionInfo=f.getMissionInfo,tV),m=[ei],ea[12]=ei,ea[13]=d,ea[14]=m):(d=ea[13],m=ea[14]),(0,r.useEffect)(d,m),ea[15]===Symbol.for("react.memo_cache_sentinel")?(p=()=>{let e=e=>{if("KeyI"!==e.code||e.metaKey||e.ctrlKey||e.altKey)return;let t=e.target;"INPUT"===t.tagName||"TEXTAREA"===t.tagName||t.isContentEditable||ef(!0)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},h=[],ea[15]=h,ea[16]=p):(h=ea[15],p=ea[16]),(0,r.useEffect)(p,h),ea[17]===Symbol.for("react.memo_cache_sentinel")?(_=(e,t)=>{ev(void 0===t?0:t)},ea[17]=_):_=ea[17];let ew=_,eN=(0,r.useRef)(null);ea[18]===Symbol.for("react.memo_cache_sentinel")?(g={angle:0,force:0},ea[18]=g):g=ea[18];let eI=(0,r.useRef)(g),eT=(0,r.useRef)(null);ea[19]===Symbol.for("react.memo_cache_sentinel")?(y={angle:0,force:0},ea[19]=y):y=ea[19];let eP=(0,r.useRef)(y),eB=(0,r.useRef)(null);return ea[20]!==ej||ea[21]!==eC||ea[22]!==ex?(v=ex&&(0,t.jsxs)("div",{id:"loadingIndicator",className:tG.default.LoadingIndicator,"data-complete":!ej,children:[(0,t.jsx)("div",{className:tG.default.Spinner}),(0,t.jsx)("div",{className:tG.default.Progress,children:(0,t.jsx)("div",{className:tG.default.ProgressBar,style:{width:`${100*eC}%`}})}),(0,t.jsxs)("div",{className:tG.default.ProgressText,children:[Math.round(100*eC),"%"]})]}),ea[20]=ej,ea[21]=eC,ea[22]=ex,ea[23]=v):v=ea[23],ea[24]===Symbol.for("react.memo_cache_sentinel")?(x={type:s.PCFShadowMap},b=e=>{eN.current=e.camera},ea[24]=x,ea[25]=b):(x=ea[24],b=ea[25]),ea[26]!==em||ea[27]!==eh?(k=(0,t.jsx)(tY,{missionName:em,missionType:eh,onLoadingChange:ew}),ea[26]=em,ea[27]=eh,ea[28]=k):k=ea[28],ea[29]===Symbol.for("react.memo_cache_sentinel")?(S=(0,t.jsx)(e6,{}),ea[29]=S):S=ea[29],ea[30]!==eh?(C=(0,t.jsx)(e2.EntityScene,{missionType:eh}),ea[30]=eh,ea[31]=C):C=ea[31],ea[32]===Symbol.for("react.memo_cache_sentinel")?(j=(0,t.jsx)(eZ,{}),w=(0,t.jsx)(e0.DebugElements,{}),ea[32]=j,ea[33]=w):(j=ea[32],w=ea[33]),ea[34]!==ec?(N=(0,t.jsx)(tX,{isTouch:ec,joystickStateRef:eI,joystickZoneRef:eT,lookJoystickStateRef:eP,lookJoystickZoneRef:eB}),ea[34]=ec,ea[35]=N):N=ea[35],ea[36]!==k||ea[37]!==C||ea[38]!==N?(I=(0,t.jsx)(n.Canvas,{frameloop:"always",gl:tK,shadows:x,onCreated:b,children:(0,t.jsx)(e3.TickProvider,{children:(0,t.jsx)(e1.CamerasProvider,{children:(0,t.jsxs)(eQ.AudioProvider,{children:[k,S,C,j,w,N]})})})}),ea[36]=k,ea[37]=C,ea[38]=N,ea[39]=I):I=ea[39],ea[40]!==v||ea[41]!==I?(T=(0,t.jsxs)("div",{id:"canvasContainer",className:tG.default.CanvasContainer,children:[v,I]}),ea[40]=v,ea[41]=I,ea[42]=T):T=ea[42],ea[43]===Symbol.for("react.memo_cache_sentinel")?(M=(0,t.jsx)(tZ,{}),ea[43]=M):M=ea[43],ea[44]!==ec?(L=ec&&(0,t.jsx)(Z,{joystickState:eI,joystickZone:eT,lookJoystickState:eP,lookJoystickZone:eB}),ea[44]=ec,ea[45]=L):L=ea[45],ea[46]!==ec?(H=!1===ec&&(0,t.jsx)(R,{}),ea[46]=ec,ea[47]=H):H=ea[47],ea[48]===Symbol.for("react.memo_cache_sentinel")?(F=()=>ef(!0),ea[48]=F):F=ea[48],ea[49]!==eu.live?(G=eu.live?()=>eg(!0):void 0,ea[49]=eu.live,ea[50]=G):G=ea[50],ea[51]!==ei||ea[52]!==ec||ea[53]!==em||ea[54]!==eh||ea[55]!==G?(q=(0,t.jsx)(eW,{missionName:em,missionType:eh,onChangeMission:ei,onOpenMapInfo:F,onOpenServerBrowser:G,cameraRef:eN,isTouch:ec}),ea[51]=ei,ea[52]=ec,ea[53]=em,ea[54]=eh,ea[55]=G,ea[56]=q):q=ea[56],ea[57]!==ep||ea[58]!==em||ea[59]!==eh?(O=ep&&(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tW,{open:ep,onClose:()=>ef(!1),missionName:em,missionType:eh??""})}),ea[57]=ep,ea[58]=em,ea[59]=eh,ea[60]=O):O=ea[60],ea[61]===Symbol.for("react.memo_cache_sentinel")?(A=()=>eg(!1),ea[61]=A):A=ea[61],ea[62]!==e_?(U=(0,t.jsx)(t0,{open:e_,onClose:A}),ea[62]=e_,ea[63]=U):U=ea[63],ea[64]===Symbol.for("react.memo_cache_sentinel")?(W=(0,t.jsx)(tQ,{}),z=(0,t.jsx)(t1,{}),ea[64]=W,ea[65]=z):(W=ea[64],z=ea[65]),ea[66]!==T||ea[67]!==L||ea[68]!==H||ea[69]!==q||ea[70]!==O||ea[71]!==U?(K=(0,t.jsxs)(D.KeyboardControls,{map:B.KEYBOARD_CONTROLS,children:[T,M,L,H,q,O,U,W,z]}),ea[66]=T,ea[67]=L,ea[68]=H,ea[69]=q,ea[70]=O,ea[71]=U,ea[72]=K):K=ea[72],ea[73]!==el||ea[74]!==es||ea[75]!==K?($=(0,t.jsx)(P.QueryClientProvider,{client:tz,children:(0,t.jsx)("main",{children:(0,t.jsx)(E.RecordingProvider,{children:(0,t.jsx)(J.SettingsProvider,{fogEnabledOverride:es,onClearFogEnabledOverride:el,children:K})})})}),ea[73]=el,ea[74]=es,ea[75]=K,ea[76]=$):$=ea[76],$}function tV(){delete window.setMissionName,delete window.getMissionList,delete window.getMissionInfo}function tY(e){let r,n=(0,a.c)(5),{missionName:s,missionType:o,onLoadingChange:l}=e,i=(0,E.useRecording)(),{adapter:c}=(0,eF.useLiveConnection)();if(null!=i||null!=c)return null;let u=`${s}~${o}`;return n[0]!==s||n[1]!==o||n[2]!==l||n[3]!==u?(r=(0,t.jsx)(I,{name:s,missionType:o,onLoadingChange:l},u),n[0]=s,n[1]=o,n[2]=l,n[3]=u,n[4]=r):r=n[4],r}function tX(e){let n,s,o,l,i,c=(0,a.c)(18),{isTouch:u,joystickStateRef:d,joystickZoneRef:m,lookJoystickStateRef:h,lookJoystickZoneRef:p}=e,f=(0,E.useRecording)(),_=null!=(0,eF.useLiveConnection)().adapter,g=null!=f||_,y=!g||_;return c[0]!==f?(n=f&&(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tq,{})}),c[0]=f,c[1]=n):n=c[1],c[2]!==_?(s=_&&(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tA,{})}),c[2]=_,c[3]=s):s=c[3],c[4]!==g?(o=g&&(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tU,{})}),c[4]=g,c[5]=o):o=c[5],c[6]!==u||c[7]!==d||c[8]!==m||c[9]!==h||c[10]!==p||c[11]!==y?(l=y&&null!==u&&(u?(0,t.jsx)(Q,{joystickState:d,joystickZone:m,lookJoystickState:h,lookJoystickZone:p}):(0,t.jsx)(B.ObserverControls,{})),c[6]=u,c[7]=d,c[8]=m,c[9]=h,c[10]=p,c[11]=y,c[12]=l):l=c[12],c[13]!==n||c[14]!==s||c[15]!==o||c[16]!==l?(i=(0,t.jsxs)(t.Fragment,{children:[n,s,o,l]}),c[13]=n,c[14]=s,c[15]=o,c[16]=l,c[17]=i):i=c[17],i}function tZ(){let e,r=(0,a.c)(1),n=(0,E.useRecording)(),s=(0,eF.useLiveConnection)();return n||s.adapter?(r[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)(tB,{}),r[0]=e):e=r[0],e):null}function tQ(){let e,n=(0,a.c)(1),s=(0,E.useRecording)(),o=(0,eF.useLiveConnection)();return s&&null==o.adapter?(n[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)(r.Suspense,{fallback:null,children:(0,t.jsx)(tO,{})}),n[0]=e):e=n[0],e):null}function t0(e){let r,n,s=(0,a.c)(10),{open:o,onClose:l}=e,i=(0,eF.useLiveConnection)();return s[0]!==i?(r=e=>i.joinServer(e),s[0]=i,s[1]=r):r=s[1],s[2]!==i.listServers||s[3]!==i.servers||s[4]!==i.serversLoading||s[5]!==i.wsPing||s[6]!==l||s[7]!==o||s[8]!==r?(n=(0,t.jsx)(tM,{open:o,onClose:l,servers:i.servers,loading:i.serversLoading,onRefresh:i.listServers,onJoin:r,wsPing:i.wsPing}),s[2]=i.listServers,s[3]=i.servers,s[4]=i.serversLoading,s[5]=i.wsPing,s[6]=l,s[7]=o,s[8]=r,s[9]=n):n=s[9],n}function t1(){let e,t,n=(0,a.c)(3),{setRecording:s}=(0,E.usePlaybackActions)();return n[0]!==s?(e=()=>(window.loadDemoRecording=s,t2),t=[s],n[0]=s,n[1]=e,n[2]=t):(e=n[1],t=n[2]),(0,r.useEffect)(e,t),null}function t2(){delete window.loadDemoRecording}function t3(){let e,n=(0,a.c)(1);return n[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)(r.Suspense,{children:(0,t.jsx)(tH,{children:(0,t.jsx)(eF.LiveConnectionProvider,{children:(0,t.jsx)(tJ,{})})})}),n[0]=e):e=n[0],e}e.s(["default",()=>t3],31713)}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/ee88398bb27ad4a1.js b/docs/_next/static/chunks/c293826b70147a61.js similarity index 85% rename from docs/_next/static/chunks/ee88398bb27ad4a1.js rename to docs/_next/static/chunks/c293826b70147a61.js index b1a28faa..2412c13d 100644 --- a/docs/_next/static/chunks/ee88398bb27ad4a1.js +++ b/docs/_next/static/chunks/c293826b70147a61.js @@ -518,4 +518,4 @@ outgoingLight = resultLinear + totalEmissiveRadiance; gl_FragColor = vec4(linearToSRGB(finalColor), 1.0); } - `,depthWrite:!1,depthTest:!1})]})}function ed(e,t){let{fogDistance:r,visibleDistance:a}=e;return[r,a]}function em({fogState:e,enabled:t}){let{scene:r,camera:l}=(0,p.useThree)(),n=(0,a.useRef)(null),s=(0,a.useMemo)(()=>(0,D.packFogVolumeData)(e.fogVolumes),[e.fogVolumes]);return(0,a.useEffect)(()=>{en||((0,M.installCustomFogShader)(),en=!0)},[]),(0,a.useEffect)(()=>{(0,D.resetGlobalFogUniforms)();let[t,a]=ed(e,l.position.y),o=new i.Fog(e.fogColor,t,a);return r.fog=o,n.current=o,(0,D.updateGlobalFogUniforms)(l.position.y,s),()=>{r.fog=null,n.current=null,(0,D.resetGlobalFogUniforms)()}},[r,l,e,s]),(0,a.useEffect)(()=>{let r=n.current;if(r)if(t){let[t,a]=ed(e,l.position.y);r.near=t,r.far=a}else r.near=1e10,r.far=1e10},[t,e,l.position.y]),(0,o.useFrame)(()=>{let r=n.current;if(!r)return;let a=l.position.y;if((0,D.updateGlobalFogUniforms)(a,s,t),t){let[t,i]=ed(e,a);r.near=t,r.far=i,r.color.copy(e.fogColor)}}),null}function eg({scene:e}){let{fogEnabled:r}=(0,d.useSettings)(),o=e.materialList||void 0,l=(0,a.useMemo)(()=>es(e.skySolidColor),[e.skySolidColor]),n=e.useSkyTextures,s=(0,a.useMemo)(()=>(function(e){let t=e.fogDistance,r=e.visibleDistance>0?e.visibleDistance:1e3,{r:a,g:o,b:l}=e.fogColor,n=new i.Color().setRGB(a,o,l).convertSRGBToLinear(),s=[];for(let t of e.fogVolumes)t.visibleDistance<=0||t.maxHeight<=t.minHeight||s.push({visibleDistance:t.visibleDistance,minHeight:t.minHeight,maxHeight:t.maxHeight,percentage:1});let u=s.reduce((e,t)=>Math.max(e,t.maxHeight),0);return{fogDistance:t,visibleDistance:r,fogColor:n,fogVolumes:s,fogLine:u,enabled:r>t}})(e),[e]),u=(0,a.useMemo)(()=>es(e.fogColor),[e.fogColor]),c=l||u,f=s.enabled&&r,m=s.fogColor,{scene:g,gl:h}=(0,p.useThree)();(0,a.useEffect)(()=>{if(f){let e=m.clone();g.background=e,h.setClearColor(e)}else if(c){let e=c[0].clone();g.background=e,h.setClearColor(e)}else g.background=null;return()=>{g.background=null}},[g,h,f,m,c]);let v=l?.[1];return(0,t.jsxs)(t.Fragment,{children:[o&&n&&o.length>0?(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ec,{materialList:o,fogColor:f?m:void 0,fogState:f?s:void 0},o)}):v?(0,t.jsx)(ef,{skyColor:v,fogColor:f?m:void 0,fogState:f?s:void 0}):null,(0,t.jsx)(a.Suspense,{children:(0,t.jsx)(ei,{scene:e})}),s.enabled?(0,t.jsx)(em,{fogState:s,enabled:r}):null]})}let eh=(0,a.lazy)(()=>e.A(30814).then(e=>({default:e.PlayerModel}))),ep=(0,a.lazy)(()=>e.A(44325).then(e=>({default:e.ExplosionShape}))),ev=(0,a.lazy)(()=>e.A(62125).then(e=>({default:e.TracerProjectile}))),ex=(0,a.lazy)(()=>e.A(62125).then(e=>({default:e.SpriteProjectile}))),eb=(0,a.lazy)(()=>e.A(25147).then(e=>({default:e.ForceFieldBare}))),ey=(0,a.lazy)(()=>e.A(61921).then(e=>({default:e.AudioEmitter}))),eS=(0,a.lazy)(()=>e.A(18599).then(e=>({default:e.WaterBlock}))),eF={1:"Storm",2:"Inferno"},ew=(0,a.memo)(function(e){let i=(0,r.c)(26),{entity:o}=e;switch(o.renderType){case"Shape":{let e;return i[0]!==o?(e=(0,t.jsx)(eT,{entity:o}),i[0]=o,i[1]=e):e=i[1],e}case"ForceFieldBare":{let e;return i[2]!==o?(e=(0,t.jsx)(eM,{entity:o}),i[2]=o,i[3]=e):e=i[3],e}case"Player":{let e;return i[4]!==o?(e=(0,t.jsx)(eD,{entity:o}),i[4]=o,i[5]=e):e=i[5],e}case"Explosion":{let e;return i[6]!==o?(e=(0,t.jsx)(eC,{entity:o}),i[6]=o,i[7]=e):e=i[7],e}case"Tracer":{let e;return i[8]!==o?(e=(0,t.jsx)(ej,{entity:o}),i[8]=o,i[9]=e):e=i[9],e}case"Sprite":{let e;return i[10]!==o?(e=(0,t.jsx)(e_,{entity:o}),i[10]=o,i[11]=e):e=i[11],e}case"AudioEmitter":{let e;return i[12]!==o?(e=(0,t.jsx)(ek,{entity:o}),i[12]=o,i[13]=e):e=i[13],e}case"Camera":{let e;return i[14]!==o?(e=(0,t.jsx)(g,{entity:o}),i[14]=o,i[15]=e):e=i[15],e}case"WayPoint":{let e;return i[16]!==o?(e=(0,t.jsx)(h,{entity:o}),i[16]=o,i[17]=e):e=i[17],e}case"TerrainBlock":{let e;return i[18]!==o.terrainData?(e=(0,t.jsx)(L,{scene:o.terrainData}),i[18]=o.terrainData,i[19]=e):e=i[19],e}case"InteriorInstance":{let e;return i[20]!==o.interiorData?(e=(0,t.jsx)(Y,{scene:o.interiorData}),i[20]=o.interiorData,i[21]=e):e=i[21],e}case"Sky":{let e;return i[22]!==o.skyData?(e=(0,t.jsx)(eg,{scene:o.skyData}),i[22]=o.skyData,i[23]=e):e=i[23],e}case"Sun":case"MissionArea":case"None":return null;case"WaterBlock":{let e;return i[24]!==o.waterData?(e=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eS,{scene:o.waterData})}),i[24]=o.waterData,i[25]=e):e=i[25],e}}});function eT(e){let i,l,n,s,m,g,h=(0,r.c)(21),{entity:p}=e,{animationEnabled:v}=(0,d.useSettings)(),x=(0,a.useRef)(null);if(h[0]!==v||h[1]!==p.rotate?(i=()=>{if(!x.current||!p.rotate||!v)return;let e=performance.now()/1e3;x.current.rotation.y=e/3*Math.PI*2},h[0]=v,h[1]=p.rotate,h[2]=i):i=h[2],(0,o.useFrame)(i),!p.shapeName)return null;let b=p.runtimeObject,y=p.shapeType??"StaticShape",S=p.dataBlock?.toLowerCase()==="flag",F=p.teamId&&p.teamId>0?eF[p.teamId]:null,w=S&&F?`${F} Flag`:null,T="Item"===p.shapeType?"pink":p.threads?"#00ff88":"yellow",M=p.rotate?x:void 0,D=b?void 0:p;return h[3]!==w?(l=w?(0,t.jsx)(f.FloatingLabel,{opacity:.6,children:w}):null,h[3]=w,h[4]=l):l=h[4],h[5]!==T||h[6]!==D||h[7]!==l?(n=(0,t.jsx)(u.ShapeRenderer,{loadingColor:T,streamEntity:D,children:l}),h[5]=T,h[6]=D,h[7]=l,h[8]=n):n=h[8],h[9]!==p.barrelShapeName||h[10]!==b?(s=p.barrelShapeName&&(0,t.jsx)(c.ShapeInfoProvider,{object:b,shapeName:p.barrelShapeName,type:"Turret",children:(0,t.jsx)("group",{position:[0,1.5,0],children:(0,t.jsx)(u.ShapeRenderer,{})})}),h[9]=p.barrelShapeName,h[10]=b,h[11]=s):s=h[11],h[12]!==M||h[13]!==n||h[14]!==s?(m=(0,t.jsxs)("group",{ref:M,children:[n,s]}),h[12]=M,h[13]=n,h[14]=s,h[15]=m):m=h[15],h[16]!==p.shapeName||h[17]!==y||h[18]!==m||h[19]!==b?(g=(0,t.jsx)(c.ShapeInfoProvider,{object:b,shapeName:p.shapeName,type:y,children:m}),h[16]=p.shapeName,h[17]=y,h[18]=m,h[19]=b,h[20]=g):g=h[20],g}function eM(e){let i,o=(0,r.c)(2),{entity:l}=e;return l.forceFieldData?(o[0]!==l.forceFieldData?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eb,{data:l.forceFieldData,scale:l.forceFieldData.dimensions})}),o[0]=l.forceFieldData,o[1]=i):i=o[1],i):null}function eD(e){let i,o=(0,r.c)(2),{entity:l}=e;return l.shapeName?(o[0]!==l?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eh,{entity:l})}),o[0]=l,o[1]=i):i=o[1],i):null}function eC(e){let i,o,l,n=(0,r.c)(10),{entity:u}=e;n[0]===Symbol.for("react.memo_cache_sentinel")?(i=s.streamPlaybackStore.getState(),n[0]=i):i=n[0];let c=i.playback;n[1]!==u.explosionDataBlockId||n[2]!==u.faceViewer||n[3]!==u.id||n[4]!==u.position||n[5]!==u.rotation||n[6]!==u.shapeName?(o={id:u.id,type:"Explosion",dataBlock:u.shapeName,position:u.position,rotation:u.rotation,faceViewer:u.faceViewer,explosionDataBlockId:u.explosionDataBlockId},n[1]=u.explosionDataBlockId,n[2]=u.faceViewer,n[3]=u.id,n[4]=u.position,n[5]=u.rotation,n[6]=u.shapeName,n[7]=o):o=n[7];let f=o;return u.shapeName&&c?(n[8]!==f?(l=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ep,{entity:f,playback:c})}),n[8]=f,n[9]=l):l=n[9],l):null}function ej(e){let i,o=(0,r.c)(2),{entity:l}=e;return o[0]!==l?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ev,{entity:l,visual:l.visual})}),o[0]=l,o[1]=i):i=o[1],i}function e_(e){let i,o=(0,r.c)(2),{entity:l}=e;return o[0]!==l.visual?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ex,{visual:l.visual})}),o[0]=l.visual,o[1]=i):i=o[1],i}function ek(e){let i,o=(0,r.c)(2),{entity:l}=e,{audioEnabled:n}=(0,d.useSettings)();return l.audioFileName&&n?(o[0]!==l?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ey,{entity:l})}),o[0]=l,o[1]=i):i=o[1],i):null}var eR=e.i(60099),eB=e.i(85557),eL=e.i(29418);let eG=(0,b.textureToUrl)("gui/hud_alliedtriangle"),ez=(0,b.textureToUrl)("gui/hud_enemytriangle"),eU=new i.Vector3;function eN(e){let l,n,c,f,d,m,g,h=(0,r.c)(23),{entity:v}=e,x=(0,u.useStaticShape)(v.shapeName??v.dataBlock),{camera:b}=(0,p.useThree)(),y=(0,a.useRef)(null),S=(0,a.useRef)(null),F=(0,a.useRef)(null),w=(0,a.useRef)(null),T=(0,a.useRef)(null),[M,D]=(0,a.useState)(!0);e:{if(v.playerName){l=v.playerName;break e}if("string"==typeof v.id){let e;if(h[0]!==v.id){let t;h[2]===Symbol.for("react.memo_cache_sentinel")?(t=/\d+/,h[2]=t):t=h[2],e=v.id.match(t),h[0]=v.id,h[1]=e}else e=h[1];let t=e;if(t){l=``;break e}l=v.id;break e}l=""}let C=l;h[3]!==x.scene?(n=new i.Box3().setFromObject(x.scene),h[3]=x.scene,h[4]=n):n=h[4];let j=n.max.y+.1;h[5]!==v.keyframes?(c=v.keyframes??[],h[5]=v.keyframes,h[6]=c):c=h[6];let _=c;h[7]!==_?(f=_.some(eI),h[7]=_,h[8]=f):f=h[8];let k=f;h[9]!==b||h[10]!==v.iffColor||h[11]!==k||h[12]!==M||h[13]!==_?(d=()=>{let e=y.current;if(!e)return;e.getWorldPosition(eU);let t=b.position.distanceTo(eU),r=b.matrixWorld.elements,a=!(-((eU.x-r[12])*r[8])+-((eU.y-r[13])*r[9])+-((eU.z-r[14])*r[10])<0)&&t<150;if(M!==a&&D(a),!a)return;let i=(0,eB.getKeyframeAtTime)(_,s.streamPlaybackStore.getState().time),o=i?.health??1;if(i?.damageState!=null&&i.damageState>=1){S.current&&(S.current.style.opacity="0"),F.current&&(F.current.style.opacity="0");return}let l=Math.max(0,Math.min(1,1-t/150)).toString();if(S.current&&(S.current.style.opacity=l),F.current&&(F.current.style.opacity=l),T.current&&v.iffColor){let e=v.iffColor.r>v.iffColor.g?ez:eG;T.current.getAttribute("src")!==e&&(T.current.src=e)}w.current&&k&&(w.current.style.width=`${Math.max(0,Math.min(100,100*o))}%`,w.current.style.background=v.iffColor?`rgb(${v.iffColor.r}, ${v.iffColor.g}, ${v.iffColor.b})`:"")},h[9]=b,h[10]=v.iffColor,h[11]=k,h[12]=M,h[13]=_,h[14]=d):d=h[14],(0,o.useFrame)(d);let R=v.iffColor&&v.iffColor.r>v.iffColor.g?ez:eG;return h[15]!==C||h[16]!==k||h[17]!==j||h[18]!==R||h[19]!==M?(m=M&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(eR.Html,{position:[0,j,0],center:!0,children:(0,t.jsx)("div",{ref:S,className:eL.default.Top,children:(0,t.jsx)("img",{ref:T,className:eL.default.IffArrow,src:R,alt:""})})}),(0,t.jsx)(eR.Html,{position:[0,-.2,0],center:!0,children:(0,t.jsxs)("div",{ref:F,className:eL.default.Bottom,children:[(0,t.jsx)("div",{className:eL.default.Name,children:C}),k&&(0,t.jsx)("div",{className:eL.default.HealthBar,children:(0,t.jsx)("div",{ref:w,className:eL.default.HealthFill})})]})})]}),h[15]=C,h[16]=k,h[17]=j,h[18]=R,h[19]=M,h[20]=m):m=h[20],h[21]!==m?(g=(0,t.jsx)("group",{ref:y,children:m}),h[21]=m,h[22]=g):g=h[22],g}function eI(e){return null!=e.health}var eA=e.i(78779);let eE=(0,b.textureToUrl)("commander/MiniIcons/com_flag_grey"),eP=new i.Vector3;function eH(e){let i,l,n,s,u,c=(0,r.c)(9),{entity:f}=e,d=(0,a.useRef)(null),m=(0,a.useRef)(null),g=(0,a.useRef)(null),{camera:h}=(0,p.useThree)();c[0]!==h||c[1]!==f.iffColor?(i=()=>{if(m.current&&f.iffColor){let{r:e,g:t,b:r}=f.iffColor;m.current.style.backgroundColor=`rgb(${e},${t},${r})`}if(g.current&&d.current){d.current.getWorldPosition(eP);let e=h.position.distanceTo(eP);g.current.textContent=e.toFixed(1)}},c[0]=h,c[1]=f.iffColor,c[2]=i):i=c[2],(0,o.useFrame)(i);let v=f.iffColor?`rgb(${f.iffColor.r},${f.iffColor.g},${f.iffColor.b})`:"rgb(200,200,200)";c[3]===Symbol.for("react.memo_cache_sentinel")?(l=[0,1.5,0],c[3]=l):l=c[3],c[4]===Symbol.for("react.memo_cache_sentinel")?(n=(0,t.jsx)("span",{ref:g,className:eA.default.Distance}),c[4]=n):n=c[4],c[5]!==v?(s={backgroundColor:v,"--flag-icon-url":`url(${eE})`},c[5]=v,c[6]=s):s=c[6];let x=s;return c[7]!==x?(u=(0,t.jsx)("group",{ref:d,children:(0,t.jsx)(eR.Html,{position:l,center:!0,children:(0,t.jsxs)("div",{className:eA.default.Root,children:[n,(0,t.jsx)("div",{ref:m,className:eA.default.Icon,style:x})]})})}),c[7]=x,c[8]=u):u=c[8],u}var eV=e.i(58647);let eq=(0,a.lazy)(()=>e.A(44325).then(e=>({default:e.WeaponModel})));function e$(e){let a,i=(0,r.c)(3),{missionType:o}=e,l=(0,d.useDebug)(),n=l?.debugMode??!1;return i[0]!==n||i[1]!==o?(a=(0,t.jsx)("group",{ref:eW,children:(0,t.jsx)(eO,{missionType:o,debugMode:n})}),i[0]=n,i[1]=o,i[2]=a):a=i[2],a}function eW(e){s.streamPlaybackStore.setState({root:e})}let eO=(0,a.memo)(function({missionType:e,debugMode:r}){let i=(0,l.useAllGameEntities)(),o=(0,a.useRef)(new Map).current,n=new Set;for(let e of i)n.add(e.id),o.set(e.id,e);for(let e of o.keys())n.has(e)||o.delete(e);let s=(0,a.useMemo)(()=>{let t=[],r=e?.toLowerCase();for(let e of o.values()){if(r&&e.missionTypesList){let t=new Set(e.missionTypesList.toLowerCase().split(/\s+/).filter(Boolean));if(t.size>0&&!t.has(r))continue}t.push(e)}return t},[i,e]);return(0,t.jsx)(t.Fragment,{children:s.map(e=>(0,t.jsx)(eY,{entity:e,debugMode:r},e.id))})}),eY=(0,a.memo)(function(e){let a,i=(0,r.c)(8),{entity:o,debugMode:l}=e;if((0,n.isSceneEntity)(o)){let e,r;return i[0]!==o?(e=(0,t.jsx)(ew,{entity:o}),i[0]=o,i[1]=e):e=i[1],i[2]!==o.id||i[3]!==e?(r=(0,t.jsx)("group",{name:o.id,children:e}),i[2]=o.id,i[3]=e,i[4]=r):r=i[4],r}return"None"===o.renderType?null:(i[5]!==l||i[6]!==o?(a=(0,t.jsx)(eZ,{entity:o,debugMode:l}),i[5]=l,i[6]=o,i[7]=a):a=i[7],a)});function eK(e){let a,i=(0,r.c)(2),{entity:o}=e,l=(0,eV.useEngineSelector)(eQ);return o.id===l?null:(i[0]!==o?(a=(0,t.jsx)(eN,{entity:o}),i[0]=o,i[1]=a):a=i[1],a)}function eQ(e){return e.playback.streamSnapshot?.controlPlayerGhostId}function eX({entity:e}){let r=(0,a.useRef)(!1),[i,l]=(0,a.useState)(()=>((("targetRenderFlags"in e?e.targetRenderFlags:void 0)??0)&2)!=0);return(r.current=i,(0,o.useFrame)(()=>{let t=((("targetRenderFlags"in e?e.targetRenderFlags:void 0)??0)&2)!=0;t!==r.current&&(r.current=t,l(t))}),i)?(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eH,{entity:e})}):null}function eZ(e){let o,l,n,s,u,c,f,d,m,g,h,p=(0,r.c)(56),{entity:v,debugMode:x}=e,b=v.position,y=v.scale;e:{let e;if(!v.rotation){o=void 0;break e}p[0]!==v.rotation?(e=new i.Quaternion(...v.rotation),p[0]=v.rotation,p[1]=e):e=p[1],o=e}let S=o,F="Player"===v.renderType;if("Shape"===v.renderType&&!v.shapeName){let e,r,a,i,o,l,n=v.id;return p[2]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("sphereGeometry",{args:[.3,6,4]}),p[2]=e):e=p[2],p[3]!==v.className?(r=(0,eB.entityTypeColor)(v.className),p[3]=v.className,p[4]=r):r=p[4],p[5]!==r?(a=(0,t.jsxs)("mesh",{children:[e,(0,t.jsx)("meshBasicMaterial",{color:r,wireframe:!0})]}),p[5]=r,p[6]=a):a=p[6],p[7]!==x||p[8]!==v?(i=x&&(0,t.jsx)(eJ,{entity:v}),p[7]=x,p[8]=v,p[9]=i):i=p[9],p[10]!==v?(o=(0,t.jsx)(eX,{entity:v}),p[10]=v,p[11]=o):o=p[11],p[12]!==v.id||p[13]!==b||p[14]!==S||p[15]!==y||p[16]!==a||p[17]!==i||p[18]!==o?(l=(0,t.jsxs)("group",{name:n,position:b,quaternion:S,scale:y,children:[a,i,o]}),p[12]=v.id,p[13]=b,p[14]=S,p[15]=y,p[16]=a,p[17]=i,p[18]=o,p[19]=l):l=p[19],l}p[20]!==v.className||p[21]!==v.renderType?(l="Explosion"===v.renderType?null:(0,t.jsxs)("mesh",{children:[(0,t.jsx)("sphereGeometry",{args:[.5,8,6]}),(0,t.jsx)("meshBasicMaterial",{color:(0,eB.entityTypeColor)(v.className),wireframe:!0})]}),p[20]=v.className,p[21]=v.renderType,p[22]=l):l=p[22];let w=l,T="shapeName"in v?v.shapeName:void 0,M="weaponShape"in v?v.weaponShape:void 0;return p[23]!==v?(n=(0,t.jsx)(ew,{entity:v}),p[23]=v,p[24]=n):n=p[24],p[25]!==w||p[26]!==n?(s=(0,t.jsx)(a.Suspense,{fallback:w,children:n}),p[25]=w,p[26]=n,p[27]=s):s=p[27],p[28]!==w||p[29]!==s?(u=(0,t.jsx)(e0,{fallback:w,children:s}),p[28]=w,p[29]=s,p[30]=u):u=p[30],p[31]!==v||p[32]!==F?(c=F&&(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eK,{entity:v})}),p[31]=v,p[32]=F,p[33]=c):c=p[33],p[34]!==v?(f=(0,t.jsx)(eX,{entity:v}),p[34]=v,p[35]=f):f=p[35],p[36]!==x||p[37]!==v||p[38]!==T?(d=x&&!T&&"Shape"!==v.renderType&&(0,t.jsx)(eJ,{entity:v}),p[36]=x,p[37]=v,p[38]=T,p[39]=d):d=p[39],p[40]!==u||p[41]!==c||p[42]!==f||p[43]!==d?(m=(0,t.jsxs)("group",{name:"model",children:[u,c,f,d]}),p[40]=u,p[41]=c,p[42]=f,p[43]=d,p[44]=m):m=p[44],p[45]!==F||p[46]!==T||p[47]!==M?(g=M&&T&&!F&&(0,t.jsx)("group",{name:"weapon",children:(0,t.jsx)(e0,{fallback:null,children:(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eq,{shapeName:M,playerShapeName:T})})})}),p[45]=F,p[46]=T,p[47]=M,p[48]=g):g=p[48],p[49]!==v.id||p[50]!==b||p[51]!==S||p[52]!==y||p[53]!==g||p[54]!==m?(h=(0,t.jsxs)("group",{name:v.id,position:b,quaternion:S,scale:y,children:[m,g]}),p[49]=v.id,p[50]=b,p[51]=S,p[52]=y,p[53]=g,p[54]=m,p[55]=h):h=p[55],h}function eJ(e){let a,i,o=(0,r.c)(8),{entity:l}=e;o[0]!==l.className||o[1]!==l.dataBlockId||o[2]!==l.ghostIndex||o[3]!==l.id||o[4]!==l.shapeHint?((a=[]).push(`${l.id} (${l.className})`),"number"==typeof l.ghostIndex&&a.push(`ghost ${l.ghostIndex}`),"number"==typeof l.dataBlockId&&a.push(`db ${l.dataBlockId}`),a.push(l.shapeHint?`shapeHint ${l.shapeHint}`:"shapeHint "),o[0]=l.className,o[1]=l.dataBlockId,o[2]=l.ghostIndex,o[3]=l.id,o[4]=l.shapeHint,o[5]=a):a=o[5];let n=a.join(" | ");return o[6]!==n?(i=(0,t.jsx)(f.FloatingLabel,{color:"#ff6688",children:n}),o[6]=n,o[7]=i):i=o[7],i}class e0 extends a.Component{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e,t){console.warn("[entity] Shape load failed:",e.message,t.componentStack)}render(){return this.state.hasError?this.props.fallback:this.props.children}}e.s(["EntityScene",()=>e$,"ShapeErrorBoundary",()=>e0],87297)}]); \ No newline at end of file + `,depthWrite:!1,depthTest:!1})]})}function ed(e,t){let{fogDistance:r,visibleDistance:a}=e;return[r,a]}function em({fogState:e,enabled:t}){let{scene:r,camera:l}=(0,p.useThree)(),n=(0,a.useRef)(null),s=(0,a.useMemo)(()=>(0,D.packFogVolumeData)(e.fogVolumes),[e.fogVolumes]);return(0,a.useEffect)(()=>{en||((0,M.installCustomFogShader)(),en=!0)},[]),(0,a.useEffect)(()=>{(0,D.resetGlobalFogUniforms)();let[t,a]=ed(e,l.position.y),o=new i.Fog(e.fogColor,t,a);return r.fog=o,n.current=o,(0,D.updateGlobalFogUniforms)(l.position.y,s),()=>{r.fog=null,n.current=null,(0,D.resetGlobalFogUniforms)()}},[r,l,e,s]),(0,a.useEffect)(()=>{let r=n.current;if(r)if(t){let[t,a]=ed(e,l.position.y);r.near=t,r.far=a}else r.near=1e10,r.far=1e10},[t,e,l.position.y]),(0,o.useFrame)(()=>{let r=n.current;if(!r)return;let a=l.position.y;if((0,D.updateGlobalFogUniforms)(a,s,t),t){let[t,i]=ed(e,a);r.near=t,r.far=i,r.color.copy(e.fogColor)}}),null}function eg({scene:e}){let{fogEnabled:r}=(0,d.useSettings)(),o=e.materialList||void 0,l=(0,a.useMemo)(()=>es(e.skySolidColor),[e.skySolidColor]),n=e.useSkyTextures,s=(0,a.useMemo)(()=>(function(e){let t=e.fogDistance,r=e.visibleDistance>0?e.visibleDistance:1e3,{r:a,g:o,b:l}=e.fogColor,n=new i.Color().setRGB(a,o,l).convertSRGBToLinear(),s=[];for(let t of e.fogVolumes)t.visibleDistance<=0||t.maxHeight<=t.minHeight||s.push({visibleDistance:t.visibleDistance,minHeight:t.minHeight,maxHeight:t.maxHeight,percentage:1});let u=s.reduce((e,t)=>Math.max(e,t.maxHeight),0);return{fogDistance:t,visibleDistance:r,fogColor:n,fogVolumes:s,fogLine:u,enabled:r>t}})(e),[e]),u=(0,a.useMemo)(()=>es(e.fogColor),[e.fogColor]),c=l||u,f=s.enabled&&r,m=s.fogColor,{scene:g,gl:h}=(0,p.useThree)();(0,a.useEffect)(()=>{if(f){let e=m.clone();g.background=e,h.setClearColor(e)}else if(c){let e=c[0].clone();g.background=e,h.setClearColor(e)}else g.background=null;return()=>{g.background=null}},[g,h,f,m,c]);let v=l?.[1];return(0,t.jsxs)(t.Fragment,{children:[o&&n&&o.length>0?(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ec,{materialList:o,fogColor:f?m:void 0,fogState:f?s:void 0},o)}):v?(0,t.jsx)(ef,{skyColor:v,fogColor:f?m:void 0,fogState:f?s:void 0}):null,(0,t.jsx)(a.Suspense,{children:(0,t.jsx)(ei,{scene:e})}),s.enabled?(0,t.jsx)(em,{fogState:s,enabled:r}):null]})}let eh=(0,a.lazy)(()=>e.A(30814).then(e=>({default:e.PlayerModel}))),ep=(0,a.lazy)(()=>e.A(44325).then(e=>({default:e.ExplosionShape}))),ev=(0,a.lazy)(()=>e.A(62125).then(e=>({default:e.TracerProjectile}))),ex=(0,a.lazy)(()=>e.A(62125).then(e=>({default:e.SpriteProjectile}))),eb=(0,a.lazy)(()=>e.A(25147).then(e=>({default:e.ForceFieldBare}))),ey=(0,a.lazy)(()=>e.A(61921).then(e=>({default:e.AudioEmitter}))),eS=(0,a.lazy)(()=>e.A(18599).then(e=>({default:e.WaterBlock}))),eF={1:"Storm",2:"Inferno"},ew=(0,a.memo)(function(e){let i=(0,r.c)(26),{entity:o}=e;switch(o.renderType){case"Shape":{let e;return i[0]!==o?(e=(0,t.jsx)(eT,{entity:o}),i[0]=o,i[1]=e):e=i[1],e}case"ForceFieldBare":{let e;return i[2]!==o?(e=(0,t.jsx)(eM,{entity:o}),i[2]=o,i[3]=e):e=i[3],e}case"Player":{let e;return i[4]!==o?(e=(0,t.jsx)(eD,{entity:o}),i[4]=o,i[5]=e):e=i[5],e}case"Explosion":{let e;return i[6]!==o?(e=(0,t.jsx)(eC,{entity:o}),i[6]=o,i[7]=e):e=i[7],e}case"Tracer":{let e;return i[8]!==o?(e=(0,t.jsx)(ej,{entity:o}),i[8]=o,i[9]=e):e=i[9],e}case"Sprite":{let e;return i[10]!==o?(e=(0,t.jsx)(e_,{entity:o}),i[10]=o,i[11]=e):e=i[11],e}case"AudioEmitter":{let e;return i[12]!==o?(e=(0,t.jsx)(ek,{entity:o}),i[12]=o,i[13]=e):e=i[13],e}case"Camera":{let e;return i[14]!==o?(e=(0,t.jsx)(g,{entity:o}),i[14]=o,i[15]=e):e=i[15],e}case"WayPoint":{let e;return i[16]!==o?(e=(0,t.jsx)(h,{entity:o}),i[16]=o,i[17]=e):e=i[17],e}case"TerrainBlock":{let e;return i[18]!==o.terrainData?(e=(0,t.jsx)(L,{scene:o.terrainData}),i[18]=o.terrainData,i[19]=e):e=i[19],e}case"InteriorInstance":{let e;return i[20]!==o.interiorData?(e=(0,t.jsx)(Y,{scene:o.interiorData}),i[20]=o.interiorData,i[21]=e):e=i[21],e}case"Sky":{let e;return i[22]!==o.skyData?(e=(0,t.jsx)(eg,{scene:o.skyData}),i[22]=o.skyData,i[23]=e):e=i[23],e}case"Sun":case"MissionArea":case"None":return null;case"WaterBlock":{let e;return i[24]!==o.waterData?(e=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eS,{scene:o.waterData})}),i[24]=o.waterData,i[25]=e):e=i[25],e}}});function eT(e){let i,l,n,s,m,g,h=(0,r.c)(21),{entity:p}=e,{animationEnabled:v}=(0,d.useSettings)(),x=(0,a.useRef)(null);if(h[0]!==v||h[1]!==p.rotate?(i=()=>{if(!x.current||!p.rotate||!v)return;let e=performance.now()/1e3;x.current.rotation.y=e/3*Math.PI*2},h[0]=v,h[1]=p.rotate,h[2]=i):i=h[2],(0,o.useFrame)(i),!p.shapeName)return null;let b=p.runtimeObject,y=p.shapeType??"StaticShape",S=p.dataBlock?.toLowerCase()==="flag",F=p.teamId&&p.teamId>0?eF[p.teamId]:null,w=S&&F?`${F} Flag`:null,T="Item"===p.shapeType?"pink":p.threads?"#00ff88":"yellow",M=p.rotate?x:void 0,D=b?void 0:p;return h[3]!==w?(l=w?(0,t.jsx)(f.FloatingLabel,{opacity:.6,children:w}):null,h[3]=w,h[4]=l):l=h[4],h[5]!==T||h[6]!==D||h[7]!==l?(n=(0,t.jsx)(u.ShapeRenderer,{loadingColor:T,streamEntity:D,children:l}),h[5]=T,h[6]=D,h[7]=l,h[8]=n):n=h[8],h[9]!==p.barrelShapeName||h[10]!==b?(s=p.barrelShapeName&&(0,t.jsx)(c.ShapeInfoProvider,{object:b,shapeName:p.barrelShapeName,type:"Turret",children:(0,t.jsx)("group",{position:[0,1.5,0],children:(0,t.jsx)(u.ShapeRenderer,{})})}),h[9]=p.barrelShapeName,h[10]=b,h[11]=s):s=h[11],h[12]!==M||h[13]!==n||h[14]!==s?(m=(0,t.jsxs)("group",{ref:M,children:[n,s]}),h[12]=M,h[13]=n,h[14]=s,h[15]=m):m=h[15],h[16]!==p.shapeName||h[17]!==y||h[18]!==m||h[19]!==b?(g=(0,t.jsx)(c.ShapeInfoProvider,{object:b,shapeName:p.shapeName,type:y,children:m}),h[16]=p.shapeName,h[17]=y,h[18]=m,h[19]=b,h[20]=g):g=h[20],g}function eM(e){let i,o=(0,r.c)(2),{entity:l}=e;return l.forceFieldData?(o[0]!==l.forceFieldData?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eb,{data:l.forceFieldData,scale:l.forceFieldData.dimensions})}),o[0]=l.forceFieldData,o[1]=i):i=o[1],i):null}function eD(e){let i,o=(0,r.c)(2),{entity:l}=e;return l.shapeName?(o[0]!==l?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eh,{entity:l})}),o[0]=l,o[1]=i):i=o[1],i):null}function eC(e){let i,o,l,n=(0,r.c)(10),{entity:u}=e;n[0]===Symbol.for("react.memo_cache_sentinel")?(i=s.streamPlaybackStore.getState(),n[0]=i):i=n[0];let c=i.playback;n[1]!==u.explosionDataBlockId||n[2]!==u.faceViewer||n[3]!==u.id||n[4]!==u.position||n[5]!==u.rotation||n[6]!==u.shapeName?(o={id:u.id,type:"Explosion",dataBlock:u.shapeName,position:u.position,rotation:u.rotation,faceViewer:u.faceViewer,explosionDataBlockId:u.explosionDataBlockId},n[1]=u.explosionDataBlockId,n[2]=u.faceViewer,n[3]=u.id,n[4]=u.position,n[5]=u.rotation,n[6]=u.shapeName,n[7]=o):o=n[7];let f=o;return u.shapeName&&c?(n[8]!==f?(l=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ep,{entity:f,playback:c})}),n[8]=f,n[9]=l):l=n[9],l):null}function ej(e){let i,o=(0,r.c)(2),{entity:l}=e;return o[0]!==l?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ev,{entity:l,visual:l.visual})}),o[0]=l,o[1]=i):i=o[1],i}function e_(e){let i,o=(0,r.c)(2),{entity:l}=e;return o[0]!==l.visual?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ex,{visual:l.visual})}),o[0]=l.visual,o[1]=i):i=o[1],i}function ek(e){let i,o=(0,r.c)(2),{entity:l}=e,{audioEnabled:n}=(0,d.useSettings)();return l.audioFileName&&n?(o[0]!==l?(i=(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(ey,{entity:l})}),o[0]=l,o[1]=i):i=o[1],i):null}var eR=e.i(60099),eB=e.i(85557),eL=e.i(29418);let eG=(0,b.textureToUrl)("gui/hud_alliedtriangle"),ez=(0,b.textureToUrl)("gui/hud_enemytriangle"),eU=new i.Vector3;function eN(e){let l,n,c,f,d,m,g=(0,r.c)(23),{entity:h}=e,v=(0,u.useStaticShape)(h.shapeName??h.dataBlock),{camera:x}=(0,p.useThree)(),b=(0,a.useRef)(null),y=(0,a.useRef)(null),S=(0,a.useRef)(null),F=(0,a.useRef)(null),w=(0,a.useRef)(null),[T,M]=(0,a.useState)(!0),D=(0,a.useRef)(null);g[0]!==v.scene?(l=new i.Box3().setFromObject(v.scene),g[0]=v.scene,g[1]=l):l=g[1];let C=l.max.y+.1;g[2]!==h.keyframes?(n=h.keyframes??[],g[2]=h.keyframes,g[3]=n):n=g[3];let j=n;g[4]!==j?(c=j.some(eI),g[4]=j,g[5]=c):c=g[5];let _=c;g[6]!==x||g[7]!==h.id||g[8]!==h.iffColor||g[9]!==h.playerName||g[10]!==_||g[11]!==T||g[12]!==j?(f=()=>{let e=b.current;if(!e)return;e.getWorldPosition(eU);let t=x.position.distanceTo(eU),r=x.matrixWorld.elements,a=!(-((eU.x-r[12])*r[8])+-((eU.y-r[13])*r[9])+-((eU.z-r[14])*r[10])<0)&&t<150;if(T!==a&&M(a),!a)return;let i=(0,eB.getKeyframeAtTime)(j,s.streamPlaybackStore.getState().time),o=i?.health??1;if(i?.damageState!=null&&i.damageState>=1){y.current&&(y.current.style.opacity="0"),S.current&&(S.current.style.opacity="0");return}let l=Math.max(0,Math.min(1,1-t/150)).toString();if(y.current&&(y.current.style.opacity=l),S.current&&(S.current.style.opacity=l),D.current){let e=h.playerName??h.id;D.current.textContent!==e&&(D.current.textContent=e)}if(w.current&&h.iffColor){let e=h.iffColor.r>h.iffColor.g?ez:eG;w.current.getAttribute("src")!==e&&(w.current.src=e)}F.current&&_&&(F.current.style.width=`${Math.max(0,Math.min(100,100*o))}%`,F.current.style.background=h.iffColor?`rgb(${h.iffColor.r}, ${h.iffColor.g}, ${h.iffColor.b})`:"")},g[6]=x,g[7]=h.id,g[8]=h.iffColor,g[9]=h.playerName,g[10]=_,g[11]=T,g[12]=j,g[13]=f):f=g[13],(0,o.useFrame)(f);let k=h.iffColor&&h.iffColor.r>h.iffColor.g?ez:eG;return g[14]!==h.id||g[15]!==h.playerName||g[16]!==_||g[17]!==C||g[18]!==k||g[19]!==T?(d=T&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(eR.Html,{position:[0,C,0],center:!0,children:(0,t.jsx)("div",{ref:y,className:eL.default.Top,children:(0,t.jsx)("img",{ref:w,className:eL.default.IffArrow,src:k,alt:""})})}),(0,t.jsx)(eR.Html,{position:[0,-.2,0],center:!0,children:(0,t.jsxs)("div",{ref:S,className:eL.default.Bottom,children:[(0,t.jsx)("div",{ref:D,className:eL.default.Name,children:h.playerName??h.id}),_&&(0,t.jsx)("div",{className:eL.default.HealthBar,children:(0,t.jsx)("div",{ref:F,className:eL.default.HealthFill})})]})})]}),g[14]=h.id,g[15]=h.playerName,g[16]=_,g[17]=C,g[18]=k,g[19]=T,g[20]=d):d=g[20],g[21]!==d?(m=(0,t.jsx)("group",{ref:b,children:d}),g[21]=d,g[22]=m):m=g[22],m}function eI(e){return null!=e.health}var eA=e.i(78779);let eE=(0,b.textureToUrl)("commander/MiniIcons/com_flag_grey"),eP=new i.Vector3;function eH(e){let i,l,n,s,u,c=(0,r.c)(9),{entity:f}=e,d=(0,a.useRef)(null),m=(0,a.useRef)(null),g=(0,a.useRef)(null),{camera:h}=(0,p.useThree)();c[0]!==h||c[1]!==f.iffColor?(i=()=>{if(m.current&&f.iffColor){let{r:e,g:t,b:r}=f.iffColor;m.current.style.backgroundColor=`rgb(${e},${t},${r})`}if(g.current&&d.current){d.current.getWorldPosition(eP);let e=h.position.distanceTo(eP);g.current.textContent=e.toFixed(1)}},c[0]=h,c[1]=f.iffColor,c[2]=i):i=c[2],(0,o.useFrame)(i);let v=f.iffColor?`rgb(${f.iffColor.r},${f.iffColor.g},${f.iffColor.b})`:"rgb(200,200,200)";c[3]===Symbol.for("react.memo_cache_sentinel")?(l=[0,1.5,0],c[3]=l):l=c[3],c[4]===Symbol.for("react.memo_cache_sentinel")?(n=(0,t.jsx)("span",{ref:g,className:eA.default.Distance}),c[4]=n):n=c[4],c[5]!==v?(s={backgroundColor:v,"--flag-icon-url":`url(${eE})`},c[5]=v,c[6]=s):s=c[6];let x=s;return c[7]!==x?(u=(0,t.jsx)("group",{ref:d,children:(0,t.jsx)(eR.Html,{position:l,center:!0,children:(0,t.jsxs)("div",{className:eA.default.Root,children:[n,(0,t.jsx)("div",{ref:m,className:eA.default.Icon,style:x})]})})}),c[7]=x,c[8]=u):u=c[8],u}var eV=e.i(58647);let eq=(0,a.lazy)(()=>e.A(44325).then(e=>({default:e.WeaponModel})));function e$(e){let a,i=(0,r.c)(3),{missionType:o}=e,l=(0,d.useDebug)(),n=l?.debugMode??!1;return i[0]!==n||i[1]!==o?(a=(0,t.jsx)("group",{ref:eW,children:(0,t.jsx)(eO,{missionType:o,debugMode:n})}),i[0]=n,i[1]=o,i[2]=a):a=i[2],a}function eW(e){s.streamPlaybackStore.setState({root:e})}let eO=(0,a.memo)(function({missionType:e,debugMode:r}){let i=(0,l.useAllGameEntities)(),o=(0,a.useRef)(new Map).current,n=new Set;for(let e of i)n.add(e.id),o.set(e.id,e);for(let e of o.keys())n.has(e)||o.delete(e);let s=(0,a.useMemo)(()=>{let t=[],r=e?.toLowerCase();for(let e of o.values()){if(r&&e.missionTypesList){let t=new Set(e.missionTypesList.toLowerCase().split(/\s+/).filter(Boolean));if(t.size>0&&!t.has(r))continue}t.push(e)}return t},[i,e]);return(0,t.jsx)(t.Fragment,{children:s.map(e=>(0,t.jsx)(eY,{entity:e,debugMode:r},e.id))})}),eY=(0,a.memo)(function(e){let a,i=(0,r.c)(8),{entity:o,debugMode:l}=e;if((0,n.isSceneEntity)(o)){let e,r;return i[0]!==o?(e=(0,t.jsx)(ew,{entity:o}),i[0]=o,i[1]=e):e=i[1],i[2]!==o.id||i[3]!==e?(r=(0,t.jsx)("group",{name:o.id,children:e}),i[2]=o.id,i[3]=e,i[4]=r):r=i[4],r}return"None"===o.renderType?null:(i[5]!==l||i[6]!==o?(a=(0,t.jsx)(eZ,{entity:o,debugMode:l}),i[5]=l,i[6]=o,i[7]=a):a=i[7],a)});function eK(e){let a,i=(0,r.c)(2),{entity:o}=e,l=(0,eV.useEngineSelector)(eQ);return o.id===l?null:(i[0]!==o?(a=(0,t.jsx)(eN,{entity:o}),i[0]=o,i[1]=a):a=i[1],a)}function eQ(e){return e.playback.streamSnapshot?.controlPlayerGhostId}function eX({entity:e}){let r=(0,a.useRef)(!1),[i,l]=(0,a.useState)(()=>((("targetRenderFlags"in e?e.targetRenderFlags:void 0)??0)&2)!=0);return(r.current=i,(0,o.useFrame)(()=>{let t=((("targetRenderFlags"in e?e.targetRenderFlags:void 0)??0)&2)!=0;t!==r.current&&(r.current=t,l(t))}),i)?(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eH,{entity:e})}):null}function eZ(e){let o,l,n,s,u,c,f,d,m,g,h,p=(0,r.c)(56),{entity:v,debugMode:x}=e,b=v.position,y=v.scale;e:{let e;if(!v.rotation){o=void 0;break e}p[0]!==v.rotation?(e=new i.Quaternion(...v.rotation),p[0]=v.rotation,p[1]=e):e=p[1],o=e}let S=o,F="Player"===v.renderType;if("Shape"===v.renderType&&!v.shapeName){let e,r,a,i,o,l,n=v.id;return p[2]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("sphereGeometry",{args:[.3,6,4]}),p[2]=e):e=p[2],p[3]!==v.className?(r=(0,eB.entityTypeColor)(v.className),p[3]=v.className,p[4]=r):r=p[4],p[5]!==r?(a=(0,t.jsxs)("mesh",{children:[e,(0,t.jsx)("meshBasicMaterial",{color:r,wireframe:!0})]}),p[5]=r,p[6]=a):a=p[6],p[7]!==x||p[8]!==v?(i=x&&(0,t.jsx)(eJ,{entity:v}),p[7]=x,p[8]=v,p[9]=i):i=p[9],p[10]!==v?(o=(0,t.jsx)(eX,{entity:v}),p[10]=v,p[11]=o):o=p[11],p[12]!==v.id||p[13]!==b||p[14]!==S||p[15]!==y||p[16]!==a||p[17]!==i||p[18]!==o?(l=(0,t.jsxs)("group",{name:n,position:b,quaternion:S,scale:y,children:[a,i,o]}),p[12]=v.id,p[13]=b,p[14]=S,p[15]=y,p[16]=a,p[17]=i,p[18]=o,p[19]=l):l=p[19],l}p[20]!==v.className||p[21]!==v.renderType?(l="Explosion"===v.renderType?null:(0,t.jsxs)("mesh",{children:[(0,t.jsx)("sphereGeometry",{args:[.5,8,6]}),(0,t.jsx)("meshBasicMaterial",{color:(0,eB.entityTypeColor)(v.className),wireframe:!0})]}),p[20]=v.className,p[21]=v.renderType,p[22]=l):l=p[22];let w=l,T="shapeName"in v?v.shapeName:void 0,M="weaponShape"in v?v.weaponShape:void 0;return p[23]!==v?(n=(0,t.jsx)(ew,{entity:v}),p[23]=v,p[24]=n):n=p[24],p[25]!==w||p[26]!==n?(s=(0,t.jsx)(a.Suspense,{fallback:w,children:n}),p[25]=w,p[26]=n,p[27]=s):s=p[27],p[28]!==w||p[29]!==s?(u=(0,t.jsx)(e0,{fallback:w,children:s}),p[28]=w,p[29]=s,p[30]=u):u=p[30],p[31]!==v||p[32]!==F?(c=F&&(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eK,{entity:v})}),p[31]=v,p[32]=F,p[33]=c):c=p[33],p[34]!==v?(f=(0,t.jsx)(eX,{entity:v}),p[34]=v,p[35]=f):f=p[35],p[36]!==x||p[37]!==v||p[38]!==T?(d=x&&!T&&"Shape"!==v.renderType&&(0,t.jsx)(eJ,{entity:v}),p[36]=x,p[37]=v,p[38]=T,p[39]=d):d=p[39],p[40]!==u||p[41]!==c||p[42]!==f||p[43]!==d?(m=(0,t.jsxs)("group",{name:"model",children:[u,c,f,d]}),p[40]=u,p[41]=c,p[42]=f,p[43]=d,p[44]=m):m=p[44],p[45]!==F||p[46]!==T||p[47]!==M?(g=M&&T&&!F&&(0,t.jsx)("group",{name:"weapon",children:(0,t.jsx)(e0,{fallback:null,children:(0,t.jsx)(a.Suspense,{fallback:null,children:(0,t.jsx)(eq,{shapeName:M,playerShapeName:T})})})}),p[45]=F,p[46]=T,p[47]=M,p[48]=g):g=p[48],p[49]!==v.id||p[50]!==b||p[51]!==S||p[52]!==y||p[53]!==g||p[54]!==m?(h=(0,t.jsxs)("group",{name:v.id,position:b,quaternion:S,scale:y,children:[m,g]}),p[49]=v.id,p[50]=b,p[51]=S,p[52]=y,p[53]=g,p[54]=m,p[55]=h):h=p[55],h}function eJ(e){let a,i,o=(0,r.c)(8),{entity:l}=e;o[0]!==l.className||o[1]!==l.dataBlockId||o[2]!==l.ghostIndex||o[3]!==l.id||o[4]!==l.shapeHint?((a=[]).push(`${l.id} (${l.className})`),"number"==typeof l.ghostIndex&&a.push(`ghost ${l.ghostIndex}`),"number"==typeof l.dataBlockId&&a.push(`db ${l.dataBlockId}`),a.push(l.shapeHint?`shapeHint ${l.shapeHint}`:"shapeHint "),o[0]=l.className,o[1]=l.dataBlockId,o[2]=l.ghostIndex,o[3]=l.id,o[4]=l.shapeHint,o[5]=a):a=o[5];let n=a.join(" | ");return o[6]!==n?(i=(0,t.jsx)(f.FloatingLabel,{color:"#ff6688",children:n}),o[6]=n,o[7]=i):i=o[7],i}class e0 extends a.Component{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e,t){console.warn("[entity] Shape load failed:",e.message,t.componentStack)}render(){return this.state.hasError?this.props.fallback:this.props.children}}e.s(["EntityScene",()=>e$,"ShapeErrorBoundary",()=>e0],87297)}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/d16b6f1b4eacbf2b.js b/docs/_next/static/chunks/d16b6f1b4eacbf2b.js new file mode 100644 index 00000000..36aa7e67 --- /dev/null +++ b/docs/_next/static/chunks/d16b6f1b4eacbf2b.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,60505,e=>{"use strict";var t=e.i(932),r=e.i(71645),n=e.i(71753),c=e.i(15080),i=e.i(90072),o=e.i(12631),a=e.i(98755),u=e.i(58647),l=e.i(93784),m=e.i(5729),s=e.i(79123),d=e.i(51475),v=e.i(89119);let p=1/d.TICK_RATE,y=new i.Vector3,E=new i.Vector3;function h(){let e,i,h,w,T,b,M,P,L,_,O,R,I,A,C=(0,t.c)(27),k=(0,a.useLiveSelector)(S),K=(0,a.useLiveSelector)(g),z=(0,a.useLiveSelector)(f),X=(0,u.useEngineStoreApi)(),{speedMultiplier:Y}=(0,s.useControls)(),N=(0,r.useRef)(null),{gl:x}=(0,c.useThree)(),[,H]=(0,o.useKeyboardControls)(),D=(0,r.useRef)(0),U=(0,r.useRef)(0);C[0]===Symbol.for("react.memo_cache_sentinel")?(e={yaw:0,pitch:0,prevYaw:0,prevPitch:0,initialized:!1,lastSyncedCamera:null},C[0]=e):e=C[0];let V=(0,r.useRef)(e),W=(0,r.useRef)(0);return C[1]!==k||C[2]!==K||C[3]!==X?(i=()=>{k&&("connected"===K||"authenticating"===K)?N.current!==k&&(console.log("[LiveObserver] wiring adapter to engine store"),X.getState().setRecording({source:"live",duration:1/0,missionName:null,gameType:null,streamingPlayback:k}),X.getState().setPlaybackStatus("playing"),N.current=k,V.current.initialized=!1,V.current.lastSyncedCamera=null):!k&&N.current&&(X.getState().setRecording(null),N.current=null,V.current.initialized=!1)},h=[k,K,X],C[1]=k,C[2]=K,C[3]=X,C[4]=i,C[5]=h):(i=C[4],h=C[5]),(0,r.useEffect)(i,h),C[6]!==x.domElement?(w=()=>{let e=!1,t=t=>{document.pointerLockElement?(D.current=D.current+.002*t.movementX,U.current=U.current+.002*t.movementY):e&&(D.current=D.current+t.movementX*m.MOUSE_SENSITIVITY,U.current=U.current+t.movementY*m.MOUSE_SENSITIVITY)},r=t=>{document.pointerLockElement||t.target!==x.domElement||(e=!0)},n=()=>{e=!1};return document.addEventListener("mousemove",t),document.addEventListener("mousedown",r),document.addEventListener("mouseup",n),()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mousedown",r),document.removeEventListener("mouseup",n)}},T=[x.domElement],C[6]=x.domElement,C[7]=w,C[8]=T):(w=C[7],T=C[8]),(0,r.useEffect)(w,T),C[9]===Symbol.for("react.memo_cache_sentinel")?(b=()=>{let e=e=>{document.pointerLockElement&&N.current&&"follow"===N.current.observerMode&&(e.stopImmediatePropagation(),N.current.cycleObserveNext())};return document.addEventListener("click",e,{capture:!0}),()=>{document.removeEventListener("click",e,{capture:!0})}},C[9]=b):b=C[9],C[10]!==x.domElement?(M=[x.domElement],C[10]=x.domElement,C[11]=M):M=C[11],(0,r.useEffect)(b,M),C[12]===Symbol.for("react.memo_cache_sentinel")?(P=()=>{let e=e=>{if("KeyO"!==e.code||e.metaKey||e.ctrlKey||e.altKey)return;let t=e.target;"INPUT"===t.tagName||"TEXTAREA"===t.tagName||t.isContentEditable||N.current&&(N.current.toggleObserverMode(),console.log(`[LiveObserver] observer mode: ${N.current.observerMode}`))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},L=[],C[12]=P,C[13]=L):(P=C[12],L=C[13]),(0,r.useEffect)(P,L),C[14]!==K||C[15]!==H?(_=(e,t)=>{if(!N.current||"connected"!==K)return;let{lookUp:r,lookDown:n,lookLeft:c,lookRight:i}=H();i&&(D.current=D.current+m.ARROW_LOOK_SPEED*t),c&&(D.current=D.current-m.ARROW_LOOK_SPEED*t),n&&(U.current=U.current+m.ARROW_LOOK_SPEED*t),r&&(U.current=U.current-m.ARROW_LOOK_SPEED*t)},C[14]=K,C[15]=H,C[16]=_):_=C[16],(0,n.useFrame)(_),C[17]!==K||C[18]!==H||C[19]!==z||C[20]!==Y?(O=()=>{if(!N.current||"connected"!==K)return;let{forward:e,backward:t,left:r,right:n,up:c,down:i}=H(),o=0,a=0,u=0;e&&(a=1),t&&(a-=1),r&&(o=-1),n&&(o+=1),c&&(u=1),i&&(u-=1);let l=D.current,m=U.current;D.current=0,U.current=0;let s=V.current;s.prevYaw=s.yaw,s.prevPitch=s.pitch,s.yaw=s.yaw+l,s.pitch=Math.max(-v.MAX_PITCH,Math.min(v.MAX_PITCH,s.pitch+m)),W.current=0;let d=Math.min(1,Y);z({x:o*d,y:a*d,z:u*d,yaw:l,pitch:m,roll:0,trigger:[!1,!0,!1,!1,!1,!1],freeLook:!1})},C[17]=K,C[18]=H,C[19]=z,C[20]=Y,C[21]=O):O=C[21],(0,d.useTick)(O),C[22]!==K?(R=(e,t)=>{if(!N.current||"connected"!==K)return;let r=V.current,n=N.current.getSnapshot(),c=n?.camera;if(c&&c!==r.lastSyncedCamera&&"number"==typeof c.yaw&&"number"==typeof c.pitch){let e=D.current,t=U.current;r.prevYaw=r.initialized?r.yaw:c.yaw,r.prevPitch=r.initialized?r.pitch:c.pitch,r.yaw=c.yaw+e,r.pitch=Math.max(-v.MAX_PITCH,Math.min(v.MAX_PITCH,c.pitch+t)),r.lastSyncedCamera=c,r.initialized=!0}if(!r.initialized)return;W.current=W.current+t;let i=Math.min(1,W.current/p),o=r.prevYaw+(r.yaw-r.prevYaw)*i+D.current,a=Math.max(-v.MAX_PITCH,Math.min(v.MAX_PITCH,r.prevPitch+(r.pitch-r.prevPitch)*i+U.current)),[u,m,s,d]=(0,v.yawPitchToQuaternion)(o,a);if(c?.mode==="third-person"&&c.orbitTargetId){let t=l.streamPlaybackStore.getState().root,r=t?.children.find(e=>e.name===c.orbitTargetId);if(r){E.copy(r.position);let t=l.streamPlaybackStore.getState().entities.get(c.orbitTargetId);t?.renderType==="Player"&&(E.y=E.y+1);let n=Math.sin(a),i=Math.cos(a),u=Math.sin(o),m=Math.cos(o);if(y.set(-m*i,-n,u*i),y.lengthSq()>1e-8){y.normalize();let t=Math.max(.1,c.orbitDistance??4);e.camera.position.copy(E).addScaledVector(y,t),e.camera.lookAt(E)}}}else e.camera.quaternion.set(u,m,s,d)},C[22]=K,C[23]=R):R=C[23],(0,n.useFrame)(R,1),C[24]!==X?(I=()=>()=>{N.current&&(X.getState().setRecording(null),N.current=null)},A=[X],C[24]=X,C[25]=I,C[26]=A):(I=C[25],A=C[26]),(0,r.useEffect)(I,A),null}function f(e){return e.sendMove}function g(e){return e.gameStatus}function S(e){return e.adapter}e.s(["LiveObserver",()=>h])}]); \ No newline at end of file diff --git a/docs/_next/static/chunks/e4a5074909f0df67.js b/docs/_next/static/chunks/e4a5074909f0df67.js new file mode 100644 index 00000000..06462906 --- /dev/null +++ b/docs/_next/static/chunks/e4a5074909f0df67.js @@ -0,0 +1 @@ +(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,12631,e=>{"use strict";var t=e.i(71645),a=e.i(8155);let r=e=>{let r=(0,a.createStore)(e),n=e=>(function(e,a=e=>e){let r=t.default.useSyncExternalStore(e.subscribe,t.default.useCallback(()=>a(e.getState()),[e,a]),t.default.useCallback(()=>a(e.getInitialState()),[e,a]));return t.default.useDebugValue(r),r})(r,e);return Object.assign(n,r),n};var n=e.i(79473);let i=t.createContext(null);function o({map:e,children:a,onChange:o,domElement:s}){let l=e.map(e=>e.name+e.keys).join("-"),d=t.useMemo(()=>{let t;return(t=(0,n.subscribeWithSelector)(()=>e.reduce((e,t)=>({...e,[t.name]:!1}),{})))?r(t):r},[l]),c=t.useMemo(()=>[d.subscribe,d.getState,d],[l]),h=d.setState;return t.useEffect(()=>{let t=e.map(({name:e,keys:t,up:a})=>({keys:t,up:a,fn:t=>{h({[e]:t}),o&&o(e,t,c[1]())}})).reduce((e,{keys:t,fn:a,up:r=!0})=>(t.forEach(t=>e[t]={fn:a,pressed:!1,up:r}),e),{}),a=({key:e,code:a})=>{let r=t[e]||t[a];if(!r)return;let{fn:n,pressed:i,up:o}=r;r.pressed=!0,(o||!i)&&n(!0)},r=({key:e,code:a})=>{let r=t[e]||t[a];if(!r)return;let{fn:n,up:i}=r;r.pressed=!1,i&&n(!1)},n=s||window;return n.addEventListener("keydown",a,{passive:!0}),n.addEventListener("keyup",r,{passive:!0}),()=>{n.removeEventListener("keydown",a),n.removeEventListener("keyup",r)}},[s,l]),t.createElement(i.Provider,{value:c,children:a})}function s(e){let[a,r,n]=t.useContext(i);return e?n(e):[a,r]}e.s(["KeyboardControls",()=>o,"useKeyboardControls",()=>s],12631)},5729,e=>{"use strict";var t,a=e.i(43476),r=e.i(932),n=e.i(71645),i=e.i(90072),o=e.i(71753),s=e.i(15080),l=e.i(12631),d=e.i(85413),c=Object.defineProperty,h=(e,t,a)=>{let r;return(r="symbol"!=typeof t?t+"":t)in e?c(e,r,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[r]=a,a};let u=new i.Euler(0,0,0,"YXZ"),g=new i.Vector3,p={type:"change"},m={type:"lock"},f={type:"unlock"},F=Math.PI/2;class v extends d.EventDispatcher{constructor(e,t){super(),h(this,"camera"),h(this,"domElement"),h(this,"isLocked"),h(this,"minPolarAngle"),h(this,"maxPolarAngle"),h(this,"pointerSpeed"),h(this,"onMouseMove",e=>{this.domElement&&!1!==this.isLocked&&(u.setFromQuaternion(this.camera.quaternion),u.y-=.002*e.movementX*this.pointerSpeed,u.x-=.002*e.movementY*this.pointerSpeed,u.x=Math.max(F-this.maxPolarAngle,Math.min(F-this.minPolarAngle,u.x)),this.camera.quaternion.setFromEuler(u),this.dispatchEvent(p))}),h(this,"onPointerlockChange",()=>{this.domElement&&(this.domElement.ownerDocument.pointerLockElement===this.domElement?(this.dispatchEvent(m),this.isLocked=!0):(this.dispatchEvent(f),this.isLocked=!1))}),h(this,"onPointerlockError",()=>{console.error("THREE.PointerLockControls: Unable to use Pointer Lock API")}),h(this,"connect",e=>{this.domElement=e||this.domElement,this.domElement&&(this.domElement.ownerDocument.addEventListener("mousemove",this.onMouseMove),this.domElement.ownerDocument.addEventListener("pointerlockchange",this.onPointerlockChange),this.domElement.ownerDocument.addEventListener("pointerlockerror",this.onPointerlockError))}),h(this,"disconnect",()=>{this.domElement&&(this.domElement.ownerDocument.removeEventListener("mousemove",this.onMouseMove),this.domElement.ownerDocument.removeEventListener("pointerlockchange",this.onPointerlockChange),this.domElement.ownerDocument.removeEventListener("pointerlockerror",this.onPointerlockError))}),h(this,"dispose",()=>{this.disconnect()}),h(this,"getObject",()=>this.camera),h(this,"direction",new i.Vector3(0,0,-1)),h(this,"getDirection",e=>e.copy(this.direction).applyQuaternion(this.camera.quaternion)),h(this,"moveForward",e=>{g.setFromMatrixColumn(this.camera.matrix,0),g.crossVectors(this.camera.up,g),this.camera.position.addScaledVector(g,e)}),h(this,"moveRight",e=>{g.setFromMatrixColumn(this.camera.matrix,0),this.camera.position.addScaledVector(g,e)}),h(this,"lock",()=>{this.domElement&&this.domElement.requestPointerLock()}),h(this,"unlock",()=>{this.domElement&&this.domElement.ownerDocument.exitPointerLock()}),this.camera=e,this.domElement=t,this.isLocked=!1,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.pointerSpeed=1,t&&this.connect(t)}}var y=e.i(79123),S=e.i(68294),k=e.i(93784);(t={}).forward="forward",t.backward="backward",t.left="left",t.right="right",t.up="up",t.down="down",t.lookUp="lookUp",t.lookDown="lookDown",t.lookLeft="lookLeft",t.lookRight="lookRight",t.camera1="camera1",t.camera2="camera2",t.camera3="camera3",t.camera4="camera4",t.camera5="camera5",t.camera6="camera6",t.camera7="camera7",t.camera8="camera8",t.camera9="camera9";let b=Math.PI/2-.01;function P(){let e,t,a,d,c,h,u,g,p,m,f,F,P,I=(0,r.c)(26),{speedMultiplier:x,setSpeedMultiplier:D}=(0,y.useControls)(),[C,E]=(0,l.useKeyboardControls)(),{camera:w,gl:M}=(0,s.useThree)(),{nextCamera:B,setCameraIndex:T,cameraCount:R}=(0,S.useCameras)(),N=(0,n.useRef)(null);I[0]===Symbol.for("react.memo_cache_sentinel")?(e=new i.Vector3,I[0]=e):e=I[0];let G=(0,n.useRef)(e);I[1]===Symbol.for("react.memo_cache_sentinel")?(t=new i.Vector3,I[1]=t):t=I[1];let j=(0,n.useRef)(t);I[2]===Symbol.for("react.memo_cache_sentinel")?(a=new i.Vector3,I[2]=a):a=I[2];let A=(0,n.useRef)(a);I[3]===Symbol.for("react.memo_cache_sentinel")?(d=new i.Euler(0,0,0,"YXZ"),I[3]=d):d=I[3];let U=(0,n.useRef)(d);return I[4]!==w||I[5]!==M.domElement?(c=()=>{let e=new v(w,M.domElement);return N.current=e,()=>{e.dispose()}},h=[w,M.domElement],I[4]=w,I[5]=M.domElement,I[6]=c,I[7]=h):(c=I[6],h=I[7]),(0,n.useEffect)(c,h),I[8]!==w||I[9]!==M.domElement||I[10]!==B?(u=()=>{let e=M.domElement,t=new i.Euler(0,0,0,"YXZ"),a=!1,r=!1,n=0,o=0,s=t=>{N.current?.isLocked||t.target===e&&(a=!0,r=!1,n=t.clientX,o=t.clientY)},l=e=>{!a||!r&&3>Math.abs(e.clientX-n)&&3>Math.abs(e.clientY-o)||(r=!0,t.setFromQuaternion(w.quaternion,"YXZ"),t.y=t.y-.003*e.movementX,t.x=t.x-.003*e.movementY,t.x=Math.max(-b,Math.min(b,t.x)),w.quaternion.setFromEuler(t))},d=()=>{a=!1},c=t=>{let a=N.current;!a||a.isLocked?B():t.target!==e||r||a.lock()};return e.addEventListener("mousedown",s),document.addEventListener("mousemove",l),document.addEventListener("mouseup",d),document.addEventListener("click",c),()=>{e.removeEventListener("mousedown",s),document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",d),document.removeEventListener("click",c)}},g=[w,M.domElement,B],I[8]=w,I[9]=M.domElement,I[10]=B,I[11]=u,I[12]=g):(u=I[11],g=I[12]),(0,n.useEffect)(u,g),I[13]!==R||I[14]!==T||I[15]!==C?(p=()=>{let e=["camera1","camera2","camera3","camera4","camera5","camera6","camera7","camera8","camera9"];return C(t=>{for(let a=0;a{let e=e=>{e.preventDefault();let t=e.deltaY>0?-1:1,a=Math.max(.05,Math.min(.5,Math.abs(.01*e.deltaY)))*t;D(e=>Math.max(.1,Math.min(5,Math.round((e+a)*20)/20)))},t=M.domElement;return t.addEventListener("wheel",e,{passive:!1}),()=>{t.removeEventListener("wheel",e)}},F=[M.domElement,D],I[18]=M.domElement,I[19]=D,I[20]=f,I[21]=F):(f=I[20],F=I[21]),(0,n.useEffect)(f,F),I[22]!==w||I[23]!==E||I[24]!==x?(P=(e,t)=>{let a=k.streamPlaybackStore.getState();if(a.playback&&!a.freeFlyCamera)return;let{forward:r,backward:n,left:i,right:o,up:s,down:l,lookUp:d,lookDown:c,lookLeft:h,lookRight:u}=E();if((d||c||h||u)&&(U.current.setFromQuaternion(w.quaternion,"YXZ"),h&&(U.current.y=U.current.y+ +t),u&&(U.current.y=U.current.y-t),d&&(U.current.x=U.current.x+ +t),c&&(U.current.x=U.current.x-t),U.current.x=Math.max(-b,Math.min(b,U.current.x)),w.quaternion.setFromEuler(U.current)),!r&&!n&&!i&&!o&&!s&&!l)return;let g=80*x;w.getWorldDirection(G.current),G.current.normalize(),j.current.crossVectors(w.up,G.current).normalize(),A.current.set(0,0,0),r&&A.current.add(G.current),n&&A.current.sub(G.current),i&&A.current.add(j.current),o&&A.current.sub(j.current),s&&(A.current.y=A.current.y+1),l&&(A.current.y=A.current.y-1),A.current.lengthSq()>0&&(A.current.normalize().multiplyScalar(g*t),w.position.add(A.current))},I[22]=w,I[23]=E,I[24]=x,I[25]=P):P=I[25],(0,o.useFrame)(P),null}function I(){let e,t,i=(0,r.c)(2);return i[0]===Symbol.for("react.memo_cache_sentinel")?(e=[],i[0]=e):e=i[0],(0,n.useEffect)(x,e),i[1]===Symbol.for("react.memo_cache_sentinel")?(t=(0,a.jsx)(P,{}),i[1]=t):t=i[1],t}function x(){return window.addEventListener("keydown",D,{capture:!0}),window.addEventListener("keyup",D,{capture:!0}),()=>{window.removeEventListener("keydown",D,{capture:!0}),window.removeEventListener("keyup",D,{capture:!0})}}function D(e){(e.metaKey||e.ctrlKey)&&"k"===e.key||e.metaKey&&e.stopImmediatePropagation()}e.s(["ARROW_LOOK_SPEED",0,1,"KEYBOARD_CONTROLS",0,[{name:"forward",keys:["KeyW"]},{name:"backward",keys:["KeyS"]},{name:"left",keys:["KeyA"]},{name:"right",keys:["KeyD"]},{name:"up",keys:["Space"]},{name:"down",keys:["ShiftLeft","ShiftRight"]},{name:"lookUp",keys:["ArrowUp"]},{name:"lookDown",keys:["ArrowDown"]},{name:"lookLeft",keys:["ArrowLeft"]},{name:"lookRight",keys:["ArrowRight"]},{name:"camera1",keys:["Digit1"]},{name:"camera2",keys:["Digit2"]},{name:"camera3",keys:["Digit3"]},{name:"camera4",keys:["Digit4"]},{name:"camera5",keys:["Digit5"]},{name:"camera6",keys:["Digit6"]},{name:"camera7",keys:["Digit7"]},{name:"camera8",keys:["Digit8"]},{name:"camera9",keys:["Digit9"]}],"MOUSE_SENSITIVITY",0,.003,"ObserverControls",()=>I],5729)},76775,(e,t,a)=>{function r(e,t,a,r){return Math.round(e/a)+" "+r+(t>=1.5*a?"s":"")}t.exports=function(e,t){t=t||{};var a,n,i,o,s=typeof e;if("string"===s&&e.length>0){var l=e;if(!((l=String(l)).length>100)){var d=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(l);if(d){var c=parseFloat(d[1]);switch((d[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*c;case"weeks":case"week":case"w":return 6048e5*c;case"days":case"day":case"d":return 864e5*c;case"hours":case"hour":case"hrs":case"hr":case"h":return 36e5*c;case"minutes":case"minute":case"mins":case"min":case"m":return 6e4*c;case"seconds":case"second":case"secs":case"sec":case"s":return 1e3*c;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:break}}}return}if("number"===s&&isFinite(e)){return t.long?(n=Math.abs(a=e))>=864e5?r(a,n,864e5,"day"):n>=36e5?r(a,n,36e5,"hour"):n>=6e4?r(a,n,6e4,"minute"):n>=1e3?r(a,n,1e3,"second"):a+" ms":(o=Math.abs(i=e))>=864e5?Math.round(i/864e5)+"d":o>=36e5?Math.round(i/36e5)+"h":o>=6e4?Math.round(i/6e4)+"m":o>=1e3?Math.round(i/1e3)+"s":i+"ms"}throw Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},7003,(e,t,a)=>{t.exports=function(t){function a(e){let t,n,i,o=null;function s(...e){if(!s.enabled)return;let r=Number(new Date);s.diff=r-(t||r),s.prev=t,s.curr=r,t=r,e[0]=a.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let n=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,(t,r)=>{if("%%"===t)return"%";n++;let i=a.formatters[r];if("function"==typeof i){let a=e[n];t=i.call(s,a),e.splice(n,1),n--}return t}),a.formatArgs.call(s,e),(s.log||a.log).apply(s,e)}return s.namespace=e,s.useColors=a.useColors(),s.color=a.selectColor(e),s.extend=r,s.destroy=a.destroy,Object.defineProperty(s,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(n!==a.namespaces&&(n=a.namespaces,i=a.enabled(e)),i),set:e=>{o=e}}),"function"==typeof a.init&&a.init(s),s}function r(e,t){let r=a(this.namespace+(void 0===t?":":t)+e);return r.log=this.log,r}function n(e,t){let a=0,r=0,n=-1,i=0;for(;a"-"+e)].join(",");return a.enable(""),e},a.enable=function(e){for(let t of(a.save(e),a.namespaces=e,a.names=[],a.skips=[],("string"==typeof e?e:"").trim().replace(/\s+/g,",").split(",").filter(Boolean)))"-"===t[0]?a.skips.push(t.slice(1)):a.names.push(t)},a.enabled=function(e){for(let t of a.skips)if(n(e,t))return!1;for(let t of a.names)if(n(e,t))return!0;return!1},a.humanize=e.r(76775),a.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(t).forEach(e=>{a[e]=t[e]}),a.names=[],a.skips=[],a.formatters={},a.selectColor=function(e){let t=0;for(let a=0;a{let r;var n=e.i(47167);a.formatArgs=function(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+t.exports.humanize(this.diff),!this.useColors)return;let a="color: "+this.color;e.splice(1,0,a,"color: inherit");let r=0,n=0;e[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(r++,"%c"===e&&(n=r))}),e.splice(n,0,a)},a.save=function(e){try{e?a.storage.setItem("debug",e):a.storage.removeItem("debug")}catch(e){}},a.load=function(){let e;try{e=a.storage.getItem("debug")||a.storage.getItem("DEBUG")}catch(e){}return!e&&void 0!==n.default&&"env"in n.default&&(e=n.default.env.DEBUG),e},a.useColors=function(){let e;return"u">typeof window&&!!window.process&&("renderer"===window.process.type||!!window.process.__nwjs)||!("u">typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("u">typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"u">typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"u">typeof navigator&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||"u">typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},a.storage=function(){try{return localStorage}catch(e){}}(),r=!1,a.destroy=()=>{r||(r=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))},a.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],a.log=console.debug||console.log||(()=>{}),t.exports=e.r(7003)(a);let{formatters:i}=t.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},91891,11251,88787,94802,25311,89119,10244,e=>{"use strict";var t={},a=function(e,a,r,n,i){var o=new Worker(t[a]||(t[a]=URL.createObjectURL(new Blob([e+';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'],{type:"text/javascript"}))));return o.onmessage=function(e){var t=e.data,a=t.$e$;if(a){var r=Error(a[0]);r.code=a[1],r.stack=a[2],i(r,null)}else i(null,t)},o.postMessage(r,n),o},r=Uint8Array,n=Uint16Array,i=Int32Array,o=new r([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),s=new r([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),l=new r([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),d=function(e,t){for(var a=new n(31),r=0;r<31;++r)a[r]=t+=1<>1|(21845&F)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,f[F]=((65280&v)>>8|(255&v)<<8)>>1}for(var y=function(e,t,a){for(var r,i=e.length,o=0,s=new n(t);o>d]=c}else for(o=0,r=new n(i);o>15-e[o]);return r},S=new r(288),F=0;F<144;++F)S[F]=8;for(var F=144;F<256;++F)S[F]=9;for(var F=256;F<280;++F)S[F]=7;for(var F=280;F<288;++F)S[F]=8;for(var k=new r(32),F=0;F<32;++F)k[F]=5;var b=y(S,9,0),P=y(S,9,1),I=y(k,5,0),x=y(k,5,1),D=function(e){for(var t=e[0],a=1;at&&(t=e[a]);return t},C=function(e,t,a){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(7&t)&a},E=function(e,t){var a=t/8|0;return(e[a]|e[a+1]<<8|e[a+2]<<16)>>(7&t)},w=function(e){return(e+7)/8|0},M=function(e,t,a){return(null==t||t<0)&&(t=0),(null==a||a>e.length)&&(a=e.length),new r(e.subarray(t,a))},B=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],T=function(e,t,a){var r=Error(t||B[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,T),!a)throw r;return r},R=function(e,t,a,n){var i=e.length,d=n?n.length:0;if(!i||t.f&&!t.l)return a||new r(0);var c=!a,u=c||2!=t.i,g=t.i;c&&(a=new r(3*i));var m=function(e){var t=a.length;if(e>t){var n=new r(Math.max(2*t,e));n.set(a),a=n}},f=t.f||0,F=t.p||0,v=t.b||0,S=t.l,k=t.d,b=t.m,I=t.n,B=8*i;do{if(!S){f=C(e,F,1);var R=C(e,F+1,3);if(F+=3,R)if(1==R)S=P,k=x,b=9,I=5;else if(2==R){var N=C(e,F,31)+257,G=C(e,F+10,15)+4,j=N+C(e,F+5,31)+1;F+=14;for(var A=new r(j),U=new r(19),O=0;O>4;if(q<16)A[O++]=q;else{var $=0,H=0;for(16==q?(H=3+C(e,F,3),F+=2,$=A[O-1]):17==q?(H=3+C(e,F,7),F+=3):18==q&&(H=11+C(e,F,127),F+=7);H--;)A[O++]=$}}var W=A.subarray(0,N),X=A.subarray(N);b=D(W),I=D(X),S=y(W,b,1),k=y(X,I,1)}else T(1);else{var q=w(F)+4,Z=e[q-4]|e[q-3]<<8,Y=q+Z;if(Y>i){g&&T(0);break}u&&m(v+Z),a.set(e.subarray(q,Y),v),t.b=v+=Z,t.p=F=8*Y,t.f=f;continue}if(F>B){g&&T(0);break}}u&&m(v+131072);for(var J=(1<>4;if((F+=15&$)>B){g&&T(0);break}if($||T(2),ee<256)a[v++]=ee;else if(256==ee){Q=F,S=null;break}else{var et=ee-254;if(ee>264){var O=ee-257,ea=o[O];et=C(e,F,(1<>4;er||T(3),F+=15&er;var X=p[en];if(en>3){var ea=s[en];X+=E(e,F)&(1<B){g&&T(0);break}u&&m(v+131072);var ei=v+et;if(v>8},G=function(e,t,a){a<<=7&t;var r=t/8|0;e[r]|=a,e[r+1]|=a>>8,e[r+2]|=a>>16},j=function(e,t){for(var a=[],i=0;ip&&(p=s[i].s);var m=new n(p+1),f=A(a[u-1],m,0);if(f>t){var i=0,F=0,v=f-t,y=1<t)F+=y-(1<>=v;F>0;){var k=s[i].s;m[k]=0&&F;--i){var b=s[i].s;m[b]==t&&(--m[b],++F)}f=t}return{t:new r(m),l:f}},A=function(e,t,a){return -1==e.s?Math.max(A(e.l,t,a+1),A(e.r,t,a+1)):t[e.s]=a},U=function(e){for(var t=e.length;t&&!e[--t];);for(var a=new n(++t),r=0,i=e[0],o=1,s=function(e){a[r++]=e},l=1;l<=t;++l)if(e[l]==i&&l!=t)++o;else{if(!i&&o>2){for(;o>138;o-=138)s(32754);o>2&&(s(o>10?o-11<<5|28690:o-3<<5|12305),o=0)}else if(o>3){for(s(i),--o;o>6;o-=6)s(8304);o>2&&(s(o-3<<5|8208),o=0)}for(;o--;)s(i);o=1,i=e[l]}return{c:a.subarray(0,r),n:t}},O=function(e,t){for(var a=0,r=0;r>8,e[n+2]=255^e[n],e[n+3]=255^e[n+1];for(var i=0;i4&&!$[l[W-1]];--W);var X=g+5<<3,Z=O(i,S)+O(d,k)+c,Y=O(i,x)+O(d,E)+c+14+3*W+O(L,$)+2*L[16]+3*L[17]+7*L[18];if(u>=0&&X<=Z&&X<=Y)return V(t,p,e.subarray(u,u+g));if(N(t,p,1+(Y15&&(N(t,p,ee[_]>>5&127),p+=ee[_]>>12)}}else m=b,f=S,F=I,v=k;for(var _=0;_255){var et=ea>>18&31;G(t,p,m[et+257]),p+=f[et+257],et>7&&(N(t,p,ea>>23&31),p+=o[et]);var er=31&ea;G(t,p,F[er]),p+=v[er],er>3&&(G(t,p,ea>>5&8191),p+=s[er])}else G(t,p,m[ea]),p+=f[ea]}return G(t,p,m[256]),p+f[256]},L=new i([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),_=new r(0),q=function(e,t,a,l,d,c){var h=c.z||e.length,g=new r(l+h+5*(1+Math.ceil(h/7e3))+d),p=g.subarray(l,g.length-d),f=c.l,F=7&(c.r||0);if(t){F&&(p[0]=c.r>>3);for(var v=L[t-1],y=v>>13,S=8191&v,k=(1<7e3||G>24576)&&(q>423||!f)){F=z(e,p,0,C,E,B,R,G,A,N-A,F),G=T=R=0,A=N;for(var $=0;$<286;++$)E[$]=0;for(var $=0;$<30;++$)B[$]=0}var H=2,W=0,X=S,Z=O-_&32767;if(q>2&&U==D(N-Z))for(var Y=Math.min(y,q)-1,J=Math.min(32767,N),K=Math.min(258,q);Z<=J&&--X&&O!=_;){if(e[N+H]==e[N+H-Z]){for(var Q=0;QH){if(H=Q,W=Z,Q>Y)break;for(var ee=Math.min(Z,Q-2),et=0,$=0;$et&&(et=en,_=ea)}}}_=b[O=_],Z+=O-_&32767}if(W){C[G++]=0x10000000|u[H]<<18|m[W];var ei=31&u[H],eo=31&m[W];R+=o[ei]+s[eo],++E[257+ei],++B[eo],j=N+H,++T}else C[G++]=e[N],++E[e[N]]}}for(N=Math.max(N,j);N=h&&(p[F/8|0]=f,es=h),F=V(p,F+1,e.subarray(N,es))}c.i=h}return M(g,0,l+w(F)+d)},$=function(){for(var e=new Int32Array(256),t=0;t<256;++t){for(var a=t,r=9;--r;)a=(1&a&&-0x12477ce0)^a>>>1;e[t]=a}return e}(),H=function(){var e=-1;return{p:function(t){for(var a=e,r=0;r>>8;e=a},d:function(){return~e}}},W=function(){var e=1,t=0;return{p:function(a){for(var r=e,n=t,i=0|a.length,o=0;o!=i;){for(var s=Math.min(o+2655,i);o>16),n=(65535&n)+15*(n>>16)}e=r,t=n},d:function(){return e%=65521,t%=65521,(255&e)<<24|(65280&e)<<8|(255&t)<<8|t>>8}}},X=function(e,t,a,n,i){if(!i&&(i={l:1},t.dictionary)){var o=t.dictionary.subarray(-32768),s=new r(o.length+e.length);s.set(o),s.set(e,o.length),e=s,i.w=o.length}return q(e,null==t.level?6:t.level,null==t.mem?i.l?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(e.length)))):20:12+t.mem,a,n,i)},Z=function(e,t){var a={};for(var r in e)a[r]=e[r];for(var r in t)a[r]=t[r];return a},Y=function(e,t,a){for(var r=e(),n=e.toString(),i=n.slice(n.indexOf("[")+1,n.lastIndexOf("]")).replace(/\s+/g,"").split(","),o=0;o>>0},eh=function(e,t){return ec(e,t)+0x100000000*ec(e,t+4)},eu=function(e,t,a){for(;a;++t)e[t]=a,a>>>=8},eg=function(e,t){var a=t.filename;if(e[0]=31,e[1]=139,e[2]=8,e[8]=t.level<2?4:2*(9==t.level),e[9]=3,0!=t.mtime&&eu(e,4,Math.floor(new Date(t.mtime||Date.now())/1e3)),a){e[3]=8;for(var r=0;r<=a.length;++r)e[r+10]=a.charCodeAt(r)}},ep=function(e){(31!=e[0]||139!=e[1]||8!=e[2])&&T(6,"invalid gzip data");var t=e[3],a=10;4&t&&(a+=(e[10]|e[11]<<8)+2);for(var r=(t>>3&1)+(t>>4&1);r>0;r-=!e[a++]);return a+(2&t)},em=function(e){var t=e.length;return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0},ef=function(e){return 10+(e.filename?e.filename.length+1:0)},eF=function(e,t){var a=t.level;if(e[0]=120,e[1]=(0==a?0:a<6?1:9==a?3:2)<<6|(t.dictionary&&32),e[1]|=31-(e[0]<<8|e[1])%31,t.dictionary){var r=W();r.p(t.dictionary),eu(e,2,r.d())}},ev=function(e,t){return((15&e[0])!=8||e[0]>>4>7||(e[0]<<8|e[1])%31)&&T(6,"invalid zlib data"),(e[1]>>5&1)==+!t&&T(6,"invalid zlib data: "+(32&e[1]?"need":"unexpected")+" dictionary"),(e[1]>>3&4)+2};function ey(e,t){return"function"==typeof e&&(t=e,e={}),this.ondata=t,e}var eS=function(){function e(e,t){if("function"==typeof e&&(t=e,e={}),this.ondata=t,this.o=e||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new r(98304),this.o.dictionary){var a=this.o.dictionary.subarray(-32768);this.b.set(a,32768-a.length),this.s.i=32768-a.length}}return e.prototype.p=function(e,t){this.ondata(X(e,this.o,0,0,this.s),t)},e.prototype.push=function(e,t){this.ondata||T(5),this.s.l&&T(4);var a=e.length+this.s.z;if(a>this.b.length){if(a>2*this.b.length-32768){var n=new r(-32768&a);n.set(this.b.subarray(0,this.s.z)),this.b=n}var i=this.b.length-this.s.z;this.b.set(e.subarray(0,i),this.s.z),this.s.z=this.b.length,this.p(this.b,!1),this.b.set(this.b.subarray(-32768)),this.b.set(e.subarray(i),32768),this.s.z=e.length-i+32768,this.s.i=32766,this.s.w=32768}else this.b.set(e,this.s.z),this.s.z+=e.length;this.s.l=1&t,(this.s.z>this.s.w+8191||t)&&(this.p(this.b,t||!1),this.s.w=this.s.i,this.s.i-=2)},e.prototype.flush=function(){this.ondata||T(5),this.s.l&&T(4),this.p(this.b,!1),this.s.w=this.s.i,this.s.i-=2},e}(),ek=function(e,t){el([et,function(){return[es,eS]}],this,ey.call(this,e,t),function(e){onmessage=es(new eS(e.data))},6,1)};function eb(e,t){return X(e,t||{},0,0)}var eP=function(){function e(e,t){"function"==typeof e&&(t=e,e={}),this.ondata=t;var a=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:a?a.length:0},this.o=new r(32768),this.p=new r(0),a&&this.o.set(a)}return e.prototype.e=function(e){if(this.ondata||T(5),this.d&&T(4),this.p.length){if(e.length){var t=new r(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,a=R(this.p,this.s,this.o);this.ondata(M(a,t,this.s.b),this.d),this.o=M(a,this.s.b-32768),this.s.b=this.o.length,this.p=M(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}(),eI=function(e,t){el([ee,function(){return[es,eP]}],this,ey.call(this,e,t),function(e){onmessage=es(new eP(e.data))},7,0)};function ex(e,t){return R(e,{i:2},t&&t.out,t&&t.dictionary)}(function(){function e(e,t){this.c=H(),this.l=0,this.v=1,eS.call(this,e,t)}e.prototype.push=function(e,t){this.c.p(e),this.l+=e.length,eS.prototype.push.call(this,e,t)},e.prototype.p=function(e,t){var a=X(e,this.o,this.v&&ef(this.o),t&&8,this.s);this.v&&(eg(a,this.o),this.v=0),t&&(eu(a,a.length-8,this.c.d()),eu(a,a.length-4,this.l)),this.ondata(a,t)},e.prototype.flush=function(){eS.prototype.flush.call(this)}})();var eD=function(){function e(e,t){this.v=1,this.r=0,eP.call(this,e,t)}return e.prototype.push=function(e,t){if(eP.prototype.e.call(this,e),this.r+=e.length,this.v){var a=this.p.subarray(this.v-1),n=a.length>3?ep(a):4;if(n>a.length){if(!t)return}else this.v>1&&this.onmember&&this.onmember(this.r-a.length);this.p=a.subarray(n),this.v=0}eP.prototype.c.call(this,t),!this.s.f||this.s.l||t||(this.v=w(this.s.p)+9,this.s={i:0},this.o=new r(0),this.push(new r(0),t))},e}(),eC=function(e,t){var a=this;el([ee,ea,function(){return[es,eP,eD]}],this,ey.call(this,e,t),function(e){var t=new eD(e.data);t.onmember=function(e){return postMessage(e)},onmessage=es(t)},9,0,function(e){return a.onmember&&a.onmember(e)})},eE=(function(){function e(e,t){this.c=W(),this.v=1,eS.call(this,e,t)}e.prototype.push=function(e,t){this.c.p(e),eS.prototype.push.call(this,e,t)},e.prototype.p=function(e,t){var a=X(e,this.o,this.v&&(this.o.dictionary?6:2),t&&4,this.s);this.v&&(eF(a,this.o),this.v=0),t&&eu(a,a.length-4,this.c.d()),this.ondata(a,t)},e.prototype.flush=function(){eS.prototype.flush.call(this)}}(),function(){function e(e,t){eP.call(this,e,t),this.v=e&&e.dictionary?2:1}return e.prototype.push=function(e,t){if(eP.prototype.e.call(this,e),this.v){if(this.p.length<6&&!t)return;this.p=this.p.subarray(ev(this.p,this.v-1)),this.v=0}t&&(this.p.length<4&&T(6,"invalid zlib data"),this.p=this.p.subarray(0,-4)),eP.prototype.c.call(this,t)},e}()),ew=function(e,t){el([ee,er,function(){return[es,eP,eE]}],this,ey.call(this,e,t),function(e){onmessage=es(new eE(e.data))},11,0)},eM=function(){function e(e,t){this.o=ey.call(this,e,t)||{},this.G=eD,this.I=eP,this.Z=eE}return e.prototype.i=function(){var e=this;this.s.ondata=function(t,a){e.ondata(t,a)}},e.prototype.push=function(e,t){if(this.ondata||T(5),this.s)this.s.push(e,t);else{if(this.p&&this.p.length){var a=new r(this.p.length+e.length);a.set(this.p),a.set(e,this.p.length)}else this.p=e;this.p.length>2&&(this.s=31==this.p[0]&&139==this.p[1]&&8==this.p[2]?new this.G(this.o):(15&this.p[0])!=8||this.p[0]>>4>7||(this.p[0]<<8|this.p[1])%31?new this.I(this.o):new this.Z(this.o),this.i(),this.s.push(this.p,t),this.p=null)}},e}();function eB(e,t){eM.call(this,e,t),this.queuedSize=0,this.G=eC,this.I=eI,this.Z=ew}eB.prototype.i=function(){var e=this;this.s.ondata=function(t,a,r){e.ondata(t,a,r)},this.s.ondrain=function(t){e.queuedSize-=t,e.ondrain&&e.ondrain(t)}},eB.prototype.push=function(e,t){this.queuedSize+=e.length,eM.prototype.push.call(this,e,t)};var eT="u">typeof TextEncoder&&new TextEncoder,eR="u">typeof TextDecoder&&new TextDecoder,eN=0;try{eR.decode(_,{stream:!0}),eN=1}catch(e){}var eG=function(e){for(var t="",a=0;;){var r=e[a++],n=(r>127)+(r>223)+(r>239);if(a+n>e.length)return{s:t,r:M(e,a-1)};n?3==n?t+=String.fromCharCode(55296|(r=((15&r)<<18|(63&e[a++])<<12|(63&e[a++])<<6|63&e[a++])-65536)>>10,56320|1023&r):1&n?t+=String.fromCharCode((31&r)<<6|63&e[a++]):t+=String.fromCharCode((15&r)<<12|(63&e[a++])<<6|63&e[a++]):t+=String.fromCharCode(r)}};function ej(e,t){if(t){for(var a=new r(e.length),n=0;n>1)),s=0,l=function(e){o[s++]=e},n=0;no.length){var d=new r(s+8+(i-n<<1));d.set(o),o=d}var c=e.charCodeAt(n);c<128||t?l(c):(c<2048?l(192|c>>6):(c>55295&&c<57344?(l(240|(c=65536+(1047552&c)|1023&e.charCodeAt(++n))>>18),l(128|c>>12&63)):l(224|c>>12),l(128|c>>6&63)),l(128|63&c))}return M(o,0,s)}(function(e){this.ondata=e,eN?this.t=new TextDecoder:this.p=_}).prototype.push=function(e,t){if(this.ondata||T(5),t=!!t,this.t){this.ondata(this.t.decode(e,{stream:!0}),t),t&&(this.t.decode().length&&T(8),this.t=null);return}this.p||T(4);var a=new r(this.p.length+e.length);a.set(this.p),a.set(e,this.p.length);var n=eG(a),i=n.s,o=n.r;t?(o.length&&T(8),this.p=null):this.p=o,this.ondata(i,t)},(function(e){this.ondata=e}).prototype.push=function(e,t){this.ondata||T(5),this.d&&T(4),this.ondata(ej(e),this.d=t||!1)};var eA=function(e){return 1==e?3:e<6?2:+(9==e)},eU=function(e,t){for(;1!=ed(e,t);t+=4+ed(e,t+2));return[eh(e,t+12),eh(e,t+4),eh(e,t+20)]},eO=function(e){var t=0;if(e)for(var a in e){var r=e[a].length;r>65535&&T(9),t+=r+4}return t},eV=function(e,t,a,r,n,i,o,s){var l=r.length,d=a.extra,c=s&&s.length,h=eO(d);eu(e,t,null!=o?0x2014b50:0x4034b50),t+=4,null!=o&&(e[t++]=20,e[t++]=a.os),e[t]=20,t+=2,e[t++]=a.flag<<1|(i<0&&8),e[t++]=n&&8,e[t++]=255&a.compression,e[t++]=a.compression>>8;var u=new Date(null==a.mtime?Date.now():a.mtime),g=u.getFullYear()-1980;if((g<0||g>119)&&T(10),eu(e,t,g<<25|u.getMonth()+1<<21|u.getDate()<<16|u.getHours()<<11|u.getMinutes()<<5|u.getSeconds()>>1),t+=4,-1!=i&&(eu(e,t,a.crc),eu(e,t+4,i<0?-i-2:i),eu(e,t+8,a.size)),eu(e,t+12,l),eu(e,t+14,h),t+=16,null!=o&&(eu(e,t,c),eu(e,t+6,a.attrs),eu(e,t+10,o),t+=14),e.set(r,t),t+=l,h)for(var p in d){var m=d[p],f=m.length;eu(e,t,+p),eu(e,t+2,f),e.set(m,t+4),t+=4+f}return c&&(e.set(s,t),t+=c),t},ez=function(e,t,a,r,n){eu(e,t,0x6054b50),eu(e,t+8,a),eu(e,t+10,a),eu(e,t+12,r),eu(e,t+16,n)},eL=function(){function e(e){this.filename=e,this.c=H(),this.size=0,this.compression=0}return e.prototype.process=function(e,t){this.ondata(null,e,t)},e.prototype.push=function(e,t){this.ondata||T(5),this.c.p(e),this.size+=e.length,t&&(this.crc=this.c.d()),this.process(e,t||!1)},e}();function e_(e,t){var a=this;t||(t={}),eL.call(this,e),this.d=new eS(t,function(e,t){a.ondata(null,e,t)}),this.compression=8,this.flag=eA(t.level)}function eq(e,t){var a=this;t||(t={}),eL.call(this,e),this.d=new ek(t,function(e,t,r){a.ondata(e,t,r)}),this.compression=8,this.flag=eA(t.level),this.terminate=this.d.terminate}function e$(e){this.ondata=e,this.u=[],this.d=1}e_.prototype.process=function(e,t){try{this.d.push(e,t)}catch(e){this.ondata(e,null,t)}},e_.prototype.push=function(e,t){eL.prototype.push.call(this,e,t)},eq.prototype.process=function(e,t){this.d.push(e,t)},eq.prototype.push=function(e,t){eL.prototype.push.call(this,e,t)},e$.prototype.add=function(e){var t=this;if(this.ondata||T(5),2&this.d)this.ondata(T(4+(1&this.d)*8,0,1),null,!1);else{var a=ej(e.filename),n=a.length,i=e.comment,o=i&&ej(i),s=n!=e.filename.length||o&&i.length!=o.length,l=n+eO(e.extra)+30;n>65535&&this.ondata(T(11,0,1),null,!1);var d=new r(l);eV(d,0,e,a,s,-1);var c=[d],h=function(){for(var e=0,a=c;e0){var n=Math.min(this.c,e.length),i=e.subarray(0,n);if(this.c-=n,this.d?this.d.push(i,!this.c):this.k[0].push(i),(e=e.subarray(n)).length)return this.push(e,t)}else{var o=0,s=0,l=void 0,d=void 0;this.p.length?e.length?((d=new r(this.p.length+e.length)).set(this.p),d.set(e,this.p.length)):d=this.p:d=e;for(var c=d.length,h=this.c,u=h&&this.d,g=this;ss+30+i+u){var p,m,f=[];g.k.unshift(f),o=2;var F=ec(d,s+18),v=ec(d,s+22),y=function(e,t){if(t){for(var a="",r=0;r=0&&(S.size=F,S.originalSize=v),g.onfile(S)}return"break"}if(h){if(0x8074b50==e)return l=s+=12+(-2==h&&8),o=3,g.c=0,"break";else if(0x2014b50==e)return l=s-=4,o=3,g.c=0,"break"}}();++s);if(this.p=_,h<0){var p=o?d.subarray(0,l-12-(-2==h&&8)-(0x8074b50==ec(d,l-16)&&4)):d.subarray(0,s);u?u.push(p,!!o):this.k[+(2==o)].push(p)}if(2&o)return this.push(d.subarray(s),t);this.p=d.subarray(s)}t&&(this.c&&T(13),this.p=null)},eZ.prototype.register=function(e){this.o[e.compression]=e},"function"==typeof queueMicrotask&&queueMicrotask;var eY=e.i(48450);let eJ=[0,0,0,0,0,0,0,0,0,329,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2809,68,0,27,0,58,3,62,4,7,0,0,15,65,554,3,394,404,189,117,30,51,27,15,34,32,80,1,142,3,142,39,0,144,125,44,122,275,70,135,61,127,8,12,113,246,122,36,185,1,149,309,335,12,11,14,54,151,0,0,2,0,0,211,0,2090,344,736,993,2872,701,605,646,1552,328,305,1240,735,1533,1713,562,3,1775,1149,1469,979,407,553,59,279,31,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];function eK(e){return e.node?e.node.pop:e.leaf.pop}let eQ=new class{nodes=[];leaves=[];tablesBuilt=!1;buildTables(){if(this.tablesBuilt)return;this.tablesBuilt=!0,this.leaves=[];for(let t=0;t<256;t++){var e;this.leaves.push({pop:eJ[t]+ +((e=t)>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122)+1,symbol:t,numBits:0,code:0})}this.nodes=[{pop:0,index0:0,index1:0}];let t=256,a=[];for(let e=0;e<256;e++)a.push({node:null,leaf:this.leaves[e]});for(;1!==t;){let e=0xfffffffe,r=0xffffffff,n=-1,i=-1;for(let o=0;oi?n:i;a[s]={node:o,leaf:null},l!==t-1&&(a[l]=a[t-1]),t--}this.nodes[0]=a[0].node,this.generateCodes(0,0,0)}determineIndex(e){return null!==e.leaf?-(this.leaves.indexOf(e.leaf)+1):this.nodes.indexOf(e.node)}generateCodes(e,t,a){if(t<0){let r=this.leaves[-(t+1)];r.code=e,r.numBits=a}else{let r=this.nodes[t];this.generateCodes(e,r.index0,a+1),this.generateCodes(e|1<=0)t=e.readFlag()?this.nodes[t].index1:this.nodes[t].index0;else{a.push(this.leaves[-(t+1)].symbol);break}}return String.fromCharCode(...a)}{let t=e.readInt(8);return String.fromCharCode(...e.readBytes(t))}}};class e0{data;bitNum;maxReadBitNum;error;stringBuffer=null;constructor(e,t=0){this.data=e,this.bitNum=t,this.maxReadBitNum=e.length<<3,this.error=!1}getCurPos(){return this.bitNum}setCurPos(e){this.bitNum=e}getBytePosition(){return this.bitNum+7>>3}isError(){return this.error}isFull(){return this.bitNum>this.maxReadBitNum}getRemainingBits(){return this.maxReadBitNum-this.bitNum}getMaxPos(){return this.maxReadBitNum}readFlag(){if(this.bitNum>=this.maxReadBitNum)return this.error=!0,!1;let e=1<<(7&this.bitNum),t=(this.data[this.bitNum>>3]&e)!=0;return this.bitNum++,t}readInt(e){if(0===e)return 0;if(this.bitNum+e>this.maxReadBitNum)return this.error=!0,0;let t=this.bitNum>>3,a=7&this.bitNum;if(this.bitNum+=e,e+a<=32){let r=0,n=e+a+7>>3;for(let e=0;e>>=a,32===e)?r>>>0:r&(1<>3;for(let e=0;e>>0:r&(1<>3,a=new Uint8Array(t),r=this.bitNum>>3,n=7&this.bitNum,i=8-n;if(0===n)a.set(this.data.subarray(r,r+t));else{let e=this.data[r];for(let o=0;o>n|t<this.maxReadBitNum)return this.error=!0,0;let e=this.bitNum>>3,t=7&this.bitNum,a=e0.f32U8;if(0===t)a[0]=this.data[e],a[1]=this.data[e+1],a[2]=this.data[e+2],a[3]=this.data[e+3];else{let r=8-t;for(let n=0;n<4;n++){let i=this.data[e+n],o=e+n+1>t|o<>>0)}getCompressionPoint(){return this.compressionPoint}getDataBlockDataMap(){return this.dataBlockDataMap}getConnectionContext(){let e=this.dataBlockDataMap;return{compressionPoint:this.compressionPoint,ghostTracker:this.ghostTracker,getDataBlockParser:e=>this.registry.getDataBlockParser(e),getDataBlockData:e?t=>e.get(t):void 0,getGhostParser:e=>this.registry.getGhostParser(e)}}_setNextRecvEventSeq(e){this.nextRecvEventSeq=e>>>0}setConnectionProtocolState(e){for(this.lastSeqRecvdAtSend=e.lastSeqRecvdAtSend.slice(0,32);this.lastSeqRecvdAtSend.length<32;)this.lastSeqRecvdAtSend.push(0);this.lastSeqRecvd=e.lastSeqRecvd>>>0,this.highestAckedSeq=e.highestAckedSeq>>>0,this.lastSendSeq=e.lastSendSeq>>>0,this.recvAckMask=e.ackMask>>>0,this.connectSequence=e.connectSequence>>>0,this.lastRecvAckAck=e.lastRecvAckAck>>>0,this._connectionEstablished=e.connectionEstablished}onSendPacketTrigger(){this.lastSendSeq=this.lastSendSeq+1>>>0,this.lastSeqRecvdAtSend[31&this.lastSendSeq]=this.lastSeqRecvd>>>0}applyProtocolHeader(e){if(e.connectSeqBit!==(1&this.connectSequence)||e.ackByteCount>4||e.packetType>2)return{accepted:!1,dispatchData:!1};let t=(e.seqNumber|0xfffffe00&this.lastSeqRecvd)>>>0;if(t>>0),this.lastSeqRecvd+31>>0;if(a>>0),this.lastSendSeq>>0,0===e.packetType&&(this.recvAckMask=(1|this.recvAckMask)>>>0);for(let t=this.highestAckedSeq+1;t<=a;t++)(e.ackMask&1<<(a-t&31))!=0&&(this.lastRecvAckAck=this.lastSeqRecvdAtSend[31&t]>>>0);t-this.lastRecvAckAck>32&&(this.lastRecvAckAck=t-32),this.highestAckedSeq=a;let n=this.lastSeqRecvd!==t&&0===e.packetType;return this.lastSeqRecvd=t,{accepted:!0,dispatchData:n}}parsePacket(e){let t=new e0(e),a=this.readDnetHeader(t),r=this.applyProtocolHeader(a);if(this.packetsParsed++,!r.accepted)return this.protocolRejected++,{dnetHeader:a,rateInfo:{},gameState:this.emptyGameState(),events:[],ghosts:[]};if(!r.dispatchData)return this.protocolNoDispatch++,{dnetHeader:a,rateInfo:{},gameState:this.emptyGameState(),events:[],ghosts:[]};let n=this.readRateInfo(t);t.setStringBuffer(!0);let i=this.readGameState(t),o=void 0===i.controlObjectDataStart||void 0!==i.controlObjectData,s=o?this.readEvents(t):[],l=s[s.length-1],d=!l||l.dataBitsEnd!==l.dataBitsStart,c=o&&d?t.getCurPos():void 0,h=o&&d?this.readGhosts(t,a.seqNumber):[];return t.setStringBuffer(!1),{dnetHeader:a,rateInfo:n,gameState:i,events:s,ghosts:h,ghostSectionStart:c}}readDnetHeader(e){let t=e.readFlag(),a=e.readInt(1),r=e.readInt(9),n=e.readInt(9),i=e.readInt(2),o=e.readInt(3),s=o>0?e.readInt(8*o):0;return{gameFlag:t,connectSeqBit:a,seqNumber:r,highestAck:n,packetType:i,ackByteCount:o,ackMask:s}}readRateInfo(e){let t={};return e.readFlag()&&(t.updateDelay=e.readInt(10),t.packetSize=e.readInt(10)),e.readFlag()&&(t.maxUpdateDelay=e.readInt(10),t.maxPacketSize=e.readInt(10)),t}readGameState(e){let t,a,r,n,i,o,s,l,d,c,h,u,g,p,m,f=e.readInt(32);e.readFlag()&&(e.readFlag()&&(t=e.readFloat(7)),e.readFlag()&&(a=1.5*e.readFloat(7))),e.readFlag()&&(r=e.readFlag(),n=e.readFlag()),e.readFlag()&&((i=e.readFlag())&&(o={x:e.readF32(),y:e.readF32(),z:e.readF32()}),1===(s=e.readRangedU32(0,2))?e.readFlag()&&(l=e.readRangedU32(0,1023)):2===s&&(d={x:e.readF32(),y:e.readF32(),z:e.readF32()}));let F=e.readFlag(),v=e.readFlag();if(e.readFlag())if(e.readFlag()){let m=e.readInt(10);c=m,h=e.getCurPos();let y=e.savePos(),S=this.ghostTracker.getGhost(m),k=S?this.registry.getGhostParser(S.classId):void 0,b=this.controlParserByGhostIndex.get(m),P=this.registry.getGhostParser(25),I=this.registry.getGhostParser(4),x=[],D=new Set,C=e=>{!e?.readPacketData||D.has(e.name)||(D.add(e.name),x.push(e))};C(k),C(b),C(P),C(I);let E=!1;for(let t of x){e.restorePos(y);try{let a=this.getConnectionContext(),r=t.readPacketData(e,a);if(e.getCurPos()-h<=0||e.isError())continue;g=r,u=e.getCurPos(),this.controlParserByGhostIndex.set(m,t),a.compressionPoint!==this.compressionPoint&&(this.compressionPoint=a.compressionPoint,p=this.compressionPoint),this.controlObjectParsed++,E=!0;break}catch{}}if(!E)return e.restorePos(y),u=h,this.controlObjectFailed++,{lastMoveAck:f,damageFlash:t,whiteOut:a,selfLocked:r,selfHomed:n,seekerTracking:i,seekerTrackingPos:o,seekerMode:s,seekerObjectGhostIndex:l,targetPos:d,pinged:F,jammed:v,controlObjectGhostIndex:c,controlObjectDataStart:h,controlObjectDataEnd:u,controlObjectData:g,targetVisibility:[]}}else p={x:e.readF32(),y:e.readF32(),z:e.readF32()},this.compressionPoint=p;let y=[];for(;e.readFlag();)y.push({index:e.readInt(4),mask:e.readInt(32)});return e.readFlag()&&(m=e.readInt(8)),{lastMoveAck:f,damageFlash:t,whiteOut:a,selfLocked:r,selfHomed:n,seekerTracking:i,seekerTrackingPos:o,seekerMode:s,seekerObjectGhostIndex:l,targetPos:d,pinged:F,jammed:v,controlObjectGhostIndex:c,controlObjectDataStart:h,controlObjectDataEnd:u,controlObjectData:g,compressionPoint:p,targetVisibility:y.length>0?y:void 0,cameraFov:m}}readEvents(e){let t=[],a=!0,r=-2;for(;;){let n,i,o,s=e.readFlag();if(a&&!s){if(a=!1,!e.readFlag()){this.dispatchGuaranteedEvents(t);break}}else if(a||s){if(!s)break}else{this.dispatchGuaranteedEvents(t);break}!a&&(r=n=e.readFlag()?r+1&127:e.readInt(7),(i=n|0xffffff80&this.nextRecvEventSeq)0&&this.pendingGuaranteedEvents[0].absoluteSequenceNumber===this.nextRecvEventSeq;){let t=this.pendingGuaranteedEvents.shift();if(!t)break;this.nextRecvEventSeq=this.nextRecvEventSeq+1>>>0,e.push(t.event),t.event.parsedData&&this.applyEventSideEffects(t.event.parsedData)}}applyEventSideEffects(e){let t=e.type;if("GhostingMessageEvent"===t){let t=e.message;"number"==typeof t&&2===t&&this.ghostTracker.clear();return}if("GhostAlwaysObjectEvent"===t){let t=e.ghostIndex,a=e.classId;if("number"==typeof t&&"number"==typeof a){let e=this.registry.getGhostParser(a);this.ghostTracker.createGhost(t,a,e?.name??`unknown_${a}`)}}"SimDataBlockEvent"===t&&this.dataBlockDataMap&&e.dataBlockData&&"number"==typeof e.objectId&&this.dataBlockDataMap.set(e.objectId,e.dataBlockData)}readGhosts(e,t){let a=[];if(!e.readFlag())return a;let r=e.readInt(3)+3;for(;e.readFlag();){let n;if(e.isError())break;let i=e.readInt(r);if(e.isError())break;if(e.readFlag()){this.ghostTracker.deleteGhost(i),this.ghostDeletes++,a.push({index:i,type:"delete",updateBitsStart:e.getCurPos(),updateBitsEnd:e.getCurPos()});continue}let o=!this.ghostTracker.hasGhost(i);n=o?e.readInt(7)+0:this.ghostTracker.getGhost(i)?.classId;let s=e.getCurPos(),l=void 0!==n?this.registry.getGhostParser(n):void 0;if(o&&!l){this.ghostsTrackerDiverged++,e5("DIVERGED pkt=%d seq=%d idx=%d classId=%d bit=%d/%d trackerSize=%d (server sent UPDATE for ghost not in our tracker; 7-bit classId is actually update data)",this.packetsParsed,t,i,n,s,e.getMaxPos(),this.ghostTracker.size()),a.push({index:i,type:"create",classId:n,updateBitsStart:s,updateBitsEnd:s});break}let d=!1;if(l)try{let t=this.getConnectionContext();t.currentGhostIndex=i;let r=l.unpackUpdate(e,o,t),c=e.getCurPos();o&&void 0!==n?(this.ghostTracker.createGhost(i,n,l.name),this.ghostCreatesParsed++):this.ghostUpdatesParsed++,a.push({index:i,type:o?"create":"update",classId:n,updateBitsStart:s,updateBitsEnd:c,parsedData:r}),d=!0}catch(c){this.ghostsFailed++;let r=o?"create":"update",d=c instanceof Error?c.message:String(c);e5("FAIL pkt=%d seq=%d #%d idx=%d op=%s classId=%d parser=%s bit=%d/%d trackerSize=%d err=%s",this.packetsParsed,t,a.length,i,r,n,l.name,s,e.getMaxPos(),this.ghostTracker.size(),d)}if(!d){e5("STOP pkt=%d seq=%d idx=%d op=%s classId=%d parser=%s bit=%d/%d",this.packetsParsed,t,i,o?"create":"update",n,l?.name??"NONE",s,e.getMaxPos()),a.push({index:i,type:o?"create":"update",classId:n,updateBitsStart:s,updateBitsEnd:s});break}}return a}emptyGameState(){return{lastMoveAck:0,pinged:!1,jammed:!1}}}class e6{eventParsers=new Map;ghostParsers=new Map;dataBlockParsers=new Map;eventCatalog=new Map;ghostCatalog=new Map;dataBlockCatalog=new Map;catalogEvent(e){this.eventCatalog.set(e.name,e)}catalogGhost(e){this.ghostCatalog.set(e.name,e)}catalogDataBlock(e){this.dataBlockCatalog.set(e.name,e)}bindDeterministicDataBlocks(e,t){let a=0,r=[];for(let n=0;n0&&(r.sounds=t)}if(e.readFlag()){let t=[];for(let a=0;a<4;a++)e.readFlag()&&t.push({index:a,sequence:e.readInt(5),state:e.readInt(2),forward:e.readFlag(),atEnd:e.readFlag()});t.length>0&&(r.threads=t)}let n=!1;if(e.readFlag()){let a=[];for(let r=0;r<8;r++)if(e.readFlag()){let i={index:r};e.readFlag()?i.dataBlockId=e9(e):i.dataBlockId=0,e.readFlag()&&(e.readFlag()?i.skinTagIndex=e.readInt(10):i.skinName=e.readString(),n=!0),i.triggerDown=e.readFlag(),i.loaded=e.readFlag(),i.ammo=e.readFlag(),i.wet=e.readFlag(),i.target=e.readFlag(),i.fireCount=e.readInt(3),t&&(i.imageExtraFlag=e.readFlag()),a.push(i)}a.length>0&&(r.images=a)}if(e.readFlag()){if(e.readFlag()){r.stateAEnabled=e.readFlag(),r.stateB=e.readFlag();let t=e.readFlag();r.hasInvulnerability=t,t?(r.invulnerabilityVisual=e.readFlag(),r.invulnerabilityTicks=e.readU32()):r.binaryCloak=e.readFlag()}if(e.readFlag())if(e.readFlag()){let t=e.readFlag();r.stateBMode=t,t?r.energyPackOn=!0:r.energyPackOn=!1}else r.shieldNormal=e.readNormalVector(8),r.energyPercent=e.readFloat(5);e.readFlag()&&(r.stateValue1=e.readU32(),r.stateValue2=e.readU32())}return n&&(r.imageSkinDirty=!0),e.readFlag()&&(e.readFlag()?(r.mountObject=e.readInt(10),r.mountNode=e.readInt(5)):r.mountObject=-1),r}function ta(e,t,a){let r=tt(e,t,a);if(e.readFlag()&&(r.impactSound=e.readInt(3)),e.readFlag()&&(r.action=e.readInt(8),r.actionHoldAtEnd=e.readFlag(),r.actionAtEnd=e.readFlag(),r.actionFirstPerson=e.readFlag(),!r.actionAtEnd&&e.readFlag()&&(r.actionAnimPos=e.readSignedFloat(6))),e.readFlag()&&(r.armAction=e.readInt(8)),e.readFlag())return r;if(e.readFlag()){if(r.actionState=e.readInt(3),e.readFlag()&&(r.recoverTicks=e.readInt(7)),r.moveFlag0=e.readFlag(),r.moveFlag1=e.readFlag(),r.position=e.readCompressedPoint(a.compressionPoint),e.readFlag()){let t=e.readInt(13)/32,a=e.readNormalVector(10);r.velocity={x:a.x*t,y:a.y*t,z:a.z*t}}else r.velocity={x:0,y:0,z:0};r.headX=e.readSignedFloat(6),r.headZ=e.readSignedFloat(6),r.rotationZ=2*e.readFloat(7)*Math.PI,r.move=e7(e),r.allowWarp=e.readFlag()}return r.energy=e.readFloat(5),r}function tr(e,t){let a={};if(a.energyLevel=e.readF32(),a.rechargeRate=e.readF32(),a.actionState=e.readInt(3),e.readFlag()&&(a.recoverTicks=e.readInt(7)),e.readFlag()&&(a.jumpDelay=e.readInt(7)),e.readFlag()){let r={x:e.readF32(),y:e.readF32(),z:e.readF32()};a.position=r,t.compressionPoint=r,a.velocity={x:e.readF32(),y:e.readF32(),z:e.readF32()},a.jumpSurfaceLastContact=e.readInt(4)}if(a.headX=e.readF32(),a.headZ=e.readF32(),a.rotationZ=e.readF32(),e.readFlag()){let r=e.readInt(10);a.controlObjectGhost=r;let n=t.ghostTracker.getGhost(r),i=n?t.getGhostParser?.(n.classId):void 0;if(i?.readPacketData){let n=t.currentGhostIndex;t.currentGhostIndex=r,a.controlObjectData=i.readPacketData(e,t),t.currentGhostIndex=n}}return a.disableMove=e.readFlag(),a.pilot=e.readFlag(),a}function tn(e,t,a){let r=tt(e,t,a);return(r.jetting=e.readFlag(),e.readFlag())?r._controlledEarlyReturn=!0:(r.steeringYaw=e.readFloat(9),r.steeringPitch=e.readFloat(9),r.move=e7(e),r.frozen=e.readFlag(),e.readFlag()&&(r.position=e.readCompressedPoint(a.compressionPoint),r.angPosition={x:e.readF32(),y:e.readF32(),z:e.readF32(),w:e.readF32()},r.linMomentum=e.readPoint3F(),r.angMomentum=e.readPoint3F()),e.readFlag()&&(r.energy=e.readFloat(8))),r}function ti(e,t){let a={};a.energyLevel=e.readF32(),a.rechargeRate=e.readF32(),a.steering={x:e.readF32(),y:e.readF32()};let r={x:e.readF32(),y:e.readF32(),z:e.readF32()};return a.linPosition=r,a.angPosition={x:e.readF32(),y:e.readF32(),z:e.readF32(),w:e.readF32()},a.linMomentum=e.readPoint3F(),a.angMomentum=e.readPoint3F(),a.disableMove=e.readFlag(),a.frozen=e.readFlag(),t.compressionPoint=r,a}function to(e,t){let a=ti(e,t);a.braking=e.readFlag();let r=4,n=t.currentGhostIndex;if(void 0!==n){let e=tX.get(n);void 0!==e&&(r=e)}let i=[];for(let t=0;t64)throw Error(`Invalid Sky fogVolumeCount: ${t}`);r.fogVolumeCount=t,r.useSkyTextures=e.readBool(),r.renderBottomTexture=e.readBool(),r.skySolidColor={r:e.readF32(),g:e.readF32(),b:e.readF32()},r.windEffectPrecipitation=e.readBool();let a=[];for(let r=0;r3)throw Error(`Invalid precipitation colorCount: ${t}`);let a=[];for(let r=0;rMath.floor(e.getRemainingBits()/96))throw Error(`Invalid physicalZone point count: ${t}`);let a=[];for(let r=0;rMath.floor(e.getRemainingBits()/128))throw Error(`Invalid physicalZone plane count: ${n}`);let i=[];for(let t=0;tMath.floor(e.getRemainingBits()/128))throw Error(`Invalid physicalZone edge count: ${o}`);let s=[];for(let t=0;t0&&(a.audioData=e.readBitsBuffer(8*r)),a}function ad(e,t){return{type:"GhostingMessageEvent",sequence:e.readU32(),message:e.readInt(3),ghostCount:e.readInt(11)}}function ac(e,t){let a={type:"GhostAlwaysObjectEvent"};a.ghostIndex=e.readInt(10);let r=e.readFlag();if(a._hasObjectData=r,r){let r=e.readInt(7);a.classId=r;let n=t.getGhostParser?.(r);if(!n)throw Error(`No ghost parser for GhostAlwaysObjectEvent classId=${r}`);a.objectData=n.unpackUpdate(e,!0,t)}return a}function ah(e,t){let a={type:"PathManagerEvent"};if(e.readFlag()){a.messageType="NewPaths";let t=e.readU32(),r=[];for(let a=0;a0&&(t.hudImages=a),t}function aE(e){let t={};e.readFlag()&&(t.crc=e.readU32()),t.shapeName=e.readString(),t.mountPoint=e.readU32(),e.readFlag()||(t.offset=e.readAffineTransform()),t.firstPerson=e.readFlag(),t.mass=e.readF32(),t.usesEnergy=e.readFlag(),t.minEnergy=e.readF32(),t.hasFlash=e.readFlag(),t.projectile=ab(e),t.muzzleFlash=ab(e),t.isSeeker=e.readFlag(),t.isSeeker&&(t.seekerRadius=e.readF32(),t.maxSeekAngle=e.readF32(),t.seekerLockTime=e.readF32(),t.seekerFreeTime=e.readF32(),t.isTargetLockRequired=e.readFlag(),t.maxLockRange=e.readF32()),t.cloakable=e.readFlag(),t.lightType=e.readRangedU32(0,3),0!==t.lightType&&(t.lightRadius=e.readF32(),t.lightTime=e.readS32(),t.lightColor={r:e.readFloat(7),g:e.readFloat(7),b:e.readFloat(7),a:e.readFloat(7)}),t.shellExitDir={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.shellExitVariance=e.readF32(),t.shellVelocity=e.readF32(),t.casing=ab(e),t.accuFire=e.readFlag();let a=[];for(let t=0;t<31;t++){if(!e.readFlag())continue;let t={};t.name=e.readString(),t.transitionOnAmmo=e.readInt(5),t.transitionOnNoAmmo=e.readInt(5),t.transitionOnTarget=e.readInt(5),t.transitionOnNoTarget=e.readInt(5),t.transitionOnWet=e.readInt(5),t.transitionOnNotWet=e.readInt(5),t.transitionOnTriggerUp=e.readInt(5),t.transitionOnTriggerDown=e.readInt(5),t.transitionOnTimeout=e.readInt(5),t.transitionGeneric0In=e.readInt(5),t.transitionGeneric0Out=e.readInt(5),e.readFlag()&&(t.timeoutValue=e.readF32()),t.waitForTimeout=e.readFlag(),t.fire=e.readFlag(),t.ejectShell=e.readFlag(),t.scaleAnimation=e.readFlag(),t.direction=e.readFlag(),t.reload=e.readFlag(),e.readFlag()&&(t.energyDrain=e.readF32()),t.loaded=e.readInt(3),t.spin=e.readInt(3),t.recoil=e.readInt(3),e.readFlag()&&(t.sequence=e.readSignedInt(16)),e.readFlag()&&(t.sequenceVis=e.readSignedInt(16)),t.flashSequence=e.readFlag(),t.ignoreLoadedForReady=e.readFlag(),t.emitter=ab(e),null!==t.emitter&&(t.emitterTime=e.readF32(),t.emitterNode=e.readS32()),t.sound=ab(e),a.push(t)}return t.states=a,t}function aw(e){let t=aC(e);t.renderFirstPerson=e.readFlag(),t.minLookAngle=e.readF32(),t.maxLookAngle=e.readF32(),t.maxFreelookAngle=e.readF32(),t.maxTimeScale=e.readF32(),t.maxStepHeight=e.readF32(),t.runForce=e.readF32(),t.runEnergyDrain=e.readF32(),t.minRunEnergy=e.readF32(),t.maxForwardSpeed=e.readF32(),t.maxBackwardSpeed=e.readF32(),t.maxSideSpeed=e.readF32(),t.maxUnderwaterForwardSpeed=e.readF32(),t.maxUnderwaterBackwardSpeed=e.readF32(),t.maxUnderwaterSideSpeedRef=ab(e),e.readFlag()&&(t.runSurfaceAngleRef=e.readInt(11)),t.runSurfaceAngle=e.readF32(),t.recoverDelay=e.readF32(),t.recoverRunForceScale=e.readF32(),t.jumpForce=e.readF32(),t.jumpEnergyDrain=e.readF32(),t.minJumpEnergy=e.readF32(),t.minJumpSpeed=e.readF32(),t.maxJumpSpeed=e.readF32(),t.jumpSurfaceAngle=e.readF32(),t.minJetEnergy=e.readF32(),t.splashVelocity=e.readF32(),t.splashAngle=e.readF32(),t.splashFreqMod=e.readF32(),t.splashVelEpsilon=e.readF32(),t.bubbleEmitTime=e.readF32(),t.medSplashSoundVel=e.readF32(),t.hardSplashSoundVel=e.readF32(),t.exitSplashSoundVel=e.readF32(),t.jumpDelay=e.readInt(7),t.horizMaxSpeed=e.readF32(),t.horizResistSpeed=e.readF32(),t.horizResistFactor=e.readF32(),t.upMaxSpeed=e.readF32(),t.upResistSpeed=e.readF32(),t.upResistFactor=e.readF32(),t.jetEnergyDrain=e.readF32(),t.canJet=e.readF32(),t.maxJetHorizontalPercentage=e.readF32(),t.maxJetForwardSpeed=e.readF32(),t.jetForce=e.readF32(),t.minJetSpeed=e.readF32(),t.maxDamage=e.readF32(),t.minImpactDamageSpeed=e.readF32(),t.impactDamageScale=e.readF32(),t.footSplashHeight=e.readF32();let a=[];for(let t=0;t<32;t++)e.readFlag()?a.push(e.readInt(11)):a.push(null);t.sounds=a,t.boxSize={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.footPuffEmitter=ab(e),t.footPuffNumParts=e.readF32(),t.footPuffRadius=e.readF32(),t.decalData=ab(e),t.decalOffset=e.readF32(),t.dustEmitter=ab(e),t.splash=ab(e);let r=[];for(let t=0;t<3;t++)r.push(ab(e));return t.splashEmitters=r,t.groundImpactMinSpeed=e.readF32(),t.groundImpactShakeFreq={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.groundImpactShakeAmp={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.groundImpactShakeDuration=e.readF32(),t.groundImpactShakeFalloff=e.readF32(),t.boundingRadius=e.readF32(),t.moveBubbleSize=e.readF32(),t}function aM(e){let t=aC(e);t.bodyRestitution=e.readF32(),t.bodyFriction=e.readF32();let a=[];for(let t=0;t<2;t++)a.push(ab(e));t.impactSounds=a,t.minImpactSpeed=e.readF32(),t.softImpactSpeed=e.readF32(),t.hardImpactSpeed=e.readF32(),t.minRollSpeed=e.readF32(),t.maxSteeringAngle=e.readF32(),t.maxDrag=e.readF32(),t.minDrag=e.readF32(),t.cameraOffset=e.readF32(),t.cameraLag=e.readF32(),t.jetForce=e.readF32(),t.jetEnergyDrain=e.readF32(),t.minJetEnergy=e.readF32(),t.integration=e.readF32(),t.collisionTol=e.readF32(),t.massCenter=e.readF32(),t.exitSplashSoundVelocity=e.readF32(),t.softSplashSoundVelocity=e.readF32(),t.mediumSplashSoundVelocity=e.readF32(),t.hardSplashSoundVelocity=e.readF32();let r=[];for(let t=0;t<5;t++)r.push(ab(e));t.waterSounds=r,t.dustEmitter=ab(e);let n=[];for(let t=0;t<3;t++)n.push(ab(e));t.damageEmitters=n;let i=[];for(let t=0;t<2;t++)i.push(ab(e));return t.splashEmitters=i,t.damageEmitterOffset0={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.damageEmitterOffset1={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.damageLevelTolerance0=e.readF32(),t.damageLevelTolerance1=e.readF32(),t.splashFreqMod=e.readF32(),t.splashVelEpsilon=e.readF32(),t.collDamageThresholdVel=e.readF32(),t.collDamageMultiplier=e.readF32(),t}function aB(e){let t=aM(e);t.jetActivateSound=ab(e),t.jetDeactivateSound=ab(e);let a=[];for(let t=0;t<4;t++)a.push(ab(e));return t.jetEmitters=a,t.maneuveringForce=e.readF32(),t.horizontalSurfaceForce=e.readF32(),t.verticalSurfaceForce=e.readF32(),t.autoInputDamping=e.readF32(),t.steeringForce=e.readF32(),t.steeringRollForce=e.readF32(),t.rollForce=e.readF32(),t.autoAngularForce=e.readF32(),t.rotationalDrag=e.readF32(),t.maxAutoSpeed=e.readF32(),t.autoLinearForce=e.readF32(),t.hoverHeight=e.readF32(),t.createHoverHeight=e.readF32(),t.minTrailSpeed=e.readF32(),t.vertThrustMultiple=e.readF32(),t.maxForwardSpeed=e.readF32(),t}function aT(e){let t=aM(e);t.dragForce=e.readF32(),t.mainThrustForce=e.readF32(),t.reverseThrustForce=e.readF32(),t.strafeThrustForce=e.readF32(),t.turboFactor=e.readF32(),t.stabLenMin=e.readF32(),t.stabLenMax=e.readF32(),t.stabSpringConstant=e.readF32(),t.stabDampingConstant=e.readF32(),t.gyroDrag=e.readF32(),t.normalForce=e.readF32(),t.restorativeForce=e.readF32(),t.steeringForce=e.readF32(),t.rollForce=e.readF32(),t.pitchForce=e.readF32(),t.floatingThrustFactor=e.readF32(),t.brakingForce=e.readF32(),t.dustTrailOffset={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.dustTrailFreqMod=e.readF32(),t.triggerTrailHeight=e.readF32(),t.floatSound=ab(e),t.thrustSound=ab(e),t.turboSound=ab(e);let a=[];for(let t=0;t<3;t++)a.push(ab(e));return t.jetEmitters=a,t.dustTrailEmitter=ab(e),t.mainThrustEmitterFactor=e.readF32(),t.strafeThrustEmitterFactor=e.readF32(),t.reverseThrustEmitterFactor=e.readF32(),t}function aR(e){let t=aM(e);return t.tireRadius=e.readF32(),t.tireStaticFriction=e.readF32(),t.tireKineticFriction=e.readF32(),t.tireRestitution=e.readF32(),t.tireLateralForce=e.readF32(),t.tireLateralDamping=e.readF32(),t.tireLateralRelaxation=e.readF32(),t.tireLongitudinalForce=e.readF32(),t.tireLongitudinalDamping=e.readF32(),t.tireEmitter=ab(e),t.jetSound=ab(e),t.engineSound=ab(e),t.squealSound=ab(e),t.wadeSound=ab(e),t.spring=e.readF32(),t.springDamping=e.readF32(),t.springLength=e.readF32(),t.brakeTorque=e.readF32(),t.engineTorque=e.readF32(),t.engineBrake=e.readF32(),t.maxWheelSpeed=e.readF32(),t.steeringAngle=e.readF32(),t.steeringReturn=e.readF32(),t.steeringDamping=e.readF32(),t.powerSteeringFactor=e.readF32(),t}function aN(e){let t=aC(e);return t.noIndividualDamage=e.readFlag(),t.dynamicTypeField=e.readS32(),t}function aG(e){let t=aN(e);return t.thetaMin=e.readF32(),t.thetaMax=e.readF32(),t.thetaNull=e.readF32(),t.neverUpdateControl=e.readFlag(),t.primaryAxis=e.readRangedU32(0,3),t.maxCapacitorEnergy=e.readF32(),t.capacitorRechargeRate=e.readF32(),t}function aj(e){let t=aE(e);return t.activationMS=e.readInt(8),t.deactivateDelayMS=e.readInt(8),t.degPerSecTheta=e.readRangedU32(0,1080),t.degPerSecPhi=e.readRangedU32(0,1080),t.dontFireInsideDamageRadius=e.readFlag(),t.damageRadius=e.readF32(),t.useCapacitor=e.readFlag(),t}function aA(e){let t=aC(e);return t.friction=e.readFloat(10),t.elasticity=e.readFloat(10),t.sticky=e.readFlag(),e.readFlag()&&(t.gravityMod=e.readFloat(10)),e.readFlag()&&(t.maxVelocity=e.readF32()),e.readFlag()&&(t.lightType=e.readInt(2),t.lightColor={r:e.readFloat(7),g:e.readFloat(7),b:e.readFloat(7),a:e.readFloat(7)},t.lightTime=e.readS32(),t.lightRadius=e.readF32(),t.lightOnlyStatic=e.readFlag()),t}function aU(e){let t={};t.projectileShapeName=e.readString(),t.faceViewerLinkTime=e.readS32(),t.lifetime=e.readS32(),t.faceViewer=e.readFlag(),e.readFlag()&&(t.scale={x:e.readF32(),y:e.readF32(),z:e.readF32()}),t.baseEmitter=ab(e),t.delayEmitter=ab(e),t.bubbleEmitter=ab(e),t.explosion=ab(e),t.underwaterExplosion=ab(e),t.splash=ab(e),t.sound=ab(e),t.wetFireSound=ab(e),t.fireSound=ab(e);let a=[];for(let t=0;t<6;t++)a.push(ab(e));return t.decals=a,e.readFlag()&&(t.lightRadius=e.readFloat(8),t.lightColor={r:e.readFloat(7),g:e.readFloat(7),b:e.readFloat(7)}),e.readFlag()&&(t.underwaterLightColor={r:e.readFloat(7),g:e.readFloat(7),b:e.readFloat(7)}),t.explodeOnWaterImpact=ax(e),t.depthTolerance=e.readF32(),t}function aO(e){let t=aU(e);return t.dryVelocity=e.readF32(),t.wetVelocity=e.readF32(),t.fizzleTime=e.readU32(),t.fizzleType=e.readU32(),t.hardRetarget=e.readFlag(),t.inheritedVelocityScale=e.readRangedU32(0,90),t.lifetimeMS=e.readRangedU32(0,90),t.collideWithOwnerTimeMS=e.readU32(),t.proximityRadius=e.readU32(),t.tracerProjectile=e.readFlag(),t}function aV(e){let t=aU(e);return t.armingDelayMS=e.readS32(),t.muzzleVelocity=e.readF32(),t.grenadeElasticity=e.readF32(),t.grenadeFriction=e.readF32(),t.drag=e.readF32(),t.density=e.readF32(),t.gravityMod=e.readF32(),t.lifetimeMS=e.readS32(),t}function az(e){let t=aU(e);return t.lifetimeMS=e.readS32(),t.muzzleVelocity=e.readF32(),t.turningSpeed=e.readF32(),t.proximityRadius=e.readF32(),t.terrainAvoidanceSpeed=e.readF32(),t.terrainScanAhead=e.readF32(),t.terrainHeightFail=e.readF32(),t.terrainAvoidanceRadius=e.readF32(),t.flareDistance=e.readF32(),t.flareAngle=e.readF32(),t.useFlechette=ax(e),t.maxVelocity=e.readF32(),t.acceleration=e.readF32(),t.flechetteDelayMs=e.readS32(),t.exhaustTimeMs=e.readS32(),t.exhaustNodeName=e.readString(),t.casingShapeName=e.readString(),t.casingDebris=ab(e),t.puffEmitter=ab(e),t.exhaustEmitter=ab(e),t}function aL(e){let t=aU(e);t.maxRifleRange=e.readF32(),t.rifleHeadMultiplier=e.readF32(),t.beamColor=aI(e),t.fadeTime=e.readF32(),t.startBeamWidth=e.readF32(),t.endBeamWidth=e.readF32(),t.pulseBeamWidth=e.readF32(),t.beamFlareAngle=e.readF32(),t.minFlareSize=e.readF32(),t.maxFlareSize=e.readF32(),t.pulseSpeed=e.readF32(),t.pulseLength=e.readF32(),t.lightColor=aI(e),t.lightRadius=e.readF32();let a=[];for(let t=0;t<12;t++)a.push(e.readString());return t.textures=a,t}function a_(e){let t=aU(e);t.zapDuration=e.readF32(),t.boltLength=e.readF32(),t.numParts=e.readF32(),t.lightningFreq=e.readF32(),t.lightningDensity=e.readF32(),t.lightningAmp=e.readF32(),t.lightningWidth=e.readF32(),t.shockwave=ab(e);let a=[],r=[],n=[],i=[];for(let t=0;t<2;t++)a.push(e.readF32()),r.push(e.readF32()),n.push(e.readF32()),i.push(e.readF32());t.startWidth=a,t.endWidth=r,t.boltSpeed=n,t.texWrap=i;let o=[];for(let t=0;t<4;t++)o.push(e.readString());return t.textures=o,t.emitter=ab(e),t}function aq(e){let t=aU(e);return t.beamRange=e.readF32(),t.beamDrainRate=e.readF32(),t.muzzleVelocity=e.readF32(),t.proximityRadius=e.readF32(),t.startWidth=e.readF32(),t.endWidth=e.readF32(),t.mainBeamTexture=e.readString(),t.innerBeamTexture=e.readString(),t.flareTexture=e.readString(),t.hitEmitter=ab(e),t}function a$(e){let t=aU(e);return t.beamRange=e.readF32(),t.beamRepairRate=e.readF32(),t.muzzleVelocity=e.readF32(),t.proximityRadius=e.readF32(),t.startWidth=e.readF32(),t.endWidth=e.readF32(),t.startBeamWidth=e.readF32(),t.endBeamWidth=e.readF32(),t.mainBeamTexture=e.readString(),t.innerBeamTexture=e.readString(),t}function aH(e){let t=aU(e);t.maxRifleRange=e.readF32(),t.beamColor=aI(e),t.startBeamWidth=e.readF32(),t.pulseBeamWidth=e.readF32(),t.beamFlareAngle=e.readF32(),t.minFlareSize=e.readF32(),t.maxFlareSize=e.readF32(),t.pulseSpeed=e.readF32(),t.pulseLength=e.readF32();let a=[];for(let t=0;t<4;t++)a.push(e.readString());return t.textures=a,t}function aW(e){let t=aO(e);return t.tracerLength=e.readF32(),t.tracerAlpha=e.readF32(),t.tracerMinPixels=e.readF32(),t.crossViewFraction=ax(e),t.tracerColor=aI(e),t.tracerWidth=e.readF32(),t.muzzleVelocity=e.readF32(),t.proximityRadius=ax(e),t.textureName0=e.readString(),t.textureName1=e.readString(),t}function aX(e){let t=aV(e);return t.energyDrainPerSecond=e.readF32(),t.energyMinDrain=e.readF32(),t.beamWidth=e.readF32(),t.beamRange=e.readF32(),t.numSegments=e.readF32(),t.texRepeat=e.readF32(),t.beamFlareAngle=e.readF32(),t.beamTexture=e.readString(),t.flareTexture=e.readString(),t}function aZ(e){let t=aO(e);return t.numFlares=e.readF32(),t.flareColor=aI(e),t.flareTexture=e.readString(),t.smokeTexture=e.readString(),t.size=e.readF32(),t.flareModTexture=e.readF32(),t.smokeSize=e.readF32(),t}function aY(e){let t=aV(e);return t.smokeDist=e.readF32(),t.noSmoke=e.readF32(),t.boomTime=e.readF32(),t.casingDist=e.readF32(),t.smokeCushion=e.readF32(),t.noSmokeCounter=e.readF32(),t.smokeTexture=e.readString(),t.bombTexture=e.readString(),t}function aJ(e){let t=aV(e);return t.size=e.readF32(),t.useLensFlare=ax(e),t.flareTexture=e.readString(),t.lensFlareTexture=e.readString(),t}function aK(e){let t={};t.dtsFileName=e.readString(),t.soundProfile=ab(e),t.particleEmitter=ab(e),t.particleDensity=e.readInt(14),t.particleRadius=e.readF32(),t.faceViewer=e.readFlag(),e.readFlag()&&(t.explosionScale={x:e.readInt(16),y:e.readInt(16),z:e.readInt(16)}),t.playSpeed=e.readInt(14),t.debrisThetaMin=e.readRangedU32(0,180),t.debrisThetaMax=e.readRangedU32(0,180),t.debrisPhiMin=e.readRangedU32(0,360),t.debrisPhiMax=e.readRangedU32(0,360),t.debrisMinVelocity=e.readRangedU32(0,1e3),t.debrisMaxVelocity=e.readRangedU32(0,1e3),t.debrisNum=e.readInt(14),t.debrisVariance=e.readRangedU32(0,1e4),t.delayMS=e.readInt(16),t.delayVariance=e.readInt(16),t.lifetimeMS=e.readInt(16),t.lifetimeVariance=e.readInt(16),t.offset=e.readF32(),t.shakeCamera=e.readFlag(),t.hasLight=e.readFlag(),t.camShakeFreq={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.camShakeAmp={x:e.readF32(),y:e.readF32(),z:e.readF32()},t.camShakeDuration=e.readF32(),t.camShakeRadius=e.readF32(),t.camShakeFalloff=e.readF32(),t.shockwave=ab(e),t.debris=ab(e);let a=[];for(let t=0;t<4;t++)a.push(ab(e));t.emitters=a;let r=[];for(let t=0;t<5;t++)r.push(ab(e));t.subExplosions=r;let n=e.readRangedU32(0,4),i=[];for(let t=0;t0&&ry("DataBlock binding: %d/%d bound, missing parsers: %s",t,e2.length,a.join(", "));const{bound:r,missing:n}=this.registry.bindDeterministicGhosts(e3,0);n.length>0&&ry("Ghost binding: %d/%d bound, missing parsers: %s",r,e3.length,n.join(", "));const{bound:i,missing:o}=this.registry.bindDeterministicEvents(e1,255);o.length>0&&ry("Event binding: %d/%d bound, missing parsers: %s",i,e1.length,o.join(", ")),this.packetParser=new e8(this.registry,this.ghostTracker)}getRegistry(){return this.registry}getGhostTracker(){return this.ghostTracker}getPacketParser(){return this.packetParser}get loaded(){return this._loaded}get header(){if(!this._loaded)throw Error("must call load() first");return this._header}get initialBlock(){if(!this._loaded)throw Error("must call load() first");return this._initialBlock}get blockCount(){if(!this._loaded)throw Error("must call load() first");if(void 0===this._blockCount){let e=this._decompressedData,t=this._decompressedView,a=0,r=0;for(;r+2<=e.length;){let n=4095&t.getUint16(r,!0);if((r+=2+n)>e.length)break;a++}this._blockCount=a}return this._blockCount}get blockCursor(){if(!this._loaded)throw Error("must call load() first");return this._blockCursor}async load(){if(this._loaded)return{header:this._header,initialBlock:this._initialBlock};let e=this.readHeader();ry('header: "%s" version=0x%s length=%dms (%smin) initialBlockSize=%d',e.identString,e.protocolVersion.toString(16),e.demoLengthMs,(e.demoLengthMs/1e3/60).toFixed(1),e.initialBlockSize);let t=this.buffer.subarray(this.offset,this.offset+e.initialBlockSize),a=this.readInitialBlock(t);this.offset+=e.initialBlockSize;let r=this.buffer.subarray(this.offset);ry("compressed block stream: %d bytes",r.length);let n=await new Promise((e,t)=>{var a,n;a=(a,r)=>{a?t(a):e(r)},n||(n=a,a={}),"function"!=typeof n&&T(7),eo(r,a,[ee],function(e){return en(ex(e.data[0],ei(e.data[1])))},1,n)});return ry("decompressed block stream: %d bytes",n.length),this._decompressedData=n,this._decompressedView=new DataView(n.buffer,n.byteOffset,n.byteLength),this.setupPacketParser(a),this._header=e,this._initialBlock=a,this._blockStreamOffset=0,this._blockCursor=0,this._loaded=!0,{header:e,initialBlock:a}}nextBlock(){if(!this._loaded)throw Error("must call load() first");let e=this._decompressedData,t=this._decompressedView,a=this._blockStreamOffset;if(a+2>e.length)return;let r=t.getUint16(a,!0),n=r>>12,i=4095&r;if(a+2+i>e.length)return void rk("block %d: size %d would exceed decompressed data (offset=%d remaining=%d), stopping",this._blockCursor,i,a+2,e.length-a-2);let o=e.subarray(a+2,a+2+i);this._blockStreamOffset=a+2+i;let s={index:this._blockCursor,type:n,size:i,data:o};if(this._blockCursor++,0===n)try{s.parsed=this.packetParser.parsePacket(o)}catch{}else if(1===n)this.packetParser.onSendPacketTrigger();else if(2===n&&64===i)try{s.parsed=this.readRawMove(o)}catch{}else if(3===n&&8===i)try{s.parsed=this.readInfoBlock(o)}catch{}return s}reset(){if(!this._loaded)throw Error("must call load() first");this._blockStreamOffset=0,this._blockCursor=0,this._blockCount=void 0,this.setupPacketParser(this._initialBlock)}processBlocks(e){if(!this._loaded)throw Error("must call load() first");let t=0;for(let a=0;a=128&&t<128+e2.length?e2[t-128]:`unknown(${t})`;throw Error(`No parser for DataBlock classId ${t} (${e}) at bit ${i}`)}}ry("all %d/%d DataBlocks parsed (%d payloads), bit position after DataBlocks: %d",l,i,s.size,r.getCurPos());let d=0!==r.readU8(),c=[];for(let e=0;e<6;e++)c.push(r.readU32());let h=[];for(let e=0;e<16;e++)h.push(r.readU32());let u=r.readU32(),g=[];for(let e=0;e>3<<3),this.readSimpleTargetManager(r),this.readSimpleTargetManager(r),rS('after sequential tail bit=%d mission="%s" CRC=0x%s',r.getCurPos(),M,B.toString(16))}catch(e){a=e instanceof Error?e.message:String(e)}finally{this.ghostTracker=I}let T=b-r.getCurPos(),R=M.length>0?M.split("").filter(e=>{let t=e.charCodeAt(0);return t>=32&&t<=126}).length/M.length:1,N=M.length>0&&R>=.8&&void 0===a;return ry('initial block: events=%d ghosts=%d ghostingSeq=%d controlObj=%d mission="%s" CRC=0x%s valid=%s%s',x.length,E.length,C,w,M,B.toString(16),N,a?` error=${a}`:""),{taggedStrings:n,dataBlockHeaders:o,dataBlockCount:l,dataBlocks:s,firstPerson:d,connectionFields:c,stateArray:h,scoreEntries:g,demoValues:p,sensorGroupColors:m,targetEntries:f,connectionState:F,roundTripTime:v,packetLoss:y,pathManager:S,notifyCount:k,nextRecvEventSeq:D,ghostingSequence:C,initialGhosts:E,initialEvents:x,controlObjectGhostIndex:w,controlObjectData:t,missionName:M,missionCRC:B,phase2TrailingBits:T,phase2Valid:N,phase2Error:a}}readScoreEntry(e){let t=e.readFlag()?e.readInt(16):0,a=e.readFlag()?e.readInt(16):0,r=e.readFlag()?e.readInt(16):0,n=e.readInt(6),i=e.readInt(6),o=e.readInt(6),s=e.readFlag(),l=[];for(let t=0;t<6;t++)l.push(e.readFlag());return{clientId:t,teamId:a,score:r,field0:n,field1:i,field2:o,isBot:s,triggerFlags:l}}readDemoValues(e){let t=[];for(;e.readFlag();)t.push(e.readString());return t}readComplexTargetManager(e){e.readU8(),e.readU8(),e.readU8(),e.readU8();let t=[];for(let a=0;a<32;a++)for(let r=0;r<32;r++)e.readFlag()&&t.push({group:a,targetGroup:r,r:e.readU8(),g:e.readU8(),b:e.readU8(),a:e.readU8()});let a=[];for(let t=0;t<512;t++){if(!e.readFlag())continue;let r={targetId:t,sensorGroup:0,targetData:0,damageLevel:0};e.readFlag()&&(r.sensorData=e.readU32()),e.readFlag()&&(r.voiceMapData=e.readU32()),e.readFlag()&&(r.name=e.readString()),e.readFlag()&&(r.skin=e.readString()),e.readFlag()&&(r.skinPref=e.readString()),e.readFlag()&&(r.voice=e.readString()),e.readFlag()&&(r.typeDescription=e.readString()),r.sensorGroup=e.readInt(5),r.targetData=e.readInt(9),t>=32&&e.readFlag()&&(r.dataBlockRef=e.readInt(11)),r.damageLevel=e.readFloat(7),a.push(r)}return{sensorGroupColors:t,targets:a}}readPathManager(e){let t=[],a=e.readU32();for(let r=0;rthis.registry.getDataBlockParser(e)};t=i.unpack(e,a)}catch{a.push({classId:r,guaranteed:!0,dataBitsStart:n,dataBitsEnd:n});break}else{a.push({classId:r,guaranteed:!0,dataBitsStart:n,dataBitsEnd:n});break}a.push({classId:r,guaranteed:!0,dataBitsStart:n,dataBitsEnd:e.getCurPos(),parsedData:t}),rS(" event classId=%d bits=%d",r,e.getCurPos()-n)}return{nextRecvEventSeq:t,events:a}}readGhostStartBlock(e,t){let a=e.readU32(),r=[];rS("ghost block: seq=%d bit=%d",a,e.getCurPos());let n=this.registry.getGhostCatalog(),i=8*e.getBuffer().length,o=new Map;for(let[e,a]of t)o.set(e,a.data);for(;e.readFlag()&&!e.isError();){let a=e.readInt(10),s=e.readInt(7)+0,l=e.getCurPos(),d=[],c=new Set,{entry:h}=this.identifyGhostViaDataBlock(e,t,n),u=this.registry.getGhostParser(s);u&&(d.push({entry:u,method:"registry"}),c.add(u)),h&&!c.has(h)&&(d.push({entry:h,method:"datablock"}),c.add(h));let g={getDataBlockData:e=>o.get(e),getDataBlockParser:e=>this.registry.getDataBlockParser(e)},p=!1;for(let{entry:t,method:n}of d){let o="registry"===n,d=this.tryGhostParser(e,t,l,i,!1,g,o);if(!1!==d){this.ghostTracker.createGhost(a,s,t.name),rS(" ghost idx=%d classId=%d parser=%s bits=%d via=%s",a,s,t.name,e.getCurPos()-l,n),r.push({index:a,type:"create",classId:s,updateBitsStart:l,updateBitsEnd:e.getCurPos(),parsedData:d}),p=!0;break}}if(!p){rS(" ghost idx=%d classId=%d NO PARSER (stopping at bit=%d, remaining=%d)",a,s,l,i-l);break}}return rS("ghost loop ended at bit=%d remaining=%d count=%d",e.getCurPos(),i-e.getCurPos(),r.length),{ghostingSequence:a,ghosts:r}}tryGhostParser(e,t,a,r,n=!1,i,o=!1){let s=e.savePos();n||rS(" try %s: startBit=%d",t.name,a);try{let l=t.unpackUpdate(e,!0,{compressionPoint:{x:0,y:0,z:0},ghostTracker:this.ghostTracker,...i}),d=e.getCurPos()-a,c=r-e.getCurPos();if(e.isError()||!o&&d<3)return n||rS(" reject %s: bits=%d isError=%s",t.name,d,e.isError()),e.restorePos(s),!1;if(c>1e3){let a=e.getCurPos(),r=e.readFlag();if(e.setCurPos(a),!r)return n||rS(" reject %s: bits=%d misaligned (remaining=%d)",t.name,d,c),e.restorePos(s),!1}return l??{}}catch(a){return n||rS(" reject %s: error at bit=%d: %s",t.name,e.getCurPos(),a instanceof Error?a.message:String(a)),e.restorePos(s),!1}}identifyGhostViaDataBlock(e,t,a){let r;if(!t)return{entry:void 0,dbFlag:!1};let n=e.savePos(),i=!1;try{if(i=e.readFlag()){let n=e.readInt(11),i=t.get(n);if(i){let e=i.className.replace(/Data$/,"");(r=a.get(e))||rS(" identifyGhostViaDataBlock: dbId=%d className=%s ghostName=%s (no ghost parser)",n,i.className,e)}else rS(" identifyGhostViaDataBlock: dbId=%d (no DataBlock found)",n)}else rS(" identifyGhostViaDataBlock: DataBlock flag=0")}catch{}return e.restorePos(n),{entry:r,dbFlag:i}}readRawMove(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),a=t.getInt32(0,!0),r=t.getInt32(4,!0),n=t.getInt32(8,!0),i=t.getUint32(12,!0),o=t.getUint32(16,!0),s=t.getUint32(20,!0),l=t.getFloat32(24,!0),d=t.getFloat32(28,!0),c=t.getFloat32(32,!0),h=t.getFloat32(36,!0),u=t.getFloat32(40,!0),g=t.getFloat32(44,!0),p=t.getUint32(48,!0),m=t.getUint32(52,!0),f=0!==e[56],F=[];for(let t=0;t<6;t++)F.push(0!==e[57+t]);return{px:a,py:r,pz:n,pyaw:i,ppitch:o,proll:s,x:l,y:d,z:c,yaw:h,pitch:u,roll:g,id:p,sendCount:m,freeLook:f,trigger:F}}readInfoBlock(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength);return{value1:t.getUint32(0,!0),value2:t.getFloat32(4,!0)}}}function rP(){let e=new e6,t=new e4;ak(e),t2(e),rv(e),e.bindDeterministicDataBlocks(e2,128),e.bindDeterministicGhosts(e3,0),e.bindDeterministicEvents(e1,255);let a=new e8(e,t,{dataBlockDataMap:new Map});return{registry:e,ghostTracker:t,packetParser:a}}e.s(["DemoParser",()=>rb],88787),e.s(["createLiveParser",()=>rP],94802),e.s([],91891);var rI=e.i(90072);let rx=new Set(["FlyingVehicle","HoverVehicle","WheeledVehicle"]),rD=new Set(["BombProjectile","EnergyProjectile","FlareProjectile","GrenadeProjectile","LinearFlareProjectile","LinearProjectile","Projectile","SeekerProjectile","TracerProjectile"]),rC=new Set(["LinearProjectile","TracerProjectile","LinearFlareProjectile","Projectile"]),rE=new Set(["GrenadeProjectile","EnergyProjectile","FlareProjectile","BombProjectile"]),rw=new Set(["SeekerProjectile"]),rM=new Set(["StaticShape","ScopeAlwaysShape","Turret","BeaconObject","ForceFieldBare"]);function rB(e){return"Player"===e?"Player":rx.has(e)?"Vehicle":"Item"===e?"Item":rD.has(e)?"Projectile":rM.has(e)?"Deployable":"Ghost"}function rT(e,t){return`${e}_${t}`}let rR=Object.freeze({r:0,g:255,b:0}),rN=Object.freeze({r:255,g:0,b:0});e.s(["IFF_GREEN",0,rR,"IFF_RED",0,rN,"TICK_DURATION_MS",0,32,"ballisticProjectileClassNames",0,rE,"linearProjectileClassNames",0,rC,"projectileClassNames",0,rD,"seekerProjectileClassNames",0,rw,"toEntityId",()=>rT,"toEntityType",()=>rB],25311);let rG=new rI.Matrix4,rj=new rI.Quaternion;function rA(e,t,a){return ea?a:e}let rU=.494*Math.PI;function rO(e,t){let a=Math.sin(t),r=Math.cos(t),n=Math.sin(e),i=Math.cos(e);return rG.set(-n,i*a,-i*r,0,0,r,a,0,i,n*a,-n*r,0,0,0,0,1),rj.setFromRotationMatrix(rG),[rj.x,rj.y,rj.z,rj.w]}function rV(e){let t=-e/2;return[0,Math.sin(t),0,Math.cos(t)]}function rz(e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.z)||!Number.isFinite(e.w))return null;let t=-e.y,a=-e.z,r=-e.x,n=e.w,i=t*t+a*a+r*r+n*n;if(i<=1e-12)return null;let o=1/Math.sqrt(i);return[t*o,a*o,r*o,n*o]}function rL(e){return Math.atan2(2*(e.w*e.z+e.x*e.y),e.w*e.w+e.x*e.x-e.y*e.y-e.z*e.z)}function r_(e){return Math.asin(Math.max(-1,Math.min(1,2*(e.w*e.x-e.y*e.z))))}function rq(e){return null!=e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z)}function r$(e){return!!e&&"object"==typeof e&&"number"==typeof e.x&&"number"==typeof e.y&&"number"==typeof e.z}function rH(e){return!!e&&"object"==typeof e&&"number"==typeof e.x&&"number"==typeof e.y&&"number"==typeof e.z&&"number"==typeof e.w}function rW(e,t){let a;if(t)return"string"==typeof(a=rD.has(e)||e.endsWith("ProjectileData")?t.projectileShapeName:"DebrisData"===e?t.shapeFileName:t.shapeName)&&a.length>0?a:void 0}function rX(e,t){if(e)for(let a of t){let t=e[a];if("number"==typeof t&&Number.isFinite(t))return t}}function rZ(e,t){if(e)for(let a of t){let t=e[a];if("string"==typeof t&&t.length>0)return t}}function rY(e,t){if(!t)return;let a=rZ(t,["tracerTex0","textureName0","texture0"])??"";if(!("TracerProjectile"===e||a.length>0&&null!=rX(t,["tracerLength"]))||!a)return;let r=rZ(t,["tracerTex1","textureName1","texture1"]),n=rX(t,["tracerLength"])??10,i=rX(t,["tracerWidth"]),o=rX(t,["tracerAlpha"]),s=null!=i&&(null!=rX(t,["crossViewAng"])||i<=.7)?i:o??i??.5,l=rX(t,["crossViewAng","crossViewFraction"])??("number"==typeof t.tracerWidth&&t.tracerWidth>.7?t.tracerWidth:.98);return{kind:"tracer",texture:a,crossTexture:r,tracerLength:n,tracerWidth:s,crossViewAng:l,crossSize:rX(t,["crossSize","muzzleVelocity"])??.45,renderCross:function(e,t){if(e)for(let a of t){let t=e[a];if("boolean"==typeof t)return t}}(t,["renderCross","proximityRadius"])??!0}}function rJ(e,t){if(t){if("LinearFlareProjectile"===e){let e=rZ(t,["smokeTexture","flareTexture"]);if(!e)return;let a=t.flareColor,r=rX(t,["size"])??.5;return{kind:"sprite",texture:e,color:a?{r:a.r,g:a.g,b:a.b}:{r:1,g:1,b:1},size:r}}if("FlareProjectile"===e){let e=rZ(t,["flareTexture"]);if(!e)return;return{kind:"sprite",texture:e,color:{r:1,g:.9,b:.5},size:rX(t,["size"])??4}}}}function rK(e){let t=e.states;if(Array.isArray(t)&&0!==t.length)return t.map(e=>{let t=e=>null==e?-1:e-1;return{name:e.name??"",transitionOnNotLoaded:t(e.transitionOnAmmo),transitionOnLoaded:t(e.transitionOnNoAmmo),transitionOnNoAmmo:t(e.transitionOnTarget),transitionOnAmmo:t(e.transitionOnNoTarget),transitionOnNoTarget:t(e.transitionOnWet),transitionOnTarget:t(e.transitionOnNotWet),transitionOnNotWet:t(e.transitionOnTriggerUp),transitionOnWet:t(e.transitionOnTriggerDown),transitionOnTriggerUp:t(e.transitionOnTimeout),transitionOnTriggerDown:t(e.transitionGeneric0In),transitionOnTimeout:t(e.transitionGeneric0Out),timeoutValue:e.timeoutValue,waitForTimeout:e.waitForTimeout??!1,fire:e.fire??!1,sequence:e.sequence,spin:e.spin??0,direction:e.direction??!0,scaleAnimation:e.scaleAnimation??!1,loaded:e.loaded??0,soundDataBlockId:e.sound??-1}})}function rQ(e){let t="";for(let a=0;a=32&&(t+=e[a]);return t}let r0={2:0,3:1,4:2,5:3,6:4,7:5,8:6,11:7,12:8,14:9};function r2(e){for(let t=0;t=32)break}}function r3(e){let t=[],a=0,r="",n=!1;for(let i=0;i=32&&(r+=e[i]);continue}let s=r0[o];void 0!==s?(r&&(t.push({text:r,colorCode:a}),r=""),a=s):15===o?(r&&(t.push({text:r,colorCode:a}),r=""),a=0):o>=32&&(r+=e[i])}return r&&t.push({text:r,colorCode:a}),t}function r1(e){let t=e.indexOf("~w");return -1===t?{text:e,wavPath:null}:{text:e.substring(0,t),wavPath:e.substring(t+2)}}function r5(e){return e?"number"==typeof e.cameraMode?"camera":"number"==typeof e.rotationZ?"player":null:null}let r8=new Map([["gui/hud_new_packammo",0],["gui/hud_new_packcloak",1],["gui/hud_new_packenergy",2],["gui/hud_new_packrepair",3],["gui/hud_new_packsatchel",4],["gui/hud_new_packshield",5],["gui/hud_new_packinventory",6],["gui/hud_new_packmotionsens",7],["gui/hud_new_packradar",8],["gui/hud_new_packturretout",9],["gui/hud_new_packturretin",10],["gui/hud_new_packsensjam",11],["gui/hud_new_packturret",12],["gui/hud_satchel_unarmed",18]]);function r6(e){let t=e.toLowerCase();for(let[e,a]of r8)if(e===t)return a;return -1}e.s(["CameraMode_OrbitObject",0,3,"MAX_PITCH",0,rU,"backpackBitmapToIndex",()=>r6,"clamp",()=>rA,"detectColorCode",()=>r2,"detectControlObjectType",()=>r5,"extractWavTag",()=>r1,"getNumberField",()=>rX,"isQuatLike",()=>rH,"isValidPosition",()=>rq,"isVec3Like",()=>r$,"parseColorSegments",()=>r3,"parseWeaponImageStates",()=>rK,"playerYawToQuaternion",()=>rV,"resolveShapeName",()=>rW,"resolveSpriteVisual",()=>rJ,"resolveTracerVisual",()=>rY,"stripTaggedStringMarkup",()=>rQ,"torqueQuatHeading",()=>rL,"torqueQuatPitch",()=>r_,"torqueQuatToThreeJS",()=>rz,"yawPitchToQuaternion",()=>rO],89119),e.i(70847);var r4=e.i(47566),r7=e.i(8328);class r9{registry;ghostTracker;entities=new Map;entityIdByGhostIndex=new Map;tickCount=0;camera=null;chatMessages=[];chatMessageIdCounter=0;audioEvents=[];netStrings=new Map;targetNames=new Map;targetTeams=new Map;targetRenderFlags=new Map;pendingNameTags=new Map;sensorGroupColors=new Map;playerSensorGroup=0;lastStatus={health:1,energy:1};latestControl={ghostIndex:-1};controlPlayerGhostId;lastControlType="camera";isPiloting=!1;lastPilotGhostIndex;lastVehicleHeading=0;lastVehiclePitch=0;lastVehicleOrbitDir;lastVehicleVelocity;lastVehiclePosTime=0;lastVehiclePos;firstPerson=!0;lastCameraMode;lastOrbitGhostIndex;lastOrbitDistance;latestFov=90;weaponsHud={slots:new Map,activeIndex:-1};backpackHud={packIndex:-1,active:!1,text:""};inventoryHud={slots:new Map,activeSlot:-1};teamScores=[];playerRoster=new Map;nextExplosionId=0;resolveGhostClassName(e,t){if("number"==typeof t){let e=this.registry.getGhostParser(t)?.name;if(e)return e}let a=this.entityIdByGhostIndex.get(e);if(a){let e=this.entities.get(a);if(e?.className)return e.className}let r=this.ghostTracker.getGhost(e);if(r?.className)return r.className}resolveEntityIdForGhostIndex(e){let t=this.entityIdByGhostIndex.get(e);if(t)return t;let a=this.ghostTracker.getGhost(e);if(a)return rT(a.className,e)}resetSharedState(){this.entities.clear(),this.entityIdByGhostIndex.clear(),this.tickCount=0,this.camera=null,this.chatMessages=[],this.chatMessageIdCounter=0,this.audioEvents=[],this.netStrings.clear(),this.targetNames.clear(),this.targetTeams.clear(),this.targetRenderFlags.clear(),this.sensorGroupColors.clear(),this.playerSensorGroup=0,this.lastStatus={health:1,energy:1},this.latestControl={ghostIndex:-1},this.controlPlayerGhostId=void 0,this.lastControlType="camera",this.isPiloting=!1,this.lastPilotGhostIndex=void 0,this.lastVehicleHeading=0,this.lastVehiclePitch=0,this.lastVehicleOrbitDir=void 0,this.lastVehicleVelocity=void 0,this.lastVehiclePosTime=0,this.lastVehiclePos=void 0,this.firstPerson=!0,this.lastCameraMode=void 0,this.lastOrbitGhostIndex=void 0,this.lastOrbitDistance=void 0,this.latestFov=90,this.weaponsHud={slots:new Map,activeIndex:-1},this.backpackHud={packIndex:-1,active:!1,text:""},this.inventoryHud={slots:new Map,activeSlot:-1},this.teamScores=[],this.playerRoster.clear(),this.nextExplosionId=0}resolveNetString(e){if(e.length>=2&&1===e.charCodeAt(0)){let t=parseInt(e.slice(1),10);if(Number.isFinite(t))return this.netStrings.get(t)??e}return e}formatRemoteArgs(e,t){let a=this.resolveNetString(e);for(let e=0;e0&&(this.playerSensorGroup=t.sensorGroup)}if(t){let e=r5(t);if(e&&(this.lastControlType=e),"player"===this.lastControlType)this.isPiloting=!!(t.pilot||null!=t.controlObjectGhost),this.isPiloting&&"number"==typeof t.controlObjectGhost?this.lastPilotGhostIndex=t.controlObjectGhost:this.isPiloting||(this.lastPilotGhostIndex=void 0,this.lastVehicleHeading=0,this.lastVehiclePitch=0,this.lastVehicleOrbitDir=void 0,this.lastVehicleVelocity=void 0,this.lastVehiclePosTime=0,this.lastVehiclePos=void 0);else if(this.isPiloting=!1,"number"==typeof t.cameraMode)if(this.lastCameraMode=t.cameraMode,3===t.cameraMode){"number"==typeof t.orbitObjectGhostIndex&&(this.lastOrbitGhostIndex=t.orbitObjectGhostIndex);let e=t.minOrbitDist,a=t.maxOrbitDist,r=t.curOrbitDist;"number"==typeof e&&"number"==typeof a&&Number.isFinite(e)&&Number.isFinite(a)?this.lastOrbitDistance=Math.max(0,a-e):"number"==typeof r&&Number.isFinite(r)&&(this.lastOrbitDistance=Math.max(0,r))}else this.lastOrbitGhostIndex=void 0,this.lastOrbitDistance=void 0}void 0!==e.cameraFov&&(this.latestFov=e.cameraFov)}processEvent(e,t){let a=e.parsedData;if(!a)return;let r=a.type;if("GhostAlwaysObjectEvent"===r){let e=a.ghostIndex,t=a.classId,r=a.objectData;null!=e&&null!=t&&this.processGhostUpdate({index:e,type:"create",classId:t,parsedData:r});return}if("NetStringEvent"===r||"NetStringEvent"===t){let e=a.id,t=a.value;if(null!=e&&"string"==typeof t){this.netStrings.set(e,t);let a=this.pendingNameTags.get(e);if(null!=a){this.pendingNameTags.delete(e);let r=rQ(t);for(let e of(this.targetNames.set(a,r),this.entities.values()))e.targetId===a&&(e.playerName=r)}}return}if("TargetInfoEvent"===r||"TargetInfoEvent"===t){let e=a.targetId,t=a.nameTag;if(null!=e&&null!=t){let a=this.netStrings.get(t);a?this.targetNames.set(e,rQ(a)):this.pendingNameTags.set(t,e)}let r=a.sensorGroup;null!=e&&null!=r&&this.targetTeams.set(e,r);let n=a.renderFlags;if(null!=e&&null!=n&&this.targetRenderFlags.set(e,n),null!=e){let t=this.targetNames.get(e),a=this.targetTeams.get(e),r=this.targetRenderFlags.get(e);for(let n of this.entities.values())n.targetId===e&&(t&&(n.playerName=t),null!=a&&(n.sensorGroup=a),null!=r&&(n.targetRenderFlags=r))}return}if("SetSensorGroupEvent"===r||"SetSensorGroupEvent"===t){let e=a.sensorGroup;null!=e&&(this.playerSensorGroup=e);return}if("SensorGroupColorEvent"===r||"SensorGroupColorEvent"===t){let e=a.sensorGroup,t=a.colors;if(t){let a=this.sensorGroupColors.get(e);for(let r of(a||(a=new Map,this.sensorGroupColors.set(e,a)),t))r.default?a.delete(r.index):a.set(r.index,{r:r.r??0,g:r.g??0,b:r.b??0})}return}if("RemoteCommandEvent"===r||"RemoteCommandEvent"===t){let e=this.resolveNetString(a.funcName),t=a.args,r=this.getTimeSec();if("ChatMessage"===e&&t.length>=4){let e=r2(this.resolveNetString(t[3])),a=t[4]?rQ(this.resolveNetString(t[4])):"",n=this.formatRemoteArgs(t[3],t.slice(4));if(n){let i,o,s=n.indexOf(": "),{text:l,wavPath:d}=r1(s>=0?n.slice(s+2):n);if(d){let e=this.resolveNetString(t[1]);i=e?`voice/${e}/${d}.wav`:d;let a=this.resolveNetString(t[2]);if(a){let e=parseFloat(a);Number.isFinite(e)&&(o=Math.max(.5,Math.min(2,e)))}}let c=e??0;this.pushChatMessage({timeSec:r,sender:a,text:l,kind:"chat",colorCode:c,segments:[{text:a?`${a}: ${l}`:l,colorCode:c}],soundPath:i,soundPitch:o})}}else if("CannedChatMessage"===e&&t.length>=6){let e=r2(this.resolveNetString(t[1])),a=rQ(this.resolveNetString(t[2])),n=rQ(this.resolveNetString(t[4])),i=this.formatRemoteArgs(t[1],t.slice(2));if(i){let o,s,{wavPath:l}=r1(i),d=r1(rQ(this.resolveNetString(t[3]))).text;if(l){let e=this.resolveNetString(t[5]);if(o=e?`voice/${e}/${l}.wav`:l,t[6]){let e=parseFloat(this.resolveNetString(t[6]));Number.isFinite(e)&&(s=Math.max(.5,Math.min(2,e)))}}let c=e??0,h=[];n&&h.push({text:`[${n}] `,colorCode:0}),h.push({text:a?`${a}: ${d}`:d,colorCode:c}),this.pushChatMessage({timeSec:r,sender:a,text:d,kind:"chat",colorCode:c,segments:h,soundPath:o,soundPitch:s})}}else if("ServerMessage"===e&&t.length>=2){this.handleServerMessage(t);let e=r2(this.resolveNetString(t[1])),a=this.formatRemoteArgs(t[1],t.slice(2));if(a){let{text:t,wavPath:n}=r1(a),i=e??0;this.pushChatMessage({timeSec:r,sender:"",text:t,kind:"server",colorCode:i,segments:[{text:t,colorCode:i}],soundPath:n??void 0})}}else this.handleHudRemoteCommand(e,t);return}if("Sim3DAudioEvent"===r||"Sim2DAudioEvent"===r||"Sim3DAudioEvent"===t||"Sim2DAudioEvent"===t){let e=a.profileId;if("number"==typeof e){let n=this.getTimeSec(),i="Sim3DAudioEvent"===r||"Sim3DAudioEvent"===t?a.position:void 0;this.audioEvents.push({profileId:e,position:i,timeSec:n}),this.audioEvents.length>100&&this.audioEvents.splice(0,this.audioEvents.length-100)}}}processGhostUpdate(e){let t,a=e.index,r=this.entityIdByGhostIndex.get(a);if(r){let t=this.entities.get(r);t&&"Projectile"===t.type&&!t.hasExploded&&null!=t.explosionDataBlockId&&t.position&&("delete"===e.type||"create"===e.type)&&this.spawnExplosion(t,[...t.position])}if("delete"===e.type){r&&(this.removeSoundSlotEntities(r),this.entities.delete(r),this.entityIdByGhostIndex.delete(a));return}let n=this.resolveGhostClassName(a,e.classId);if(!n){if("create"===e.type)throw Error(`No ghost parser for classId ${e.classId} (ghost index ${a})`);return}let i=rT(n,a);r&&r!==i&&(this.removeSoundSlotEntities(r),this.entities.delete(r));let o=this.entities.get(i);if(o&&"create"===e.type?(this.removeSoundSlotEntities(i),o.spawnTick=this.tickCount,this.resetEntity(o),t=o):o?t=o:(t={id:i,ghostIndex:a,className:n,spawnTick:this.tickCount,type:rB(n),rotation:[0,0,0,1]},this.entities.set(i,t)),t.ghostIndex=a,t.className=n,t.type=rB(n),this.entityIdByGhostIndex.set(a,i),this.applyGhostData(t,e.parsedData),"create"===e.type&&e.parsedData){let r=(0,r4.ghostToSceneObject)(n,a,e.parsedData);r&&(t.sceneData=r)}}resetEntity(e){e.rotation=[0,0,0,1],e.hasExploded=void 0,e.explosionShape=void 0,e.explosionLifetimeTicks=void 0,e.faceViewer=void 0,e.simulatedVelocity=void 0,e.projectilePhysics=void 0,e.gravityMod=void 0,e.direction=void 0,e.velocity=void 0,e.position=void 0,e.dataBlock=void 0,e.dataBlockId=void 0,e.shapeHint=void 0,e.visual=void 0,e.targetId=void 0,e.targetRenderFlags=void 0,e.carryingFlag=void 0,e.sensorGroup=void 0,e.playerName=void 0,e.weaponShape=void 0,e.packShape=void 0,e.falling=void 0,e.jetting=void 0,e.weaponImageState=void 0,e.weaponImageStates=void 0,e.weaponImageStatesDbId=void 0,e.itemPhysics=void 0,e.threads=void 0,e.headPitch=void 0,e.headYaw=void 0,e.health=void 0,e.energy=void 0,e.maxEnergy=void 0,e.damageState=void 0,e.actionAnim=void 0,e.actionAtEnd=void 0,e.explosionDataBlockId=void 0,e.maintainEmitterId=void 0}applyGhostData(e,t){if(!t)return;let a=t.dataBlockId;if(null!=a){e.dataBlockId=a;let t=this.getDataBlockData(a),r=rW(e.className,t);if(e.visual=rY(e.className,t)??rJ(e.className,t),"string"==typeof r&&(e.shapeHint=r,e.dataBlock=r),"Player"===e.type&&"number"==typeof t?.maxEnergy&&(e.maxEnergy=t.maxEnergy),"Projectile"===e.type&&(rC.has(e.className)?e.projectilePhysics="linear":rE.has(e.className)?(e.projectilePhysics="ballistic",e.gravityMod=rX(t,["gravityMod"])??1):rw.has(e.className)&&(e.projectilePhysics="seeker")),"Projectile"===e.type&&null==e.explosionDataBlockId){let t=this.resolveExplosionInfo(a);t&&(e.explosionShape=t.shape,e.faceViewer=t.faceViewer,e.explosionLifetimeTicks=t.lifetimeTicks,e.explosionDataBlockId=t.explosionDataBlockId)}if("Projectile"===e.type&&null==e.maintainEmitterId){let a=t?.baseEmitter;"number"==typeof a&&a>0&&(e.maintainEmitterId=a)}}if("Player"===e.type){let a=t.images;if(Array.isArray(a)&&a.length>0){let t=a.find(e=>0===e.index);if(t?.dataBlockId&&t.dataBlockId>0){let a=this.getDataBlockData(t.dataBlockId),r=rW("ShapeBaseImageData",a);if(r){let t=a?.mountPoint;(null==t||t<=0)&&!/pack_/i.test(r)&&(e.weaponShape=r)}let n=e.weaponImageState;e.weaponImageState={dataBlockId:t.dataBlockId,triggerDown:t.triggerDown??n?.triggerDown??!1,ammo:t.ammo??n?.ammo??!0,loaded:t.loaded??n?.loaded??!0,target:t.target??n?.target??!1,wet:t.wet??n?.wet??!1,fireCount:t.fireCount??n?.fireCount??0},a&&e.weaponImageStatesDbId!==t.dataBlockId&&(e.weaponImageStates=rK(a),e.weaponImageStatesDbId=t.dataBlockId)}else t&&!t.dataBlockId&&(e.weaponShape=void 0,e.weaponImageState=void 0,e.weaponImageStates=void 0);let r=a.find(e=>2===e.index);if(r?.dataBlockId&&r.dataBlockId>0){let t=rW("ShapeBaseImageData",this.getDataBlockData(r.dataBlockId));t&&(e.packShape=t)}else r&&!r.dataBlockId&&(e.packShape=void 0);let n=a.find(e=>3===e.index);if(n){let t=!!n.dataBlockId&&n.dataBlockId>0;if(e.carryingFlag=t,null!=e.targetId&&e.targetId>=0){let a=this.targetRenderFlags.get(e.targetId)??0,r=t?2|a:-3&a;r!==a&&(this.targetRenderFlags.set(e.targetId,r),e.targetRenderFlags=r)}}}}let r=rq(t.position)?t.position:rq(t.initialPosition)?t.initialPosition:rq(t.explodePosition)?t.explodePosition:rq(t.endPoint)?t.endPoint:rq(t.transform?.position)?t.transform.position:void 0;r&&(e.position=[r.x,r.y,r.z],this.updateSoundSlotPositions(e));let n=r$(t.direction)?t.direction:void 0;if(n&&(e.direction=[n.x,n.y,n.z]),"Player"===e.type&&"number"==typeof t.rotationZ&&(e.rotation=rV(t.rotationZ)),"Player"===e.type&&("number"==typeof t.headX&&(e.headPitch=t.headX),"number"==typeof t.headZ&&(e.headYaw=t.headZ)),rH(t.angPosition)){let a=rz(t.angPosition);a&&(e.rotation=a)}else if(rH(t.transform?.rotation)){let a=rz(t.transform.rotation);a&&(e.rotation=a)}else if("Item"===e.type&&"number"==typeof t.rotation?.angle){let a=t.rotation;e.rotation=rV((a.zSign??1)*a.angle)}else if("Projectile"===e.type){let a=t.velocity??t.direction??(rq(t.initialPosition)&&rq(t.endPos)?{x:t.endPos.x-t.initialPosition.x,y:t.endPos.y-t.initialPosition.y,z:t.endPos.z-t.initialPosition.z}:void 0);r$(a)&&(0!==a.x||0!==a.y)&&(e.rotation=rV(Math.atan2(a.x,a.y)))}if(r$(t.velocity)&&(e.velocity=[t.velocity.x,t.velocity.y,t.velocity.z],e.direction||(e.direction=[t.velocity.x,t.velocity.y,t.velocity.z])),"boolean"==typeof t.moveFlag0&&(e.falling=t.moveFlag0),"boolean"==typeof t.moveFlag1&&(e.jetting=t.moveFlag1),"Item"===e.type){let a=t.atRest;if(!1===a&&r$(t.velocity)){let a=null!=e.dataBlockId?this.getDataBlockData(e.dataBlockId):void 0;e.itemPhysics={velocity:[t.velocity.x,t.velocity.y,t.velocity.z],atRest:!1,elasticity:rX(a,["elasticity"])??.2,friction:rX(a,["friction"])??.6,gravityMod:rX(a,["gravityMod"])??1}}else!0===a&&(e.itemPhysics=void 0)}if(e.projectilePhysics){if("linear"===e.projectilePhysics){let a=rX(null!=e.dataBlockId?this.getDataBlockData(e.dataBlockId):void 0,["dryVelocity","muzzleVelocity","bulletVelocity"])??80,r=e.direction??[0,1,0],n=r[0]*a,i=r[1]*a,o=r[2]*a,s=t.excessVel,l=t.excessDir;"number"==typeof s&&s>0&&r$(l)&&(n+=l.x*s,i+=l.y*s,o+=l.z*s),e.simulatedVelocity=[n,i,o]}else r$(t.velocity)&&(e.simulatedVelocity=[t.velocity.x,t.velocity.y,t.velocity.z]);let a=t.currTick;if("number"==typeof a&&a>0&&e.simulatedVelocity&&e.position){let t=.032*a,r=e.simulatedVelocity;if(e.position[0]+=r[0]*t,e.position[1]+=r[1]*t,e.position[2]+=r[2]*t,"ballistic"===e.projectilePhysics){let a=-9.81*(e.gravityMod??1);e.position[2]+=.5*a*t*t,r[2]+=a*t}}}let i=rq(t.explodePosition)?t.explodePosition:rq(t.explodePoint)?t.explodePoint:void 0;if("Projectile"===e.type&&!e.hasExploded&&i&&null!=e.explosionDataBlockId&&this.spawnExplosion(e,[i.x,i.y,i.z]),"number"==typeof t.damageLevel&&(e.health=rA(1-t.damageLevel,0,1)),"number"==typeof t.damageState&&(e.damageState=t.damageState),"number"==typeof t.action&&(e.actionAnim=t.action,e.actionAtEnd=!!t.actionAtEnd),Array.isArray(t.threads)){let a=t.threads;if(e.threads){let t=[...e.threads];for(let e of a){let a=t.findIndex(t=>t.index===e.index);a>=0?t[a]=e:t.push(e)}e.threads=t}else e.threads=a}if("number"==typeof t.energy&&(e.energy=rA(t.energy,0,1)),"number"==typeof t.targetId){e.targetId=t.targetId;let a=this.targetNames.get(t.targetId);a&&(e.playerName=a);let r=this.targetTeams.get(t.targetId);null!=r&&(e.sensorGroup=r,e.ghostIndex===this.latestControl.ghostIndex&&"player"===this.lastControlType&&(this.playerSensorGroup=r));let n=this.targetRenderFlags.get(t.targetId);null!=n&&(e.targetRenderFlags=n)}let o=t.sounds;Array.isArray(o)&&this.syncSoundSlotEntities(e,o),"WayPoint"===e.className&&"string"==typeof t.name&&(e.label=t.name),"AudioEmitter"===e.className&&("string"==typeof t.filename&&(e.audioFileName=t.filename),"number"==typeof t.volume&&(e.audioVolume=t.volume),"boolean"==typeof t.is3D&&(e.audioIs3D=t.is3D),"boolean"==typeof t.isLooping&&(e.audioIsLooping=t.isLooping),"number"==typeof t.minDistance&&(e.audioMinDistance=t.minDistance),"number"==typeof t.maxDistance&&(e.audioMaxDistance=t.maxDistance),"number"==typeof t.minLoopGap&&(e.audioMinLoopGap=t.minLoopGap),"number"==typeof t.maxLoopGap&&(e.audioMaxLoopGap=t.maxLoopGap))}syncSoundSlotEntities(e,t){for(let a of t){let t=`${e.id}:sound:${a.index}`;if(a.playing&&"number"==typeof a.profileId){let r=this.getDataBlockData(a.profileId),n=r?.filename;if(!n)continue;let i=n.endsWith(".wav")?n:`${n}.wav`,o=r.description,s=null!=o?this.getDataBlockData(o):void 0,l=this.entities.get(t);l?l.position=e.position:this.entities.set(t,{id:t,ghostIndex:e.ghostIndex,className:"AudioEmitter",type:"AudioEmitter",spawnTick:this.tickCount,position:e.position,rotation:[0,0,0,1],audioFileName:i,audioVolume:s?.volume??1,audioIs3D:s?.is3D??!0,audioIsLooping:s?.isLooping??!1,audioMinDistance:s?.referenceDistance??20,audioMaxDistance:s?.maxDistance??100,audioMinLoopGap:s?.minLoopGap??0,audioMaxLoopGap:s?.maxLoopGap??0})}else this.entities.delete(t)}}updateSoundSlotPositions(e){for(let t=0;t<4;t++){let a=this.entities.get(`${e.id}:sound:${t}`);a&&(a.position=e.position)}}removeSoundSlotEntities(e){for(let t=0;t<4;t++)this.entities.delete(`${e}:sound:${t}`)}resolveExplosionInfo(e){let t=this.getDataBlockData(e);if(!t)return;let a=t.explosion;if(null==a)return;let r=this.getDataBlockData(a);if(!r)return;let n=r.dtsFileName||void 0,i=r.lifetimeMS??31;return{shape:n,faceViewer:!1!==r.faceViewer&&0!==r.faceViewer,lifetimeTicks:i,explosionDataBlockId:a}}spawnExplosion(e,t){e.hasExploded=!0;let a=e.explosionLifetimeTicks??31,r=`fx_${this.nextExplosionId++}`,n={id:r,ghostIndex:-1,className:"Explosion",spawnTick:this.tickCount,type:"Explosion",dataBlock:e.explosionShape,explosionDataBlockId:e.explosionDataBlockId,position:t,rotation:[0,0,0,1],isExplosion:!0,faceViewer:!1!==e.faceViewer,expiryTick:this.tickCount+a};if(this.entities.set(r,n),null!=e.explosionDataBlockId){let a=this.getDataBlockData(e.explosionDataBlockId),r=a?.subExplosions;if(Array.isArray(r))for(let e of r){if(null==e)continue;let a=this.getDataBlockData(e);if(!a)continue;let r=a.dtsFileName||void 0;if(!r)continue;let n=a.lifetimeMS??31,i=a.offset??0,o=Math.random()*Math.PI*2,s=[t[0]+Math.cos(o)*i,t[1]+Math.sin(o)*i,t[2]],l=`fx_${this.nextExplosionId++}`,d={id:l,ghostIndex:-1,className:"Explosion",spawnTick:this.tickCount,type:"Explosion",dataBlock:r,explosionDataBlockId:e,position:s,rotation:[0,0,0,1],isExplosion:!0,faceViewer:!1!==a.faceViewer&&0!==a.faceViewer,expiryTick:this.tickCount+n};this.entities.set(l,d)}}e.position=void 0,e.simulatedVelocity=void 0}advanceProjectiles(){for(let e of this.entities.values()){if(!e.simulatedVelocity||!e.position)continue;let t=e.simulatedVelocity,a=e.position;"ballistic"===e.projectilePhysics&&(t[2]+=-9.81*(e.gravityMod??1)*.032),a[0]+=.032*t[0],a[1]+=.032*t[1],a[2]+=.032*t[2],(0!==t[0]||0!==t[1])&&(e.rotation=rV(Math.atan2(t[0],t[1])))}}advanceItems(){for(let e of this.entities.values()){let t=e.itemPhysics;if(!t||t.atRest||!e.position)continue;let a=t.velocity,r=e.position;a[2]+=-20*t.gravityMod*.032,r[0]+=.032*a[0],r[1]+=.032*a[1],r[2]+=.032*a[2];let n=(0,r7.getTerrainHeightAt)(r[0],r[1]);if(null!=n&&r[2]0){let e=Math.max(0,1-i/o);a[0]*=e,a[1]*=e}.15>Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])&&(a[0]=a[1]=a[2]=0,t.atRest=!0)}}}removeExpiredExplosions(){for(let[e,t]of this.entities)t.isExplosion&&null!=t.expiryTick&&this.tickCount>=t.expiryTick&&this.entities.delete(e)}updateCameraAndHud(){let e=this.latestControl,t=this.getTimeSec(),a=e.data,r=this.lastControlType;if(this.removeExpiredExplosions(),e.position){let{yaw:n,pitch:i}=this.getCameraYawPitch(a);if(this.isPiloting){if(a){let e=a.controlObjectData,t=e?.angPosition;if(t&&"number"==typeof t.w){this.lastVehicleHeading=rL(t),this.lastVehiclePitch=r_(t);let e=rz(t);if(e){let[t,a,r,n]=e;this.lastVehicleOrbitDir=[-(1-2*(a*a+r*r)),-(2*(t*a+r*n)),-(2*(t*r-a*n))]}}}n=this.lastVehicleHeading,i=this.lastVehiclePitch}if(this.camera={time:t,position:[e.position.x,e.position.y,e.position.z],rotation:rO(n,rA(i,-rU,rU)),fov:this.latestFov,mode:"observer",yaw:n,pitch:i},"camera"===r)if(("number"==typeof a?.cameraMode?a.cameraMode:this.lastCameraMode)===3){this.camera.mode="third-person","number"==typeof this.lastOrbitDistance&&(this.camera.orbitDistance=this.lastOrbitDistance);let e="number"==typeof a?.orbitObjectGhostIndex?a.orbitObjectGhostIndex:this.lastOrbitGhostIndex;"number"==typeof e&&e>=0&&(this.camera.orbitTargetId=this.resolveEntityIdForGhostIndex(e))}else this.camera.mode="observer";else e.ghostIndex>=0&&(this.controlPlayerGhostId=this.resolveEntityIdForGhostIndex(e.ghostIndex)),this.firstPerson?this.camera.mode="first-person":(this.camera.mode="third-person",this.isPiloting&&null!=this.lastPilotGhostIndex?(this.camera.orbitTargetId=this.resolveEntityIdForGhostIndex(this.lastPilotGhostIndex),this.camera.orbitDistance=15,this.lastVehicleOrbitDir&&(this.camera.orbitDirection=this.lastVehicleOrbitDir)):(this.camera.orbitTargetId=this.controlPlayerGhostId,this.camera.orbitDistance=3)),this.controlPlayerGhostId&&(this.camera.controlEntityId=this.controlPlayerGhostId);if("player"===r&&e.position){if(this.isPiloting&&null!=this.lastPilotGhostIndex){let r=this.resolveEntityIdForGhostIndex(this.lastPilotGhostIndex),n=r?this.entities.get(r):void 0;if(n){let r=a?.controlObjectData;if(r){n.position=[e.position.x,e.position.y,e.position.z],this.lastVehiclePos=n.position.slice(),this.lastVehiclePosTime=t;let a=r.linMomentum;if(a&&rq(a)){let e=n.dataBlockId,t=null!=e?this.getDataBlockData(e):void 0,r=t?.mass??200,i=r>0?1/r:.005;this.lastVehicleVelocity=[a.x*i,a.y*i,a.z*i],n.velocity=this.lastVehicleVelocity}let i=r.angPosition;if(i&&"number"==typeof i.w){let e=rz(i);e&&(n.rotation=e)}}else if(this.lastVehiclePos&&this.lastVehicleVelocity&&this.lastVehiclePosTime>0){let e=t-this.lastVehiclePosTime;if(e>0&&e<1){let[t,a,r]=this.lastVehicleVelocity;n.position=[this.lastVehiclePos[0]+t*e,this.lastVehiclePos[1]+a*e,this.lastVehiclePos[2]+r*e]}}}}else if(this.controlPlayerGhostId){let t=this.entities.get(this.controlPlayerGhostId);if(t){t.position=[e.position.x,e.position.y,e.position.z],t.rotation=rV(n),t.headPitch=this.getControlPlayerHeadPitch(i);let r=a?.velocity;r$(r)&&(t.velocity=[r.x,r.y,r.z],t.falling=r.z<-10)}}}}else this.camera&&(this.camera={...this.camera,time:t,fov:this.latestFov});let n={health:1,energy:1};if(this.camera?.mode==="first-person"){let e=this.controlPlayerGhostId,t=e?this.entities.get(e):void 0;n.health=t?.health??1;let r=a?.energyLevel;if("number"==typeof r){let e=t?.maxEnergy??60;e>0&&(n.energy=rA(r/e,0,1))}else n.energy=t?.energy??1}else if(this.camera?.mode==="third-person"&&this.camera.orbitTargetId){let e=this.entities.get(this.camera.orbitTargetId);n.health=e?.health??1,n.energy=e?.energy??1}this.lastStatus=n}getControlPlayerHeadPitch(e){return rA(e/rU,-1,1)}getAbsoluteRotation(e){return e?"number"==typeof e.rotationZ&&"number"==typeof e.headX?{yaw:e.rotationZ,pitch:e.headX}:"number"==typeof e.rotZ&&"number"==typeof e.rotX?{yaw:e.rotZ,pitch:e.rotX}:null:null}resolveIffColor(e){if(0===this.playerSensorGroup)return;let t=this.sensorGroupColors.get(this.playerSensorGroup);if(t){let a=t.get(e);if(a)return a}return e===this.playerSensorGroup?rR:0!==e?rN:void 0}pushChatMessage(e){this.chatMessages.push({...e,id:++this.chatMessageIdCounter}),this.chatMessages.length>200&&this.chatMessages.splice(0,this.chatMessages.length-200)}handleServerMessage(e){if(e.length<2)return;let t=this.resolveNetString(e[0]);if("MsgTeamScoreIs"===t&&e.length>=4){let t=parseInt(this.resolveNetString(e[2]),10),a=parseInt(this.resolveNetString(e[3]),10);if(!isNaN(t)&&!isNaN(a)){let e=this.teamScores.find(e=>e.teamId===t);e&&(e.score=a,this.onTeamScoresChanged())}}else if("MsgCTFAddTeam"===t&&e.length>=6){let t=parseInt(this.resolveNetString(e[2]),10),a=rQ(this.resolveNetString(e[3])),r=parseInt(this.resolveNetString(e[5]),10);if(!isNaN(t)){let e=t+1,n=this.teamScores.find(t=>t.teamId===e);n?(n.name=a,n.score=isNaN(r)?n.score:r):this.teamScores.push({teamId:e,name:a,score:isNaN(r)?0:r,playerCount:0}),this.onTeamScoresChanged()}}else if("MsgClientJoin"===t&&e.length>=4){let t=parseInt(this.resolveNetString(e[2]),10),a=rQ(this.resolveNetString(e[3]));if(!isNaN(t)){let e=this.playerRoster.get(t);this.playerRoster.set(t,{name:a,teamId:e?.teamId??0}),this.onRosterChanged()}}else if("MsgClientDrop"===t&&e.length>=3){let t=parseInt(this.resolveNetString(e[2]),10);isNaN(t)||(this.playerRoster.delete(t),this.onRosterChanged())}else if("MsgClientJoinTeam"===t&&e.length>=4){let t=parseInt(this.resolveNetString(e[2]),10),a=parseInt(this.resolveNetString(e[3]),10);if(!isNaN(t)&&!isNaN(a)){let e=this.playerRoster.get(t);e?e.teamId=a:this.playerRoster.set(t,{name:"",teamId:a}),this.onRosterChanged()}}}onTeamScoresChanged(){}onRosterChanged(){}handleHudRemoteCommand(e,t){if("setWeaponsHudItem"===e&&t.length>=3){let e=parseInt(t[0],10),a=parseInt(t[1],10),r="1"===t[2]||"true"===t[2];isNaN(e)||(r?this.weaponsHud.slots.set(e,isNaN(a)?-1:a):this.weaponsHud.slots.delete(e),this.onWeaponsHudChanged())}else if("setWeaponsHudAmmo"===e&&t.length>=2){let e=parseInt(t[0],10),a=parseInt(t[1],10);isNaN(e)||(this.weaponsHud.slots.set(e,isNaN(a)?-1:a),this.onWeaponsHudChanged())}else if("setWeaponsHudActive"===e&&t.length>=1){let e=parseInt(t[0],10);this.weaponsHud.activeIndex=isNaN(e)?-1:e,isNaN(e)||!(e>=0)||this.weaponsHud.slots.has(e)||this.weaponsHud.slots.set(e,-1),this.onWeaponsHudChanged()}else if("setWeaponsHudClearAll"===e)this.weaponsHud.slots.clear(),this.weaponsHud.activeIndex=-1,this.onWeaponsHudChanged();else if("setBackpackHudItem"===e&&t.length>=2){let e=parseInt(t[0],10);"1"!==t[1]&&"true"!==t[1]||isNaN(e)?this.backpackHud.packIndex=-1:this.backpackHud.packIndex=e,this.backpackHud.active=!1,this.backpackHud.text=""}else if("setSatchelArmed"===e)this.backpackHud.active=!0;else if("setCloakIconOn"===e||"setRepairPackIconOn"===e||"setShieldIconOn"===e||"setSenJamIconOn"===e)this.backpackHud.active=!0;else if("setCloakIconOff"===e||"setRepairPackIconOff"===e||"setShieldIconOff"===e||"setSenJamIconOff"===e)this.backpackHud.active=!1;else if("updatePackText"===e&&t.length>=1)this.backpackHud.text=t[0]??"";else if("setInventoryHudItem"===e&&t.length>=3){let e=parseInt(t[0],10),a=parseInt(t[1],10),r="1"===t[2]||"true"===t[2];isNaN(e)||(r&&!isNaN(a)?this.inventoryHud.slots.set(e,a):this.inventoryHud.slots.delete(e),this.onInventoryHudChanged())}else if("setInventoryHudAmount"===e&&t.length>=2){let e=parseInt(t[0],10),a=parseInt(t[1],10);isNaN(e)||isNaN(a)||(this.inventoryHud.slots.set(e,a),this.onInventoryHudChanged())}else"setInventoryHudClearAll"===e&&(this.inventoryHud.slots.clear(),this.inventoryHud.activeSlot=-1,this.onInventoryHudChanged())}onWeaponsHudChanged(){}onInventoryHudChanged(){}buildEntityList(e){let t=[];for(let a of this.entities.values()){if(e&&!e(a))continue;let r=null!=a.targetId&&a.targetId>=0?this.targetRenderFlags.get(a.targetId)??a.targetRenderFlags:a.targetRenderFlags;"Player"!==a.type||a.carryingFlag||(r=null!=r?-3&r:r),t.push({id:a.id,type:a.type,visual:a.visual,direction:a.direction,ghostIndex:a.ghostIndex,className:a.className,dataBlockId:a.dataBlockId,shapeHint:a.shapeHint,dataBlock:a.dataBlock,weaponShape:a.weaponShape,packShape:a.packShape,falling:a.falling,jetting:a.jetting,playerName:a.playerName,targetRenderFlags:r,iffColor:("Player"===a.type||((r??0)&2)!=0)&&null!=a.sensorGroup?this.resolveIffColor(a.sensorGroup):void 0,position:a.position&&(a.simulatedVelocity||a.itemPhysics&&!a.itemPhysics.atRest)?[...a.position]:a.position,rotation:a.rotation,velocity:a.velocity,health:a.health,energy:a.energy,actionAnim:a.actionAnim,actionAtEnd:a.actionAtEnd,damageState:a.damageState,faceViewer:a.faceViewer,threads:a.threads,explosionDataBlockId:a.explosionDataBlockId,maintainEmitterId:a.maintainEmitterId,weaponImageState:a.weaponImageState,weaponImageStates:a.weaponImageStates,headPitch:a.headPitch,headYaw:a.headYaw,label:a.label,audioFileName:a.audioFileName,audioVolume:a.audioVolume,audioIs3D:a.audioIs3D,audioIsLooping:a.audioIsLooping,audioMinDistance:a.audioMinDistance,audioMaxDistance:a.audioMaxDistance,audioMinLoopGap:a.audioMinLoopGap,audioMaxLoopGap:a.audioMaxLoopGap,sceneData:a.sceneData})}return t}buildHudState(){let e={slots:Array.from(this.weaponsHud.slots.entries()).map(([e,t])=>({index:e,ammo:t})),activeIndex:this.weaponsHud.activeIndex},t={slots:Array.from(this.inventoryHud.slots.entries()).map(([e,t])=>({slot:e,count:t})),activeSlot:this.inventoryHud.activeSlot},a=this.backpackHud.packIndex>=0?{...this.backpackHud}:null,r=this.teamScores.map(e=>({...e})),n=new Map;for(let{teamId:e}of this.playerRoster.values())e>0&&n.set(e,(n.get(e)??0)+1);for(let e of r)e.playerCount=n.get(e.teamId)??0;return{weaponsHud:e,inventoryHud:t,backpackHud:a,teamScores:r}}buildTimeFilteredEvents(e){return{chatMessages:this.chatMessages.slice(),audioEvents:this.audioEvents.filter(t=>t.timeSec>e-.5&&t.timeSec<=e)}}}e.s(["StreamEngine",()=>r9],10244)},71051,e=>{"use strict";class t{ws=null;handlers;url;_connected=!1;wsPingInterval=null;smoothedWsPing=0;constructor(e,t){this.url=e,this.handlers=t}get connected(){return this._connected}connect(){this.ws=new WebSocket(this.url),this.ws.binaryType="arraybuffer",this.ws.onopen=()=>{console.log("[relay] WebSocket connected to",this.url),this._connected=!0,this.startWsPing(),this.handlers.onOpen?.()},this.ws.onmessage=e=>{if(e.data instanceof ArrayBuffer)this.handlers.onGamePacket?.(new Uint8Array(e.data));else try{let t=JSON.parse(e.data);this.handleMessage(t)}catch(e){console.error("Failed to parse relay message:",e)}},this.ws.onclose=()=>{console.log("[relay] WebSocket disconnected"),this._connected=!1,this.stopWsPing(),this.handlers.onClose?.()},this.ws.onerror=()=>{console.error("[relay] WebSocket error"),this.handlers.onError?.("WebSocket connection error")}}handleMessage(e){switch(e.type){case"serverList":this.handlers.onServerList?.(e.servers);break;case"status":this.handlers.onStatus?.(e.status,e.message,e.connectSequence,e.mapName);break;case"ping":this.handlers.onPing?.(e.ms);break;case"wsPong":{let t=Date.now()-e.ts;this.smoothedWsPing=0===this.smoothedWsPing?t:.5*this.smoothedWsPing+.5*t,this.handlers.onWsPing?.(Math.round(this.smoothedWsPing));break}case"error":this.handlers.onError?.(e.message)}}listServers(){this.send({type:"listServers"})}sendWsPing(){this.send({type:"wsPing",ts:Date.now()})}joinServer(e,t){console.log("[relay] Joining server:",e),this.send({type:"joinServer",address:e,warriorName:t})}disconnectServer(){this.send({type:"disconnect"})}sendAuthEvent(e,t){this.send({type:"sendCommand",command:e,args:t})}sendCommand(e,t){this.send({type:"sendCommand",command:e,args:t})}sendCRCResponse(e,t,a){this.send({type:"sendCRCResponse",crcValue:e,field1:t,field2:a})}sendCRCCompute(e,t,a,r){this.send({type:"sendCRCCompute",seed:e,field2:t,includeTextures:r,datablocks:a})}sendGhostAck(e,t){this.send({type:"sendGhostAck",sequence:e,ghostCount:t})}sendMove(e){this.send({type:"sendMove",move:e})}close(){this.stopWsPing(),this.ws&&(this.ws.close(),this.ws=null),this._connected=!1}startWsPing(){this.smoothedWsPing=0,this.send({type:"wsPing",ts:Date.now()}),this.wsPingInterval=setInterval(()=>{this.send({type:"wsPing",ts:Date.now()})},7e3)}stopWsPing(){null!=this.wsPingInterval&&(clearInterval(this.wsPingInterval),this.wsPingInterval=null)}send(e){this.ws?.readyState===WebSocket.OPEN?this.ws.send(JSON.stringify(e)):console.warn("[relay] send dropped (ws not open):",e.type)}}e.s(["RelayClient",()=>t])},98755,e=>{"use strict";e.i(47167);var t=e.i(8155),a=e.i(66748),r=e.i(71051);e.i(91891);var n=e.i(94802),i=e.i(89119),o=e.i(10244);class s extends o.StreamEngine{packetParser;relay;currentTimeSec=0;connectSynced=!1;_snapshot=null;_snapshotTick=-1;_ready=!1;dataBlockClassNames=new Map;onReady;constructor(e){super(),this.relay=e;const{registry:t,ghostTracker:a,packetParser:r}=(0,n.createLiveParser)();this.packetParser=r,this.ghostTracker=a,this.registry=t}getDataBlockData(e){return this.packetParser.getDataBlockDataMap()?.get(e)}_shapeConstructorCache=null;getShapeConstructorSequences(e){this._shapeConstructorCache=new Map;let t=this.packetParser.getDataBlockDataMap();if(t){for(let[,e]of t){let t=e.shape,a=e.sequences;t&&a&&this._shapeConstructorCache.set(t.toLowerCase(),a)}return this._shapeConstructorCache.get(e.toLowerCase())}}getTimeSec(){return this.currentTimeSec}getCameraYawPitch(e){return this.getAbsoluteRotation(e)??{yaw:0,pitch:0}}getEffectShapes(){let e=new Set,t=this.packetParser.getDataBlockDataMap();if(!t)return[];for(let[,a]of t){let r=a.explosion;if(null==r)continue;let n=t.get(r);n?.dtsFileName&&e.add(n.dtsFileName)}return[...e]}reset(){this.resetSharedState(),this.ghostTracker.clear?.(),this.currentTimeSec=0,this._snapshot=null,this._snapshotTick=-1,this.dataBlockClassNames.clear(),this.observerMode="fly"}getSnapshot(){return this._snapshot&&this._snapshotTick===this.tickCount?this._snapshot:this.buildSnapshot()}stepToTime(e,t){return this.currentTimeSec=e,this.getSnapshot()}syncConnectSequence(e){if(this.connectSynced||e.length<1)return;this.connectSynced=!0;let t=e[0]>>1&1;this.packetParser.setConnectionProtocolState({lastSeqRecvdAtSend:Array(32).fill(0),lastSeqRecvd:0,highestAckedSeq:0,lastSendSeq:0x1fffffff,ackMask:0,connectSequence:t,lastRecvAckAck:0,connectionEstablished:!0})}feedPacket(e){this.syncConnectSequence(e),this.processPacket(e)}handleRelayCommands(e){if("RemoteCommandEvent"!==e.type)return;let t=e.funcName;if(!t)return;let a=this.resolveNetString(t);if(["t2csri_pokeClient","t2csri_getChallengeChunk","t2csri_decryptChallenge"].includes(a)){let t=(e.args??[]).map(e=>this.resolveNetString(e)).filter(e=>""!==e);console.log(`[live] auth event: ${a}`,t),this.relay.sendAuthEvent(a,t);return}let r=(e.args??[]).map(e=>this.resolveNetString(e));if("MissionStartPhase1"===a){let e=r[0]??"";console.log(`[live] mission phase 1, seq=${e}`),this.relay.sendCommand("MissionStartPhase1Done",[e])}else if("MissionStartPhase2"===a){let e=r[0]??"";console.log(`[live] mission phase 2 (datablocks), seq=${e}`),this.relay.sendCommand("MissionStartPhase2Done",[e])}else if("MissionStartPhase3"===a){let e=r[0]??"";console.log(`[live] mission phase 3 (ghosting), seq=${e}`),this.relay.sendCommand("setClientFav",[""]),this.relay.sendCommand("MissionStartPhase3Done",[e])}}handleCRCChallenge(e){if("CRCChallengeEvent"!==e.type)return;let t=e.crcValue,a=e.field1,r=e.field2,n=(1&a)!=0;console.log(`[live] CRC challenge: seed=0x${(t>>>0).toString(16)} f1=0x${(a>>>0).toString(16)} f2=0x${(r>>>0).toString(16)} includeTextures=${n}`);let o=this.packetParser.getDataBlockDataMap(),s=[];if(o)for(let[e,t]of o){let a=this.dataBlockClassNames.get(e);if(!a)continue;let r=(0,i.resolveShapeName)(a,t);s.push({objectId:e,className:a,shapeName:r??""})}console.log(`[live] CRC: sending ${s.length} datablocks for computation`),this.relay.sendCRCCompute(t,r,s,n)}handleGhostingMessage(e){if("GhostingMessageEvent"!==e.type)return;let t=e.message,a=e.sequence,r=e.ghostCount;console.log(`[live] GhostingMessageEvent: message=${t} sequence=${a} ghostCount=${r}`),0===t&&(console.log(`[live] Sending ghost ack (type 1) for sequence ${a}`),this.relay.sendGhostAck(a,r))}observerMode="fly";cycleObserveNext(){"fly"===this.observerMode?(console.log("[live] observer: fly → follow (jump trigger)"),this.sendTrigger(2),this.observerMode="follow"):(console.log("[live] observer: cycle next (fire trigger)"),this.sendTrigger(0))}toggleObserverMode(){"fly"===this.observerMode?(console.log("[live] observer: fly → follow (jump trigger)"),this.sendTrigger(2),this.observerMode="follow"):(console.log("[live] observer: follow → fly (jump trigger)"),this.sendTrigger(2),this.observerMode="fly")}sendTrigger(e){let t=[!1,!1,!1,!1,!1,!1];t[e]=!0,this.relay.sendMove({x:0,y:0,z:0,yaw:0,pitch:0,roll:0,trigger:t,freeLook:!1})}getPlayerList(){let e=[];for(let[t,a]of this.targetNames){let r=this.targetTeams.get(t)??0;e.push({targetId:t,name:a,sensorGroup:r})}return e}processPacket(e){try{let t=this.packetParser.protocolRejected,a=this.packetParser.protocolNoDispatch,r=this.packetParser.parsePacket(e),n=this.packetParser.protocolRejected>t,o=this.packetParser.protocolNoDispatch>a;(n||o)&&console.warn(`[live] packet #${this.tickCount} ${n?"REJECTED":"no-dispatch"}: ${e.length} bytes (total rejected=${this.packetParser.protocolRejected}, noDispatch=${this.packetParser.protocolNoDispatch})`);let s=this.tickCount<20,l=this.tickCount%100==0,d=s||l;for(let t of(d&&console.log(`[live] packet #${this.tickCount}: ${r.events.length} events, ${r.ghosts.length} ghosts, ${e.length} bytes`+(void 0!==r.gameState.controlObjectGhostIndex?`, control=${r.gameState.controlObjectGhostIndex}`:"")+(void 0!==r.gameState.cameraFov?`, fov=${r.gameState.cameraFov}`:"")),this.processControlObject(r.gameState),r.events))if(t.parsedData){this.handleRelayCommands(t.parsedData),this.handleCRCChallenge(t.parsedData),this.handleGhostingMessage(t.parsedData);let e=t.parsedData.type;if("RemoteCommandEvent"===e){let e=this.resolveNetString(t.parsedData.funcName??"");console.log(`[live] remote: ${e}`)}if(s&&"NetStringEvent"!==e&&"RemoteCommandEvent"!==e&&console.log(`[live] event: ${e}`,"SimDataBlockEvent"===e?{id:t.parsedData.objectId,className:t.parsedData.dataBlockClassName}:void 0),"SimDataBlockEvent"===e){let e=t.parsedData.objectId,a=t.parsedData.dataBlockClassName;if(null!=e&&a&&this.dataBlockClassNames.set(e,a),d){let r=t.parsedData.dataBlockData,n=(0,i.resolveShapeName)(a??"",r);console.log(`[live] datablock: id=${e} class=${a??"?"}`+(n?` shape=${n}`:""))}}let a=this.registry.getEventParser(t.classId)?.name;if(this.processEvent(t,a),s&&"NetStringEvent"===e){let e=t.parsedData.id,a=t.parsedData.value;null!=e&&"string"==typeof a&&console.log(`[live] netString #${e} = "${a.length>60?a.slice(0,60)+"…":a}"`)}if("TargetInfoEvent"===e){let e=t.parsedData.targetId,a=t.parsedData.nameTag;if(null!=e&&null!=a){let r=this.netStrings.get(a);if(r){let a=(0,i.stripTaggedStringMarkup)(r);console.log(`[live] target #${e}: "${a}" team=${t.parsedData.sensorGroup??"?"}`)}}}if("SetSensorGroupEvent"===e){let e=t.parsedData.sensorGroup;null!=e&&console.log(`[live] sensor group changed: → ${e}`)}if("SensorGroupColorEvent"===e){let e=t.parsedData.sensorGroup,a=t.parsedData.colors;a&&console.log(`[live] sensor group colors: group=${e}, ${a.length} entries`)}}for(let e of r.ghosts){if("create"===e.type){let t=e.parsedData?.position,a=t&&"number"==typeof t.x&&"number"==typeof t.y&&"number"==typeof t.z,r=this.resolveGhostClassName(e.index,e.classId);console.log(`[live] ghost create: #${e.index} ${r??"?"}`+(a?` at (${t.x.toFixed(1)}, ${t.y.toFixed(1)}, ${t.z.toFixed(1)})`:"")+` (${this.entities.size+1} entities total)`),this._ready||(this._ready=!0,this.onReady?.())}else if("delete"===e.type){let t=this.entityIdByGhostIndex.get(e.index),a=t?this.entities.get(t):void 0;(this.tickCount<50||this.tickCount%200==0)&&console.log(`[live] ghost delete: #${e.index} ${a?.className??"?"} (${this.entities.size-1} entities remaining)`)}this.processGhostUpdate(e)}if(this.tickCount++,this.advanceProjectiles(),this.advanceItems(),l&&this.tickCount>1){let e=this.packetParser.getDataBlockDataMap();console.log(`[live] status @ tick ${this.tickCount}: ${this.entities.size} entities, ${e?.size??0} datablocks, rejected=${this.packetParser.protocolRejected}, noDispatch=${this.packetParser.protocolNoDispatch}`)}let c=this.entities.size;if(1===this.tickCount||c>0&&c%25==0&&this.tickCount<100){let e=new Map;for(let t of this.entities.values())e.set(t.type,(e.get(t.type)??0)+1);let t=[...e.entries()].map(([e,t])=>`${e}=${t}`).join(" ");console.log(`[live] entity count: ${c} (${t})`)}let h=this.camera?.mode;if(this.updateCameraAndHud(),this.camera&&this.camera.mode!==h&&console.log(`[live] camera mode: ${h??"none"} → ${this.camera.mode}`+("third-person"===this.camera.mode?` orbit=${this.camera.orbitTargetId??"?"} dist=${this.camera.orbitDistance??"?"}`:"")),this.tickCount<=5&&this.camera){let[e,t,a]=this.camera.position;console.log(`[live] camera: mode=${this.camera.mode} pos=(${e.toFixed(1)}, ${t.toFixed(1)}, ${a.toFixed(1)}) fov=${this.camera.fov}`)}}catch(t){console.error("Failed to process live packet:",t,{tickCount:this.tickCount,entityCount:this.entities.size,dataLength:e.length,controlGhost:this.latestControl.ghostIndex,connectSynced:this.connectSynced})}}buildSnapshot(){let e=this.buildEntityList(),t=this.currentTimeSec,{chatMessages:a,audioEvents:r}=this.buildTimeFilteredEvents(t),{weaponsHud:n,inventoryHud:i,backpackHud:o,teamScores:s}=this.buildHudState();this.camera||(this.camera={time:t,position:[0,0,200],rotation:[0,0,0,1],fov:90,mode:"observer"});let l={timeSec:t,exhausted:!1,camera:this.camera,entities:e,controlPlayerGhostId:this.controlPlayerGhostId,playerSensorGroup:this.playerSensorGroup,status:this.lastStatus,chatMessages:a,audioEvents:r,weaponsHud:n,backpackHud:o,inventoryHud:i,teamScores:s};return this._snapshot=l,this._snapshotTick=this.tickCount,l}}let l="wss://t2-relay.fly.dev",d=(0,t.createStore)((e,t)=>({relayConnected:!1,gameStatus:null,gameStatusMessage:void 0,mapName:void 0,serverName:void 0,relayToGameServerPing:null,browserToRelayPing:null,servers:[],serversLoading:!1,adapter:null,liveReady:!1,_relay:null,_adapter:null,_pending:[],_listInFlight:!1,connectRelay(a=l){let n=t();n._relay&&n._relay.close();let i=new r.RelayClient(a,{onOpen(){e({relayConnected:!0});let a=t();for(let e of a._pending)e();a._pending=[]},onStatus(t,a,r,n){console.log(`[relay] game status: ${t}${a?` — ${a}`:""}${n?` map=${n}`:""}`),e({gameStatus:t,gameStatusMessage:a,...n?{mapName:n}:{}})},onServerList(a){t()._listInFlight=!1,e({servers:a,serversLoading:!1})},onGamePacket(e){let a=t()._adapter;a||console.warn("[relay] received game packet but no adapter is active"),a?.feedPacket(e)},onPing(t){e({relayToGameServerPing:t})},onWsPing(t){e({browserToRelayPing:t})},onError(a){console.error("Relay error:",a),t()._listInFlight=!1,e({serversLoading:!1})},onClose(){let a=t();a._relay===i&&(a._relay=null,a._adapter=null,a._pending=[],a._listInFlight=!1,e({relayConnected:!1,gameStatus:null,gameStatusMessage:void 0,mapName:void 0,serverName:void 0,relayToGameServerPing:null,browserToRelayPing:null,adapter:null,liveReady:!1}))}});i.connect(),t()._relay=i},disconnectRelay(){let a=t();a._relay?.close(),a._relay=null,a._adapter=null,a._pending=[],a._listInFlight=!1,e({relayConnected:!1,gameStatus:null,gameStatusMessage:void 0,mapName:void 0,serverName:void 0,relayToGameServerPing:null,browserToRelayPing:null,adapter:null,liveReady:!1})},listServers(){let a=t();if(a._listInFlight)return;a._listInFlight=!0;let r=()=>{let e=t();e._relay?.sendWsPing(),e._relay?.listServers()};e({serversLoading:!0}),a._relay?.connected?r():(a._pending.push(r),a._relay||t().connectRelay())},joinServer(a,r){let n=t();if(!n._relay)return;let i=n.servers.find(e=>e.address===a),o=new s(n._relay);o.onReady=()=>e({liveReady:!0}),n._adapter=o,e({mapName:i?.mapName??n.mapName,serverName:i?.name,liveReady:!1,gameStatus:null,adapter:o}),n._relay.joinServer(a,r)},disconnectServer(){let a=t();a._relay?.disconnectServer(),a._adapter?.reset(),a._adapter=null,e({adapter:null,liveReady:!1,gameStatus:null,mapName:void 0,serverName:void 0,relayToGameServerPing:null})},sendMove(e){t()._relay?.sendMove(e)},sendCommand(e,...a){t()._relay?.sendCommand(e,a)}}));function c(e,t){return(0,a.useStoreWithEqualityFn)(d,e,t)}function h(e){return null!=e.relayToGameServerPing&&null!=e.browserToRelayPing?e.relayToGameServerPing+e.browserToRelayPing:e.relayToGameServerPing??null}function u(){let e=d.getState();e._relay?.close(),e._relay=null}e.s(["disposeLiveConnection",()=>u,"liveConnectionStore",0,d,"selectPing",()=>h,"useLiveSelector",()=>c],98755)}]); \ No newline at end of file diff --git a/docs/_not-found/__next._full.txt b/docs/_not-found/__next._full.txt index dd873a75..5d404cf6 100644 --- a/docs/_not-found/__next._full.txt +++ b/docs/_not-found/__next._full.txt @@ -8,7 +8,7 @@ a:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"MetadataBoundary"] c:I[68027,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -0:{"P":null,"b":"JablvlklHXp4NGWk4TTlC","c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L5",null,{"children":["$","$6",null,{"name":"Next.MetadataOutlet","children":"$@7"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$6",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c","$undefined"],"S":true} +0:{"P":null,"b":"MrEXjMpW9X_XkpwJ2-Z7S","c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L5",null,{"children":["$","$6",null,{"name":"Next.MetadataOutlet","children":"$@7"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$6",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c","$undefined"],"S":true} 9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]] d:I[27201,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"IconMark"] 7:null diff --git a/docs/_not-found/__next._head.txt b/docs/_not-found/__next._head.txt index 41d6f513..bb4fbe05 100644 --- a/docs/_not-found/__next._head.txt +++ b/docs/_not-found/__next._head.txt @@ -3,4 +3,4 @@ 3:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"IconMark"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"MapGenius – Explore maps for Tribes 2"}],["$","meta","1",{"name":"description","content":"Tribes 2 forever."}],["$","link","2",{"rel":"icon","href":"/t2-mapper/icon.png?icon.2911bba1.png","sizes":"108x128","type":"image/png"}],["$","$L5","3",{}]]}]}]}],null]}],"loading":null,"isPartial":false} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"MapGenius – Explore maps for Tribes 2"}],["$","meta","1",{"name":"description","content":"Tribes 2 forever."}],["$","link","2",{"rel":"icon","href":"/t2-mapper/icon.png?icon.2911bba1.png","sizes":"108x128","type":"image/png"}],["$","$L5","3",{}]]}]}]}],null]}],"loading":null,"isPartial":false} diff --git a/docs/_not-found/__next._index.txt b/docs/_not-found/__next._index.txt index 42eb3c22..58c2cae6 100644 --- a/docs/_not-found/__next._index.txt +++ b/docs/_not-found/__next._index.txt @@ -3,4 +3,4 @@ 3:I[39756,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 4:I[37457,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]]}],"loading":null,"isPartial":false} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]]}],"loading":null,"isPartial":false} diff --git a/docs/_not-found/__next._not-found.__PAGE__.txt b/docs/_not-found/__next._not-found.__PAGE__.txt index a2bc0faf..498249c5 100644 --- a/docs/_not-found/__next._not-found.__PAGE__.txt +++ b/docs/_not-found/__next._not-found.__PAGE__.txt @@ -1,5 +1,5 @@ 1:"$Sreact.fragment" 2:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"OutletBoundary"] 3:"$Sreact.suspense" -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"loading":null,"isPartial":false} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"loading":null,"isPartial":false} 4:null diff --git a/docs/_not-found/__next._not-found.txt b/docs/_not-found/__next._not-found.txt index 30a01e63..5226b333 100644 --- a/docs/_not-found/__next._not-found.txt +++ b/docs/_not-found/__next._not-found.txt @@ -1,4 +1,4 @@ 1:"$Sreact.fragment" 2:I[39756,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 3:I[37457,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false} diff --git a/docs/_not-found/__next._tree.txt b/docs/_not-found/__next._tree.txt index ee8dcad0..384c241f 100644 --- a/docs/_not-found/__next._tree.txt +++ b/docs/_not-found/__next._tree.txt @@ -1,2 +1,2 @@ :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"/_not-found","paramType":null,"paramKey":"/_not-found","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":true},"staleTime":300} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"/_not-found","paramType":null,"paramKey":"/_not-found","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":true},"staleTime":300} diff --git a/docs/_not-found/index.html b/docs/_not-found/index.html index cfbe476a..be6e873b 100644 --- a/docs/_not-found/index.html +++ b/docs/_not-found/index.html @@ -1 +1 @@ -404: This page could not be found.MapGenius – Explore maps for Tribes 2

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.MapGenius – Explore maps for Tribes 2

404

This page could not be found.

\ No newline at end of file diff --git a/docs/_not-found/index.txt b/docs/_not-found/index.txt index dd873a75..5d404cf6 100644 --- a/docs/_not-found/index.txt +++ b/docs/_not-found/index.txt @@ -8,7 +8,7 @@ a:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"MetadataBoundary"] c:I[68027,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -0:{"P":null,"b":"JablvlklHXp4NGWk4TTlC","c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L5",null,{"children":["$","$6",null,{"name":"Next.MetadataOutlet","children":"$@7"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$6",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c","$undefined"],"S":true} +0:{"P":null,"b":"MrEXjMpW9X_XkpwJ2-Z7S","c":["","_not-found",""],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L5",null,{"children":["$","$6",null,{"name":"Next.MetadataOutlet","children":"$@7"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$6",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c","$undefined"],"S":true} 9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]] d:I[27201,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"IconMark"] 7:null diff --git a/docs/index.html b/docs/index.html index bdc84f48..fbbab887 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1 +1 @@ -MapGenius – Explore maps for Tribes 2 \ No newline at end of file +MapGenius – Explore maps for Tribes 2 \ No newline at end of file diff --git a/docs/index.txt b/docs/index.txt index 0f7d73dd..4761c8c1 100644 --- a/docs/index.txt +++ b/docs/index.txt @@ -3,16 +3,16 @@ 3:I[39756,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 4:I[37457,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 5:I[47257,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ClientPageRoot"] -6:I[31713,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/2400be5b6a2e4806.js","/t2-mapper/_next/static/chunks/164bc8495505bc95.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/ee88398bb27ad4a1.js","/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","/t2-mapper/_next/static/chunks/b07469fc6c6cd3bb.js","/t2-mapper/_next/static/chunks/629d98e413c0344a.js","/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","/t2-mapper/_next/static/chunks/49bf5eb2ca42014f.js"],"default"] +6:I[31713,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/ac206141b5c1882c.js","/t2-mapper/_next/static/chunks/164bc8495505bc95.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/c293826b70147a61.js","/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","/t2-mapper/_next/static/chunks/534ef931e88eb989.js","/t2-mapper/_next/static/chunks/5b60a5e8e48bc409.js","/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","/t2-mapper/_next/static/chunks/e4a5074909f0df67.js"],"default"] 9:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"OutletBoundary"] a:"$Sreact.suspense" c:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ViewportBoundary"] e:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"MetadataBoundary"] 10:I[68027,[],"default"] :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -:HL["/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","style"] -:HL["/t2-mapper/_next/static/chunks/bd03a29a57c8ca45.css","style"] -0:{"P":null,"b":"JablvlklHXp4NGWk4TTlC","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/bd03a29a57c8ca45.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/2400be5b6a2e4806.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/164bc8495505bc95.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/ee88398bb27ad4a1.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/b07469fc6c6cd3bb.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/629d98e413c0344a.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/t2-mapper/_next/static/chunks/49bf5eb2ca42014f.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[]],"S":true} +:HL["/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","style"] +:HL["/t2-mapper/_next/static/chunks/9542fc38c512bd1a.css","style"] +0:{"P":null,"b":"MrEXjMpW9X_XkpwJ2-Z7S","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/9542fc38c512bd1a.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/ac206141b5c1882c.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/164bc8495505bc95.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/c293826b70147a61.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/576b06837c0cb7a0.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/534ef931e88eb989.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/5b60a5e8e48bc409.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/9eaea0ae086bad69.js","async":true,"nonce":"$undefined"}],["$","script","script-9",{"src":"/t2-mapper/_next/static/chunks/037fbc56cebf7caa.js","async":true,"nonce":"$undefined"}],["$","script","script-10",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true,"nonce":"$undefined"}],["$","script","script-11",{"src":"/t2-mapper/_next/static/chunks/e4a5074909f0df67.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[]],"S":true} 7:{} 8:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params" d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]] diff --git a/docs/shapes/__next._full.txt b/docs/shapes/__next._full.txt index 1506006f..118f1760 100644 --- a/docs/shapes/__next._full.txt +++ b/docs/shapes/__next._full.txt @@ -3,15 +3,15 @@ 3:I[39756,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 4:I[37457,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 5:I[47257,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ClientPageRoot"] -6:I[39724,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","/t2-mapper/_next/static/chunks/12261e943ff623d2.js","/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js"],"default"] +6:I[39724,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","/t2-mapper/_next/static/chunks/82a44da545bac352.js","/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js"],"default"] 9:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"OutletBoundary"] a:"$Sreact.suspense" c:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ViewportBoundary"] e:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"MetadataBoundary"] 10:I[68027,[],"default"] :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -:HL["/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","style"] -0:{"P":null,"b":"JablvlklHXp4NGWk4TTlC","c":["","shapes",""],"q":"","i":false,"f":[[["",{"children":["shapes",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/12261e943ff623d2.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[]],"S":true} +:HL["/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","style"] +0:{"P":null,"b":"MrEXjMpW9X_XkpwJ2-Z7S","c":["","shapes",""],"q":"","i":false,"f":[[["",{"children":["shapes",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/82a44da545bac352.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[]],"S":true} 7:{} 8:"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params" d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]] diff --git a/docs/shapes/__next._head.txt b/docs/shapes/__next._head.txt index 462067a2..653a1b4e 100644 --- a/docs/shapes/__next._head.txt +++ b/docs/shapes/__next._head.txt @@ -3,4 +3,4 @@ 3:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"MetadataBoundary"] 4:"$Sreact.suspense" 5:I[27201,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"IconMark"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"MapGenius – Explore maps for Tribes 2"}],["$","meta","1",{"name":"description","content":"Tribes 2 forever."}],["$","link","2",{"rel":"icon","href":"/t2-mapper/icon.png?icon.2911bba1.png","sizes":"108x128","type":"image/png"}],["$","$L5","3",{}]]}]}]}],null]}],"loading":null,"isPartial":false} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"MapGenius – Explore maps for Tribes 2"}],["$","meta","1",{"name":"description","content":"Tribes 2 forever."}],["$","link","2",{"rel":"icon","href":"/t2-mapper/icon.png?icon.2911bba1.png","sizes":"108x128","type":"image/png"}],["$","$L5","3",{}]]}]}]}],null]}],"loading":null,"isPartial":false} diff --git a/docs/shapes/__next._index.txt b/docs/shapes/__next._index.txt index 42eb3c22..58c2cae6 100644 --- a/docs/shapes/__next._index.txt +++ b/docs/shapes/__next._index.txt @@ -3,4 +3,4 @@ 3:I[39756,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 4:I[37457,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]]}],"loading":null,"isPartial":false} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]]}],"loading":null,"isPartial":false} diff --git a/docs/shapes/__next._tree.txt b/docs/shapes/__next._tree.txt index 65288d7b..18d7b855 100644 --- a/docs/shapes/__next._tree.txt +++ b/docs/shapes/__next._tree.txt @@ -1,3 +1,3 @@ :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -:HL["/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","style"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"shapes","paramType":null,"paramKey":"shapes","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":true},"staleTime":300} +:HL["/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","style"] +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"shapes","paramType":null,"paramKey":"shapes","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":true},"staleTime":300} diff --git a/docs/shapes/__next.shapes.__PAGE__.txt b/docs/shapes/__next.shapes.__PAGE__.txt index a6b170e4..e259b6f1 100644 --- a/docs/shapes/__next.shapes.__PAGE__.txt +++ b/docs/shapes/__next.shapes.__PAGE__.txt @@ -1,10 +1,10 @@ 1:"$Sreact.fragment" 2:I[47257,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ClientPageRoot"] -3:I[39724,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","/t2-mapper/_next/static/chunks/12261e943ff623d2.js","/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js"],"default"] +3:I[39724,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","/t2-mapper/_next/static/chunks/82a44da545bac352.js","/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js"],"default"] 6:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"OutletBoundary"] 7:"$Sreact.suspense" -:HL["/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","style"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","async":true}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","async":true}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","async":true}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","async":true}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/12261e943ff623d2.js","async":true}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","async":true}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"loading":null,"isPartial":false} +:HL["/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","style"] +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","async":true}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","async":true}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","async":true}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","async":true}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/82a44da545bac352.js","async":true}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","async":true}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"loading":null,"isPartial":false} 4:{} 5:"$0:rsc:props:children:0:props:serverProvidedParams:params" 8:null diff --git a/docs/shapes/__next.shapes.txt b/docs/shapes/__next.shapes.txt index 30a01e63..5226b333 100644 --- a/docs/shapes/__next.shapes.txt +++ b/docs/shapes/__next.shapes.txt @@ -1,4 +1,4 @@ 1:"$Sreact.fragment" 2:I[39756,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 3:I[37457,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] -0:{"buildId":"JablvlklHXp4NGWk4TTlC","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false} +0:{"buildId":"MrEXjMpW9X_XkpwJ2-Z7S","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false} diff --git a/docs/shapes/index.html b/docs/shapes/index.html index d0f4aa9b..440fedc9 100644 --- a/docs/shapes/index.html +++ b/docs/shapes/index.html @@ -1 +1 @@ -MapGenius – Explore maps for Tribes 2 \ No newline at end of file +MapGenius – Explore maps for Tribes 2 \ No newline at end of file diff --git a/docs/shapes/index.txt b/docs/shapes/index.txt index 1506006f..118f1760 100644 --- a/docs/shapes/index.txt +++ b/docs/shapes/index.txt @@ -3,15 +3,15 @@ 3:I[39756,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 4:I[37457,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"default"] 5:I[47257,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ClientPageRoot"] -6:I[39724,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","/t2-mapper/_next/static/chunks/12261e943ff623d2.js","/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js"],"default"] +6:I[39724,["/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","/t2-mapper/_next/static/chunks/82a44da545bac352.js","/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","/t2-mapper/_next/static/chunks/153d5796298dee1e.js","/t2-mapper/_next/static/chunks/1a2c6dc513278881.js"],"default"] 9:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"OutletBoundary"] a:"$Sreact.suspense" c:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"ViewportBoundary"] e:I[97367,["/t2-mapper/_next/static/chunks/2f236954d6a65e12.js"],"MetadataBoundary"] 10:I[68027,[],"default"] :HL["/t2-mapper/_next/static/chunks/e620039d1c837dab.css","style"] -:HL["/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","style"] -0:{"P":null,"b":"JablvlklHXp4NGWk4TTlC","c":["","shapes",""],"q":"","i":false,"f":[[["",{"children":["shapes",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/12ed5d454f7c6ac3.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/12261e943ff623d2.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[]],"S":true} +:HL["/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","style"] +0:{"P":null,"b":"MrEXjMpW9X_XkpwJ2-Z7S","c":["","shapes",""],"q":"","i":false,"f":[[["",{"children":["shapes",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/e620039d1c837dab.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/89fcb9c19e93d0ef.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"defaultOptions":{"clearOnDefault":false},"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/a2e31798d9bc121e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/88a5cf0ea7f16af4.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/14c6376ae0b23060.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/b00acbf8afd8b4b6.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/818dce712bc45cb4.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/t2-mapper/_next/static/chunks/2edeeda5ca6dc680.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/t2-mapper/_next/static/chunks/82a44da545bac352.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/t2-mapper/_next/static/chunks/e1a8caa90a5343cf.js","async":true,"nonce":"$undefined"}],["$","script","script-7",{"src":"/t2-mapper/_next/static/chunks/153d5796298dee1e.js","async":true,"nonce":"$undefined"}],["$","script","script-8",{"src":"/t2-mapper/_next/static/chunks/1a2c6dc513278881.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[]],"S":true} 7:{} 8:"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params" d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}]] diff --git a/relay/crc.ts b/relay/crc.ts index 8d25f6ac..f6600105 100644 --- a/relay/crc.ts +++ b/relay/crc.ts @@ -116,6 +116,8 @@ export async function computeGameCRC( let filesFound = 0; let filesMissing = 0; + const startTime = performance.now(); + console.log( `[crc] starting computation: seed=0x${(seed >>> 0).toString(16)}, ` + `${sorted.length} ShapeBaseData datablocks (of ${datablocks.length} total), ` + @@ -166,9 +168,11 @@ export async function computeGameCRC( crc = (crc + totalSize) >>> 0; + const elapsed = performance.now() - startTime; + console.log( `[crc] RESULT: ${filesFound} files CRC'd, ${filesMissing} missing, ` + - `crc=0x${crc.toString(16)}, totalSize=${totalSize}`, + `crc=0x${crc.toString(16)}, totalSize=${totalSize}, elapsed=${elapsed.toFixed(0)}ms`, ); return { crc, totalSize }; diff --git a/relay/gameConnection.ts b/relay/gameConnection.ts index 4274a594..3a5567a4 100644 --- a/relay/gameConnection.ts +++ b/relay/gameConnection.ts @@ -79,11 +79,15 @@ export class GameConnection extends EventEmitter { private smoothedPing = 0; private lastPingEmit = 0; - constructor(address: string) { + /** Warrior name to send in the ConnectRequest. */ + private warriorName: string; + + constructor(address: string, options?: { warriorName?: string }) { super(); const [host, portStr] = address.split(":"); this.host = host; this.port = parseInt(portStr, 10); + this.warriorName = options?.warriorName || ""; // Wire up packet delivery notifications for event retransmission. this.protocol.onNotify = (packetSeq, acked) => { @@ -316,7 +320,7 @@ export class GameConnection extends EventEmitter { /** Build the connection argv (name, race/gender, skin, voice, voicePitch). */ private buildConnectArgv(): string[] { - const name = process.env.T2_ACCOUNT_NAME || "Observer"; + const name = this.warriorName || process.env.T2_ACCOUNT_NAME || "Observer"; return [ name, // player name "Male Human", // race/gender diff --git a/relay/server.ts b/relay/server.ts index 0a5945b3..99bf3de3 100644 --- a/relay/server.ts +++ b/relay/server.ts @@ -79,6 +79,7 @@ wss.on("connection", (ws) => { let gameConnection: GameConnection | null = null; let lastJoinAddress: string | null = null; + let lastWarriorName: string | undefined; let retryCount = 0; let retryTimer: ReturnType | null = null; @@ -86,12 +87,12 @@ wss.on("connection", (ws) => { const RETRY_DELAY_MS = 6000; const RETRYABLE_REASONS = ["Server is cycling mission"]; - async function connectToServer(ws: WebSocket, address: string): Promise { + async function connectToServer(ws: WebSocket, address: string, warriorName?: string): Promise { if (gameConnection) { gameConnection.disconnect(); } - gameConnection = new GameConnection(address); + gameConnection = new GameConnection(address, { warriorName }); // Set mapName from the cached server list if available. const cachedServer = cachedServers.find( @@ -135,7 +136,7 @@ wss.on("connection", (ws) => { retryTimer = setTimeout(() => { retryTimer = null; if (lastJoinAddress === address && ws.readyState === WebSocket.OPEN) { - connectToServer(ws, address); + connectToServer(ws, address, lastWarriorName); } }, RETRY_DELAY_MS); return; @@ -242,7 +243,7 @@ wss.on("connection", (ws) => { } case "joinServer": { - relayLog.info({ address: message.address }, "Join server requested"); + relayLog.info({ address: message.address, warriorName: message.warriorName }, "Join server requested"); if (gameConnection) { relayLog.info("Disconnecting existing game connection"); gameConnection.disconnect(); @@ -253,8 +254,9 @@ wss.on("connection", (ws) => { } retryCount = 0; lastJoinAddress = message.address; + lastWarriorName = message.warriorName; - await connectToServer(ws, message.address); + await connectToServer(ws, message.address, message.warriorName); break; } diff --git a/relay/types.ts b/relay/types.ts index 19ee9fbe..4e368f45 100644 --- a/relay/types.ts +++ b/relay/types.ts @@ -1,7 +1,7 @@ /** Messages from browser client to relay server. */ export type ClientMessage = | { type: "listServers" } - | { type: "joinServer"; address: string } + | { type: "joinServer"; address: string; warriorName?: string } | { type: "disconnect" } | { type: "sendMove"; move: ClientMove } | { type: "sendCommand"; command: string; args: string[] } diff --git a/scripts/play-demo.ts b/scripts/play-demo.ts index f95d24ad..3ea012e9 100644 --- a/scripts/play-demo.ts +++ b/scripts/play-demo.ts @@ -202,7 +202,7 @@ const sceneInfo = await page.evaluate(() => { // Check AnimationMixer state. let mixerInfo = "No mixer found"; scene.traverse((obj: any) => { - // The root group of DemoPlayback is the direct parent of entity groups. + // The root group of StreamPlayback is the direct parent of entity groups. if (obj.children?.some((c: any) => c.name?.startsWith("player_"))) { // This is the root group. Check for active animations. const animations = (obj as any)._mixer; diff --git a/src/components/DemoPlayback.tsx b/src/components/DemoPlayback.tsx deleted file mode 100644 index fa39a5fc..00000000 --- a/src/components/DemoPlayback.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { useRecording } from "./RecordingProvider"; -import { DemoPlaybackController } from "./DemoPlaybackController"; - -export function DemoPlayback() { - const recording = useRecording(); - - if (!recording) return null; - return ; -} diff --git a/src/components/InspectorControls.tsx b/src/components/InspectorControls.tsx index 4eb359ad..9c8b68ae 100644 --- a/src/components/InspectorControls.tsx +++ b/src/components/InspectorControls.tsx @@ -10,7 +10,7 @@ import { CopyCoordinatesButton } from "./CopyCoordinatesButton"; import { LoadDemoButton } from "./LoadDemoButton"; import { JoinServerButton } from "./JoinServerButton"; import { useRecording } from "./RecordingProvider"; -import { useLiveConnectionOptional } from "./LiveConnection"; +import { useLiveSelector } from "../state/liveConnectionStore"; import { FiInfo, FiSettings } from "react-icons/fi"; import { Camera } from "three"; import styles from "./InspectorControls.module.css"; @@ -51,8 +51,7 @@ export function InspectorControls({ useControls(); const { debugMode, setDebugMode } = useDebug(); const demoRecording = useRecording(); - const live = useLiveConnectionOptional(); - const isLive = live?.adapter != null; + const isLive = useLiveSelector((s) => s.adapter != null); const isStreaming = demoRecording != null || isLive; // Hide FOV/speed controls during .rec playback (faithfully replaying), // but show them in .mis browsing and live observer mode. diff --git a/src/components/JoinServerButton.tsx b/src/components/JoinServerButton.tsx index 903a420e..debea400 100644 --- a/src/components/JoinServerButton.tsx +++ b/src/components/JoinServerButton.tsx @@ -1,5 +1,5 @@ import { BsFillLightningChargeFill } from "react-icons/bs"; -import { useLiveConnectionOptional } from "./LiveConnection"; +import { useLiveSelector, selectPing } from "../state/liveConnectionStore"; import styles from "./JoinServerButton.module.css"; function formatPing(ms: number): string { @@ -11,24 +11,26 @@ export function JoinServerButton({ }: { onOpenServerBrowser: () => void; }) { - const live = useLiveConnectionOptional(); - if (!live) return null; + const gameStatus = useLiveSelector((s) => s.gameStatus); + const serverName = useLiveSelector((s) => s.serverName); + const ping = useLiveSelector(selectPing); + const disconnectServer = useLiveSelector((s) => s.disconnectServer); - const isLive = live.gameStatus === "connected"; + const isLive = gameStatus === "connected"; const isConnecting = - live.gameStatus === "connecting" || - live.gameStatus === "challenging" || - live.gameStatus === "authenticating"; + gameStatus === "connecting" || + gameStatus === "challenging" || + gameStatus === "authenticating"; return ( diff --git a/src/components/LiveConnection.tsx b/src/components/LiveConnection.tsx index c10606f2..449a36d1 100644 --- a/src/components/LiveConnection.tsx +++ b/src/components/LiveConnection.tsx @@ -1,266 +1,15 @@ -import { - createContext, - useContext, - useState, - useCallback, - useRef, - useEffect, -} from "react"; -import { RelayClient } from "../stream/relayClient"; -import { LiveStreamAdapter } from "../stream/liveStreaming"; -import type { - ClientMove, - ServerInfo, - ConnectionStatus, -} from "../../relay/types"; - -interface LiveConnectionState { - relayConnected: boolean; - gameStatus: ConnectionStatus | null; - gameStatusMessage?: string; - /** Map name from the server being joined (from GameInfoResponse or status). */ - mapName?: string; - /** Effective RTT to the game server (relay↔T2 + browser↔relay). */ - ping: number | null; - /** Browser↔relay WebSocket RTT in ms. */ - wsPing: number | null; - servers: ServerInfo[]; - serversLoading: boolean; - adapter: LiveStreamAdapter | null; - /** True once the first ghost entity arrives (game is rendering). */ - liveReady: boolean; -} - -interface LiveConnectionActions { - connectRelay: (url?: string) => void; - disconnectRelay: () => void; - listServers: () => void; - joinServer: (address: string) => void; - disconnectServer: () => void; - sendMove: (move: ClientMove) => void; - sendCommand: (command: string, ...args: string[]) => void; -} - -const LiveConnectionContext = createContext< - (LiveConnectionState & LiveConnectionActions) | null ->(null); - -export function useLiveConnection() { - const ctx = useContext(LiveConnectionContext); - if (!ctx) { - throw new Error("useLiveConnection must be used within LiveConnectionProvider"); - } - return ctx; -} - -export function useLiveConnectionOptional() { - return useContext(LiveConnectionContext); -} - -const DEFAULT_RELAY_URL = - process.env.NEXT_PUBLIC_RELAY_URL || "ws://localhost:8765"; +import { useEffect } from "react"; +import { disposeLiveConnection } from "../state/liveConnectionStore"; +/** Cleanup-only provider — disposes the relay connection on unmount. */ export function LiveConnectionProvider({ children, }: { children: React.ReactNode; }) { - const relayRef = useRef(null); - const adapterRef = useRef(null); - // Queue of actions to run once the relay WebSocket opens. - const pendingRef = useRef void>>([]); - const listInFlightRef = useRef(false); - - const [relayConnected, setRelayConnected] = useState(false); - const [gameStatus, setGameStatus] = useState(null); - const [gameStatusMessage, setGameStatusMessage] = useState< - string | undefined - >(); - const [mapName, setMapName] = useState(); - const [servers, setServers] = useState([]); - const [serversLoading, setServersLoading] = useState(false); - const [adapter, setAdapter] = useState(null); - const [liveReady, setLiveReady] = useState(false); - const [relayPing, setRelayPing] = useState(null); - const [wsPing, setWsPing] = useState(null); - - const connectRelay = useCallback((url: string = DEFAULT_RELAY_URL) => { - if (relayRef.current) { - relayRef.current.close(); - relayRef.current = null; - } - - const relay = new RelayClient(url, { - onOpen() { - setRelayConnected(true); - // Flush any queued actions (e.g. listServers called before open). - for (const fn of pendingRef.current) fn(); - pendingRef.current = []; - }, - onStatus(status, message, _connectSequence, statusMapName) { - console.log( - `[relay] game status: ${status}${message ? ` — ${message}` : ""}${statusMapName ? ` map=${statusMapName}` : ""}`, - ); - setGameStatus(status); - setGameStatusMessage(message); - if (statusMapName) { - setMapName(statusMapName); - } - }, - onServerList(list) { - setServers(list); - setServersLoading(false); - listInFlightRef.current = false; - }, - onGamePacket(data) { - if (!adapterRef.current) { - console.warn("[relay] received game packet but no adapter is active"); - } - adapterRef.current?.feedPacket(data); - }, - onPing(ms) { - setRelayPing(ms); - }, - onWsPing(ms) { - setWsPing(ms); - }, - onError(message) { - console.error("Relay error:", message); - setServersLoading(false); - listInFlightRef.current = false; - }, - onClose() { - // Only update state if this is still the active relay. - if (relayRef.current === relay) { - relayRef.current = null; - setRelayConnected(false); - setGameStatus(null); - setMapName(undefined); - setRelayPing(null); - setWsPing(null); - setAdapter(null); - setLiveReady(false); - adapterRef.current = null; - pendingRef.current = []; - listInFlightRef.current = false; - } - }, - }); - - relay.connect(); - relayRef.current = relay; - }, []); - - const disconnectRelay = useCallback(() => { - relayRef.current?.close(); - relayRef.current = null; - adapterRef.current = null; - pendingRef.current = []; - setRelayConnected(false); - setGameStatus(null); - setMapName(undefined); - setAdapter(null); - setLiveReady(false); - }, []); - - const listServers = useCallback(() => { - if (listInFlightRef.current) return; - listInFlightRef.current = true; - - const doList = () => { - relayRef.current?.sendWsPing(); - relayRef.current?.listServers(); - }; - - setServersLoading(true); - - if (relayRef.current?.connected) { - doList(); - } else { - // Connect first, then list once the socket opens. - pendingRef.current.push(doList); - if (!relayRef.current) { - connectRelay(); - } - } - }, [connectRelay]); - - const joinServer = useCallback((address: string) => { - if (!relayRef.current) return; - - // Set mapName from the cached server list immediately so the browser - // can start loading the mission before the relay even connects to the - // game server. - const cachedServer = servers.find((s) => s.address === address); - if (cachedServer?.mapName) { - setMapName(cachedServer.mapName); - } - - const newAdapter = new LiveStreamAdapter(relayRef.current); - newAdapter.onReady = () => setLiveReady(true); - adapterRef.current = newAdapter; - setLiveReady(false); - setGameStatus(null); - setAdapter(newAdapter); - - relayRef.current.joinServer(address); - }, [servers]); - - const disconnectServer = useCallback(() => { - relayRef.current?.disconnectServer(); - adapterRef.current?.reset(); - adapterRef.current = null; - setAdapter(null); - setLiveReady(false); - setGameStatus(null); - setMapName(undefined); - setRelayPing(null); - }, []); - - const sendMove = useCallback((move: ClientMove) => { - relayRef.current?.sendMove(move); - }, []); - - const sendCommand = useCallback((command: string, ...args: string[]) => { - relayRef.current?.sendCommand(command, args); - }, []); - - // Clean up on unmount. useEffect(() => { - return () => { - relayRef.current?.close(); - }; + return () => disposeLiveConnection(); }, []); - // Effective RTT = relay↔T2 RTT + browser↔relay RTT. - const ping = - relayPing != null && wsPing != null - ? relayPing + wsPing - : relayPing ?? null; - - const value: LiveConnectionState & LiveConnectionActions = { - relayConnected, - gameStatus, - gameStatusMessage, - mapName, - ping, - wsPing, - servers, - serversLoading, - adapter, - liveReady, - connectRelay, - disconnectRelay, - listServers, - joinServer, - disconnectServer, - sendMove, - sendCommand, - }; - - return ( - - {children} - - ); + return children; } diff --git a/src/components/LiveObserver.tsx b/src/components/LiveObserver.tsx index 4fddb1d0..d8c1cd0c 100644 --- a/src/components/LiveObserver.tsx +++ b/src/components/LiveObserver.tsx @@ -2,7 +2,7 @@ import { useRef, useEffect } from "react"; import { useFrame, useThree } from "@react-three/fiber"; import { Vector3 } from "three"; import { useKeyboardControls } from "@react-three/drei"; -import { useLiveConnection } from "./LiveConnection"; +import { useLiveSelector } from "../state/liveConnectionStore"; import { useEngineStoreApi } from "../state/engineStore"; import { streamPlaybackStore } from "../state/streamPlaybackStore"; import { Controls, MOUSE_SENSITIVITY, ARROW_LOOK_SPEED } from "./ObserverControls"; @@ -44,7 +44,9 @@ interface PredictionState { * Tribes 2 client works (predict locally, correct from server). */ export function LiveObserver() { - const { adapter, gameStatus, sendMove } = useLiveConnection(); + const adapter = useLiveSelector((s) => s.adapter); + const gameStatus = useLiveSelector((s) => s.gameStatus); + const sendMove = useLiveSelector((s) => s.sendMove); const store = useEngineStoreApi(); const { speedMultiplier } = useControls(); const activeAdapterRef = useRef(null); @@ -131,11 +133,13 @@ export function LiveObserver() { }; }, [gl.domElement]); - // Left-click when pointer-locked: enter follow mode (from fly) or cycle - // to next player (in follow). Capture phase intercepts before ObserverControls. + // Left-click when pointer-locked in follow mode: cycle to next player. + // Only intercepts in follow mode — in fly mode, clicks pass through to + // ObserverControls for pointer lock acquisition. useEffect(() => { const handleClick = (e: MouseEvent) => { if (!document.pointerLockElement || !activeAdapterRef.current) return; + if (activeAdapterRef.current.observerMode !== "follow") return; e.stopImmediatePropagation(); activeAdapterRef.current.cycleObserveNext(); }; @@ -209,8 +213,11 @@ export function LiveObserver() { // Reset sub-tick accumulator for interpolation. tickAccRef.current = 0; - // Scale movement axes by speed multiplier. Values > 1 still clamp to - // [-1, 1] server-side, but < 1 lets the user move slower. + // Always set trigger[1] (altTrigger) to enable the server's 2× speed mode + // (80 u/s max). We use altTrigger instead of trigger[0] (fire) because the + // Observer::onTrigger script interprets fire as "join team" / "cycle player" + // depending on camera mode, but altTrigger is unhandled in all observer modes. + // The C++ Camera::processTick checks `trigger[0] || trigger[1]` for fast mode. const speed = Math.min(1, speedMultiplier); sendMove({ x: mx * speed, @@ -219,13 +226,13 @@ export function LiveObserver() { yaw, pitch, roll: 0, - trigger: [false, false, false, false, false, false], + trigger: [false, true, false, false, false, false], freeLook: false, }); }); // Override camera rotation with predicted values at frame rate. - // Priority 1 ensures this runs AFTER DemoPlaybackController (priority 0), + // Priority 1 ensures this runs AFTER StreamingController (priority 0), // which handles position from server snapshots. useFrame((state, delta) => { if (!activeAdapterRef.current || gameStatus !== "connected") return; @@ -298,7 +305,11 @@ export function LiveObserver() { const cx = Math.cos(interpPitch); const sz = Math.sin(interpYaw); const cz = Math.cos(interpYaw); - _orbitDir.set(-cx, -sz * sx, -cz * sx); + // Camera pulls back along negative forward direction (Torque column 1 + // of Rz*Rx, converted to Three.js coords). + // Torque forward = (-sz*cx, cz*cx, sx) → Three.js = (cz*cx, sx, -sz*cx) + // Negate for pull-back: (-cz*cx, -sx, sz*cx) + _orbitDir.set(-cz * cx, -sx, sz * cx); if (_orbitDir.lengthSq() > 1e-8) { _orbitDir.normalize(); @@ -309,10 +320,10 @@ export function LiveObserver() { } } else { // Observer fly or first-person: override rotation only (position comes - // from DemoPlaybackController's server snapshot interpolation). + // from StreamingController's server snapshot interpolation). state.camera.quaternion.set(qx, qy, qz, qw); } - }); + }, 1); // Clean up on unmount. useEffect(() => { diff --git a/src/components/ObserverControls.tsx b/src/components/ObserverControls.tsx index 2994ccc4..d9d1fcf7 100644 --- a/src/components/ObserverControls.tsx +++ b/src/components/ObserverControls.tsx @@ -180,7 +180,7 @@ function CameraMovement() { useFrame((state, delta) => { // When streaming is active and not in free-fly mode, the stream - // (DemoPlaybackController) drives the camera — skip our movement. + // (StreamingController) drives the camera — skip our movement. const spState = streamPlaybackStore.getState(); if (spState.playback && !spState.freeFlyCamera) return; diff --git a/src/components/PlayerHUD.module.css b/src/components/PlayerHUD.module.css index e43e0f4b..d3b56b6f 100644 --- a/src/components/PlayerHUD.module.css +++ b/src/components/PlayerHUD.module.css @@ -89,35 +89,94 @@ /* ── Chat Window (top-left) ── */ -.ChatWindow { +.ChatContainer { position: absolute; top: 56px; left: 0; max-width: 420px; + display: flex; + flex-direction: column; + pointer-events: auto; + border: 1px solid rgba(44, 172, 181, 0.4); +} + +.ChatWindow { + max-width: 450px; + max-height: 12.5em; + overflow-y: auto; background: rgba(0, 50, 60, 0.65); - padding: 4px 8px; + padding: 6px 8px; + user-select: text; font-size: 12px; - line-height: 1.3; + line-height: 1.333333; + /* Thin scrollbar that doesn't take much space. */ + scrollbar-width: thin; + scrollbar-color: rgba(44, 172, 181, 0.4) transparent; } .ChatMessage { padding: 1px 0; - transition: opacity 0.3s ease-out; /* Default to \c0 (GuiChatHudProfile fontColor) for untagged messages. */ color: rgb(44, 172, 181); } +.ChatInputForm { + display: flex; +} + +.ChatInput { + width: 100%; + background: rgba(0, 50, 60, 0.8); + border: 0; + border-top: 1px solid rgba(78, 179, 167, 0.2); + border-radius: 0; + color: rgb(40, 231, 240); + font-family: inherit; + font-size: 12px; + margin: 0; + padding: 6px 8px; + outline: none; +} + +.ChatInput::placeholder { + color: rgba(44, 172, 181, 0.5); +} + +.ChatInput:focus { + background: rgba(0, 50, 60, 0.9); +} + /* T2 GuiChatHudProfile fontColors palette (\c0–\c9). */ -.ChatColor0 { color: rgb(44, 172, 181); } -.ChatColor1 { color: rgb(4, 235, 105); } -.ChatColor2 { color: rgb(219, 200, 128); } -.ChatColor3 { color: rgb(77, 253, 95); } -.ChatColor4 { color: rgb(40, 231, 240); } -.ChatColor5 { color: rgb(200, 200, 50); } -.ChatColor6 { color: rgb(200, 200, 200); } -.ChatColor7 { color: rgb(220, 220, 20); } -.ChatColor8 { color: rgb(150, 150, 250); } -.ChatColor9 { color: rgb(60, 220, 150); } +.ChatColor0 { + color: rgb(44, 172, 181); +} +.ChatColor1 { + color: rgb(4, 235, 105); +} +.ChatColor2 { + color: rgb(219, 200, 128); +} +.ChatColor3 { + color: rgb(77, 253, 95); +} +.ChatColor4 { + color: rgb(40, 231, 240); +} +.ChatColor5 { + color: rgb(200, 200, 50); +} +.ChatColor6 { + color: rgb(200, 200, 200); +} +.ChatColor7 { + color: rgb(220, 220, 20); +} +.ChatColor8 { + color: rgb(150, 150, 250); +} +.ChatColor9 { + color: rgb(60, 220, 150); +} /* ── Team Scores (bottom-left) ── */ diff --git a/src/components/PlayerHUD.tsx b/src/components/PlayerHUD.tsx index 6589e83e..8652111d 100644 --- a/src/components/PlayerHUD.tsx +++ b/src/components/PlayerHUD.tsx @@ -1,6 +1,8 @@ +import { useRef, useEffect, useState, useCallback } from "react"; import { useRecording } from "./RecordingProvider"; import { useEngineSelector } from "../state"; import { textureToUrl } from "../loaders"; +import { liveConnectionStore } from "../state/liveConnectionStore"; import type { ChatSegment, ChatMessage, @@ -266,50 +268,72 @@ function chatColorClass(msg: ChatMessage): string { // byte color code, so the correct default for server messages is c0. return CHAT_COLOR_CLASSES[0]; } -function ChatWindow() { +function ChatWindow({ isLive }: { isLive: boolean }) { const messages = useEngineSelector( (state) => state.playback.streamSnapshot?.chatMessages, ); - const timeSec = useEngineSelector( - (state) => state.playback.streamSnapshot?.timeSec, + const scrollRef = useRef(null); + const prevCountRef = useRef(0); + const [chatText, setChatText] = useState(""); + + // Auto-scroll to bottom when new messages arrive. + const msgCount = messages?.length ?? 0; + useEffect(() => { + if (msgCount > prevCountRef.current && scrollRef.current) { + scrollRef.current.scrollTop = scrollRef.current.scrollHeight; + } + prevCountRef.current = msgCount; + }, [msgCount]); + + const handleSubmit = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); + const text = chatText.trim(); + if (!text) return; + liveConnectionStore.getState().sendCommand("messageSent", text); + setChatText(""); + }, + [chatText], ); - if (!messages || !messages.length || timeSec == null) return null; - const fadeStart = 6; - const fadeDuration = 1.5; - const cutoff = timeSec - (fadeStart + fadeDuration); - const visible = messages.filter( - (m: ChatMessage) => m.timeSec > cutoff && m.text.trim() !== "", - ); - if (!visible.length) return null; + + const hasMessages = !!messages?.length; + return ( -
- {visible.map((msg: ChatMessage, i: number) => { - const age = timeSec - msg.timeSec; - const opacity = - age <= fadeStart - ? 1 - : Math.max(0, 1 - (age - fadeStart) / fadeDuration); - return ( -
- {msg.segments ? ( - msg.segments.map((seg: ChatSegment, j: number) => ( - - {seg.text} +
+ {hasMessages && ( +
+ {messages!.map((msg: ChatMessage, i: number) => ( +
+ {msg.segments ? ( + msg.segments.map((seg: ChatSegment, j: number) => ( + + {seg.text} + + )) + ) : ( + + {msg.sender ? `${msg.sender}: ` : ""} + {msg.text} - )) - ) : ( - - {msg.sender ? `${msg.sender}: ` : ""} - {msg.text} - - )} -
- ); - })} + )} +
+ ))} +
+ )} + {isLive && ( +
+ setChatText(e.target.value)} + onKeyDown={(e) => e.stopPropagation()} + onKeyUp={(e) => e.stopPropagation()} + maxLength={255} + /> +
+ )}
); } @@ -434,28 +458,31 @@ function PackAndInventoryHUD() { ); } // ── Main HUD ── -export function PlayerHUD() { +export function PlayerHUD({ isLive = false }: { isLive?: boolean } = {}) { const recording = useRecording(); const streamSnapshot = useEngineSelector( (state) => state.playback.streamSnapshot, ); - if (!recording) return null; + if (!recording && !isLive) return null; const status = streamSnapshot?.status; - if (!status) return null; return (
- -
-
- - -
- -
- - - - + + {status && ( + <> +
+
+ + +
+ +
+ + + + + + )}
); } diff --git a/src/components/PlayerModel.tsx b/src/components/PlayerModel.tsx index 1233c515..ebb8fc22 100644 --- a/src/components/PlayerModel.tsx +++ b/src/components/PlayerModel.tsx @@ -56,11 +56,11 @@ function getArmThread(weaponShape: string | undefined): string { return "lookde"; } -/** Number of table actions in the engine's ActionAnimationList. */ -const NUM_TABLE_ACTION_ANIMS = 7; +/** Number of table actions in the engine's ActionAnimationList (Tribes2.exe build 25034). */ +const NUM_TABLE_ACTION_ANIMS = 8; -/** Table action names in engine order (indices 0-6). */ -const TABLE_ACTION_NAMES = ["root", "run", "back", "side", "fall", "jump", "land"]; +/** Table action names in engine order (indices 0-7). */ +const TABLE_ACTION_NAMES = ["root", "run", "back", "side", "fall", "jet", "jump", "land"]; interface ActionAnimEntry { @@ -75,8 +75,8 @@ interface ActionAnimEntry { * TSShapeConstructor's sequence entries (e.g. `"heavy_male_root.dsq root"`). * * The engine builds its action list as: - * 1. Table actions (0-6): found by searching for aliased names (root, run, etc.) - * 2. Non-table actions (7+): remaining sequences in TSShapeConstructor order. + * 1. Table actions (0-7): found by searching for aliased names (root, run, etc.) + * 2. Non-table actions (8+): remaining sequences in TSShapeConstructor order. */ function buildActionAnimMap( sequences: string[], @@ -157,8 +157,8 @@ export function PlayerModel({ entity }: { entity: PlayerEntity }) { : undefined; }); - // Clone scene preserving skeleton bindings, create mixer, find Mount0 bone. - const { clonedScene, mixer, mount0, iflInitializers } = useMemo(() => { + // Clone scene preserving skeleton bindings, create mixer, find mount bones. + const { clonedScene, mixer, mount0, mount1, iflInitializers } = useMemo(() => { const scene = SkeletonUtils.clone(gltf.scene) as Group; const iflInits = processShapeScene(scene); @@ -174,11 +174,13 @@ export function PlayerModel({ entity }: { entity: PlayerEntity }) { const mix = new AnimationMixer(scene); let m0: Object3D | null = null; + let m1: Object3D | null = null; scene.traverse((n) => { if (!m0 && n.name === "Mount0") m0 = n; + if (!m1 && n.name === "Mount1") m1 = n; }); - return { clonedScene: scene, mixer: mix, mount0: m0, iflInitializers: iflInits }; + return { clonedScene: scene, mixer: mix, mount0: m0, mount1: m1, iflInitializers: iflInits }; }, [gltf]); // Build case-insensitive clip lookup with alias support. @@ -314,6 +316,8 @@ export function PlayerModel({ entity }: { entity: PlayerEntity }) { const [currentWeaponShape, setCurrentWeaponShape] = useState( entity.weaponShape, ); + const packShapeRef = useRef(entity.packShape); + const [currentPackShape, setCurrentPackShape] = useState(entity.packShape); // Per-frame animation selection and mixer update. useFrame((_, delta) => { @@ -321,6 +325,10 @@ export function PlayerModel({ entity }: { entity: PlayerEntity }) { weaponShapeRef.current = entity.weaponShape; setCurrentWeaponShape(entity.weaponShape); } + if (entity.packShape !== packShapeRef.current) { + packShapeRef.current = entity.packShape; + setCurrentPackShape(entity.packShape); + } const playback = engineStore.getState().playback; const isPlaying = playback.status === "playing"; const time = streamPlaybackStore.getState().time; @@ -430,6 +438,8 @@ export function PlayerModel({ entity }: { entity: PlayerEntity }) { const anim = pickMoveAnimation( kf?.velocity, kf?.rotation ?? [0, 0, 0, 1], + entity.falling, + entity.jetting, ); const prev = currentAnimRef.current; @@ -518,6 +528,16 @@ export function PlayerModel({ entity }: { entity: PlayerEntity }) { )} + {currentPackShape && mount1 && ( + + + + + + )} ); } @@ -896,6 +916,61 @@ function applyWeaponAnim( } } +/** + * Attaches a pack shape to the player's Mount1 bone. Packs are static + * mounted images (no state machine or animation) — just positioned via + * the pack shape's Mountpoint node inverse offset, same as weapons. + */ +function MountedPackModel({ + packShape, + mountBone, +}: { + packShape: string; + mountBone: Object3D; +}) { + const packGltf = useStaticShape(packShape); + + const { packClone, packIflInitializers } = useMemo(() => { + const clone = SkeletonUtils.clone(packGltf.scene) as Group; + const iflInits = processShapeScene(clone); + + // Compute Mountpoint inverse offset so the pack aligns to Mount1. + const mp = getPosedNodeTransform( + packGltf.scene, + packGltf.animations, + "Mountpoint", + ); + if (mp) { + const invQuat = mp.quaternion.clone().invert(); + const invPos = mp.position.clone().negate().applyQuaternion(invQuat); + clone.position.copy(invPos); + clone.quaternion.copy(invQuat); + } + + return { packClone: clone, packIflInitializers: iflInits }; + }, [packGltf]); + + useEffect(() => { + mountBone.add(packClone); + return () => { + mountBone.remove(packClone); + }; + }, [packClone, mountBone]); + + // Initialize IFL materials (animated texture sequences). + useEffect(() => { + const cleanups: (() => void)[] = []; + for (const { mesh, initialize } of packIflInitializers) { + initialize(mesh, () => streamPlaybackStore.getState().time) + .then((dispose) => cleanups.push(dispose)) + .catch(() => {}); + } + return () => cleanups.forEach((fn) => fn()); + }, [packIflInitializers]); + + return null; +} + /** * Extracts the eye offset from a player model's Eye bone in the idle ("Root" * animation) pose. The Eye node is a child of "Bip01 Head" in the skeleton diff --git a/src/components/PlayerNameplate.tsx b/src/components/PlayerNameplate.tsx index 94bda529..4442ca04 100644 --- a/src/components/PlayerNameplate.tsx +++ b/src/components/PlayerNameplate.tsx @@ -36,16 +36,7 @@ export function PlayerNameplate({ entity }: { entity: PlayerEntity }) { const fillRef = useRef(null); const iffImgRef = useRef(null); const [isVisible, setIsVisible] = useState(true); - - const displayName = useMemo(() => { - if (entity.playerName) return entity.playerName; - if (typeof entity.id === "string") { - const m = entity.id.match(/\d+/); - if (m) return ``; - return entity.id; - } - return ""; - }, [entity.id, entity.playerName]); + const nameRef = useRef(null); // Derive IFF height from the shape's bounding box. const iffHeight = useMemo(() => { @@ -106,6 +97,15 @@ export function PlayerNameplate({ entity }: { entity: PlayerEntity }) { nameContainerRef.current.style.opacity = opacityStr; } + // Update player name imperatively — entity.playerName is mutated in-place + // by streaming playback without triggering re-renders. + if (nameRef.current) { + const name = entity.playerName ?? entity.id; + if (nameRef.current.textContent !== name) { + nameRef.current.textContent = name; + } + } + // Update IFF arrow image imperatively — entity.iffColor is mutated in-place // by streaming playback without triggering re-renders. if (iffImgRef.current && entity.iffColor) { @@ -148,7 +148,9 @@ export function PlayerNameplate({ entity }: { entity: PlayerEntity }) {
-
{displayName}
+
+ {entity.playerName ?? entity.id} +
{hasHealthData && (
diff --git a/src/components/ServerBrowser.module.css b/src/components/ServerBrowser.module.css index 35ceed52..f78ee271 100644 --- a/src/components/ServerBrowser.module.css +++ b/src/components/ServerBrowser.module.css @@ -147,16 +147,49 @@ .JoinButton { composes: DialogButton from "./DialogButton.module.css"; + min-width: 100px; } .CloseButton { composes: Secondary from "./DialogButton.module.css"; } +.WarriorField { + display: flex; + align-items: center; + gap: 8px; +} + +.WarriorLabel { + font-size: 12px; + color: rgba(125, 255, 255, 0.6); + font-weight: 500; +} + +.WarriorInput { + width: 130px; + padding: 4px 6px; + background: rgba(0, 50, 60, 0.8); + border: 1px solid rgba(65, 131, 139, 0.5); + border-radius: 2px; + color: #b0d5c9; + font-family: inherit; + font-size: 13px; + outline: none; +} + +.WarriorInput:focus { + border-color: rgba(125, 255, 255, 0.6); +} + +.WarriorInput::placeholder { + color: rgba(201, 220, 216, 0.3); +} + .Hint { font-size: 12px; color: rgba(201, 220, 216, 0.3); - margin-left: auto; + margin: 0 auto; } @media (max-width: 719px) { diff --git a/src/components/ServerBrowser.tsx b/src/components/ServerBrowser.tsx index 456386bd..4894e6e6 100644 --- a/src/components/ServerBrowser.tsx +++ b/src/components/ServerBrowser.tsx @@ -9,6 +9,8 @@ export function ServerBrowser({ onRefresh, onJoin, wsPing, + warriorName, + onWarriorNameChange, }: { open: boolean; onClose: () => void; @@ -18,6 +20,8 @@ export function ServerBrowser({ onJoin: (address: string) => void; /** Browser↔relay RTT to add to server pings for effective latency. */ wsPing?: number | null; + warriorName: string; + onWarriorNameChange: (name: string) => void; }) { const [selectedAddress, setSelectedAddress] = useState(null); const [sortKey, setSortKey] = useState("ping"); @@ -176,6 +180,24 @@ export function ServerBrowser({
+
+ + onWarriorNameChange(e.target.value)} + placeholder="Name thyself…" + maxLength={24} + /> +
+ Double-click a server to join + - - Double-click a server to join
diff --git a/src/components/SettingsProvider.tsx b/src/components/SettingsProvider.tsx index fed26617..7feb003f 100644 --- a/src/components/SettingsProvider.tsx +++ b/src/components/SettingsProvider.tsx @@ -25,6 +25,8 @@ type SettingsContext = { setAudioEnabled: StateSetter; animationEnabled: boolean; setAnimationEnabled: StateSetter; + warriorName: string; + setWarriorName: StateSetter; }; type DebugContext = { @@ -52,6 +54,7 @@ type PersistedSettings = { animationEnabled?: boolean; debugMode?: boolean; touchMode?: TouchMode; + warriorName?: string; }; export function useSettings() { @@ -83,6 +86,7 @@ export function SettingsProvider({ const [animationEnabled, setAnimationEnabled] = useState(true); const [debugMode, setDebugMode] = useState(false); const [touchMode, setTouchMode] = useState("moveLookStick"); + const [warriorName, setWarriorName] = useState("MapGenius"); const setFogEnabledWithoutOverride: StateSetter = useCallback( (value) => { @@ -104,6 +108,8 @@ export function SettingsProvider({ setAudioEnabled, animationEnabled, setAnimationEnabled, + warriorName, + setWarriorName, }), [ fogEnabled, @@ -113,6 +119,7 @@ export function SettingsProvider({ fov, audioEnabled, animationEnabled, + warriorName, ], ); @@ -158,6 +165,9 @@ export function SettingsProvider({ if (savedSettings.touchMode != null) { setTouchMode(savedSettings.touchMode); } + if (savedSettings.warriorName != null) { + setWarriorName(savedSettings.warriorName); + } }, []); // Persist settings to localStorage with debouncing to avoid excessive writes @@ -180,6 +190,7 @@ export function SettingsProvider({ animationEnabled, debugMode, touchMode, + warriorName, }; try { localStorage.setItem("settings", JSON.stringify(settingsToSave)); @@ -202,6 +213,7 @@ export function SettingsProvider({ animationEnabled, debugMode, touchMode, + warriorName, ]); return ( diff --git a/src/components/StreamPlayback.tsx b/src/components/StreamPlayback.tsx new file mode 100644 index 00000000..d6fb55f6 --- /dev/null +++ b/src/components/StreamPlayback.tsx @@ -0,0 +1,9 @@ +import { useRecording } from "./RecordingProvider"; +import { StreamingController } from "./StreamingController"; + +export function StreamPlayback() { + const recording = useRecording(); + + if (!recording) return null; + return ; +} diff --git a/src/components/DemoPlaybackController.tsx b/src/components/StreamingController.tsx similarity index 93% rename from src/components/DemoPlaybackController.tsx rename to src/components/StreamingController.tsx index 3600ddff..b20590a5 100644 --- a/src/components/DemoPlaybackController.tsx +++ b/src/components/StreamingController.tsx @@ -48,6 +48,9 @@ function mutateRenderFields( const e = renderEntity as unknown as Record; e.threads = stream.threads; e.weaponShape = stream.weaponShape; + e.packShape = stream.packShape; + e.falling = stream.falling; + e.jetting = stream.jetting; e.weaponImageState = stream.weaponImageState; e.weaponImageStates = stream.weaponImageStates; e.playerName = stream.playerName; @@ -96,7 +99,7 @@ const _orbitDir = new Vector3(); const _orbitTarget = new Vector3(); const _orbitCandidate = new Vector3(); -export function DemoPlaybackController({ recording }: { recording: StreamRecording }) { +export function StreamingController({ recording }: { recording: StreamRecording }) { const engineStore = useEngineStoreApi(); const playbackClockRef = useRef(0); const prevTickSnapshotRef = useRef(null); @@ -235,7 +238,13 @@ export function DemoPlaybackController({ recording }: { recording: StreamRecordi return; } - stream.reset(); + // Reset the stream cursor for demo playback (replay from the beginning). + // For live streams, skip reset — the adapter is already receiving packets + // and has accumulated protocol state (net strings, target info, sensor + // group colors) that the server won't re-send. + if (recording.source !== "live") { + stream.reset(); + } // Preload weapon effect shapes (explosions) so they're cached before // the first projectile detonates -- otherwise the GLB fetch latency // causes the short-lived explosion entity to expire before it renders. @@ -354,7 +363,7 @@ export function DemoPlaybackController({ recording }: { recording: StreamRecordi // ObserverControls drives the camera instead. const freeFly = streamPlaybackStore.getState().freeFlyCamera; // In live mode, LiveObserver owns camera rotation (client-side prediction). - // DemoPlaybackController still handles position, FOV, and entity interpolation. + // StreamingController still handles position, FOV, and entity interpolation. const isLive = recording.source === "live"; if (currentCamera && !freeFly) { @@ -388,7 +397,6 @@ export function DemoPlaybackController({ recording }: { recording: StreamRecordi } if ( - !isLive && Number.isFinite(currentCamera.fov) && "isPerspectiveCamera" in state.camera && (state.camera as any).isPerspectiveCamera @@ -476,6 +484,8 @@ export function DemoPlaybackController({ recording }: { recording: StreamRecordi } const mode = currentCamera?.mode; + // In live mode, LiveObserver handles orbit positioning from predicted + // angles so the orbit responds at frame rate. Skip here to avoid fighting. if (!freeFly && !isLive && mode === "third-person" && root && currentCamera?.orbitTargetId) { const targetGroup = root.children.find( (child) => child.name === currentCamera.orbitTargetId, @@ -490,7 +500,16 @@ export function DemoPlaybackController({ recording }: { recording: StreamRecordi } let hasDirection = false; - if ( + if (currentCamera.orbitDirection) { + // Use explicit pullback direction (e.g. from full vehicle quaternion + // including roll) when available. + _orbitDir.set( + currentCamera.orbitDirection[0], + currentCamera.orbitDirection[1], + currentCamera.orbitDirection[2], + ); + hasDirection = _orbitDir.lengthSq() > 1e-8; + } else if ( typeof currentCamera.yaw === "number" && typeof currentCamera.pitch === "number" ) { @@ -498,10 +517,10 @@ export function DemoPlaybackController({ recording }: { recording: StreamRecordi const cx = Math.cos(currentCamera.pitch); const sz = Math.sin(currentCamera.yaw); const cz = Math.cos(currentCamera.yaw); - // Camera::validateEyePoint uses Camera::setPosition's column1 in - // Torque space as the orbit pull-back direction. Converted to Three, - // that target->camera vector is (-cx, -sz*sx, -cz*sx). - _orbitDir.set(-cx, -sz * sx, -cz * sx); + // Pull back behind the model. playerYawToQuaternion uses Ry(-yaw), + // so model forward in Three.js is (cz, 0, sz) at pitch=0. + // Behind = (-cz*cx, -sx, -sz*cx). + _orbitDir.set(-cz * cx, -sx, -sz * cx); hasDirection = _orbitDir.lengthSq() > 1e-8; } if (!hasDirection) { diff --git a/src/state/engineStore.ts b/src/state/engineStore.ts index 8b58e3a9..7f74a5c6 100644 --- a/src/state/engineStore.ts +++ b/src/state/engineStore.ts @@ -311,7 +311,7 @@ export const engineStore = createStore()( // Components use effectNow() instead of performance.now() so that effect // timers (explosions, particles, shockwaves, animation threads) automatically // pause when the demo is paused and speed up / slow down with the playback -// rate. The DemoPlaybackController component calls advanceEffectClock() +// rate. The StreamingController component calls advanceEffectClock() // once per frame. let _effectClockMs = 0; @@ -327,7 +327,7 @@ export function effectNow(): number { /** * Advance the effect clock. Called once per frame from - * DemoPlaybackController before other useFrame callbacks run. + * StreamingController before other useFrame callbacks run. */ export function advanceEffectClock(deltaSec: number, rate: number): void { _effectClockMs += deltaSec * rate * 1000; diff --git a/src/state/gameEntityTypes.ts b/src/state/gameEntityTypes.ts index e5ac698f..98c7b9f7 100644 --- a/src/state/gameEntityTypes.ts +++ b/src/state/gameEntityTypes.ts @@ -139,6 +139,9 @@ export interface PlayerEntity extends PositionedBase { shapeName?: string; dataBlock?: string; weaponShape?: string; + packShape?: string; + falling?: boolean; + jetting?: boolean; playerName?: string; iffColor?: { r: number; g: number; b: number }; threads?: ThreadState[]; diff --git a/src/state/liveConnectionStore.ts b/src/state/liveConnectionStore.ts new file mode 100644 index 00000000..38f72334 --- /dev/null +++ b/src/state/liveConnectionStore.ts @@ -0,0 +1,249 @@ +import { createStore } from "zustand/vanilla"; +import { useStoreWithEqualityFn } from "zustand/traditional"; +import { RelayClient } from "../stream/relayClient"; +import { LiveStreamAdapter } from "../stream/liveStreaming"; +import type { + ClientMove, + ServerInfo, + ConnectionStatus, +} from "../../relay/types"; + +export interface LiveConnectionState { + relayConnected: boolean; + gameStatus: ConnectionStatus | null; + gameStatusMessage?: string; + /** Map name from the server being joined (from GameInfoResponse or status). */ + mapName?: string; + /** Display name of the joined server. */ + serverName?: string; + /** Relay↔T2 server RTT in ms. */ + relayToGameServerPing: number | null; + /** Browser↔relay WebSocket RTT in ms. */ + browserToRelayPing: number | null; + servers: ServerInfo[]; + serversLoading: boolean; + adapter: LiveStreamAdapter | null; + /** True once the first ghost entity arrives (game is rendering). */ + liveReady: boolean; +} + +export interface LiveConnectionStore extends LiveConnectionState { + // Non-reactive refs. + _relay: RelayClient | null; + _adapter: LiveStreamAdapter | null; + _pending: Array<() => void>; + _listInFlight: boolean; + + connectRelay(url?: string): void; + disconnectRelay(): void; + listServers(): void; + joinServer(address: string, warriorName?: string): void; + disconnectServer(): void; + sendMove(move: ClientMove): void; + sendCommand(command: string, ...args: string[]): void; +} + +const DEFAULT_RELAY_URL = + process.env.NEXT_PUBLIC_RELAY_URL || "ws://localhost:8765"; + +export const liveConnectionStore = createStore( + (set, get) => ({ + relayConnected: false, + gameStatus: null, + gameStatusMessage: undefined, + mapName: undefined, + serverName: undefined, + relayToGameServerPing: null, + browserToRelayPing: null, + servers: [], + serversLoading: false, + adapter: null, + liveReady: false, + + _relay: null, + _adapter: null, + _pending: [], + _listInFlight: false, + + connectRelay(url = DEFAULT_RELAY_URL) { + const s = get(); + if (s._relay) { + s._relay.close(); + } + + const relay = new RelayClient(url, { + onOpen() { + set({ relayConnected: true }); + const s = get(); + for (const fn of s._pending) fn(); + s._pending = []; + }, + onStatus(status, message, _connectSequence, statusMapName) { + console.log( + `[relay] game status: ${status}${message ? ` — ${message}` : ""}${statusMapName ? ` map=${statusMapName}` : ""}`, + ); + set({ + gameStatus: status, + gameStatusMessage: message, + ...(statusMapName ? { mapName: statusMapName } : {}), + }); + }, + onServerList(list) { + get()._listInFlight = false; + set({ servers: list, serversLoading: false }); + }, + onGamePacket(data) { + const a = get()._adapter; + if (!a) { + console.warn( + "[relay] received game packet but no adapter is active", + ); + } + a?.feedPacket(data); + }, + onPing(ms) { + set({ relayToGameServerPing: ms }); + }, + onWsPing(ms) { + set({ browserToRelayPing: ms }); + }, + onError(message) { + console.error("Relay error:", message); + get()._listInFlight = false; + set({ serversLoading: false }); + }, + onClose() { + const s = get(); + if (s._relay === relay) { + s._relay = null; + s._adapter = null; + s._pending = []; + s._listInFlight = false; + set({ + relayConnected: false, + gameStatus: null, + gameStatusMessage: undefined, + mapName: undefined, + serverName: undefined, + relayToGameServerPing: null, + browserToRelayPing: null, + adapter: null, + liveReady: false, + }); + } + }, + }); + + relay.connect(); + get()._relay = relay; + }, + + disconnectRelay() { + const s = get(); + s._relay?.close(); + s._relay = null; + s._adapter = null; + s._pending = []; + s._listInFlight = false; + set({ + relayConnected: false, + gameStatus: null, + gameStatusMessage: undefined, + mapName: undefined, + serverName: undefined, + relayToGameServerPing: null, + browserToRelayPing: null, + adapter: null, + liveReady: false, + }); + }, + + listServers() { + const s = get(); + if (s._listInFlight) return; + s._listInFlight = true; + + const doList = () => { + const s = get(); + s._relay?.sendWsPing(); + s._relay?.listServers(); + }; + + set({ serversLoading: true }); + + if (s._relay?.connected) { + doList(); + } else { + s._pending.push(doList); + if (!s._relay) { + get().connectRelay(); + } + } + }, + + joinServer(address, warriorName) { + const s = get(); + if (!s._relay) return; + + const cachedServer = s.servers.find((sv) => sv.address === address); + const newAdapter = new LiveStreamAdapter(s._relay); + newAdapter.onReady = () => set({ liveReady: true }); + s._adapter = newAdapter; + + set({ + mapName: cachedServer?.mapName ?? s.mapName, + serverName: cachedServer?.name, + liveReady: false, + gameStatus: null, + adapter: newAdapter, + }); + + s._relay.joinServer(address, warriorName); + }, + + disconnectServer() { + const s = get(); + s._relay?.disconnectServer(); + s._adapter?.reset(); + s._adapter = null; + set({ + adapter: null, + liveReady: false, + gameStatus: null, + mapName: undefined, + serverName: undefined, + relayToGameServerPing: null, + }); + }, + + sendMove(move) { + get()._relay?.sendMove(move); + }, + + sendCommand(command, ...args) { + get()._relay?.sendCommand(command, args); + }, + }), +); + +/** Select state from the live connection store with optional equality fn. */ +export function useLiveSelector( + selector: (state: LiveConnectionStore) => T, + equality?: (a: T, b: T) => boolean, +): T { + return useStoreWithEqualityFn(liveConnectionStore, selector, equality); +} + +/** Effective RTT to the game server (relay↔T2 + browser↔relay). */ +export function selectPing(s: LiveConnectionStore): number | null { + return s.relayToGameServerPing != null && s.browserToRelayPing != null + ? s.relayToGameServerPing + s.browserToRelayPing + : s.relayToGameServerPing ?? null; +} + +/** Dispose the relay connection (for cleanup on unmount). */ +export function disposeLiveConnection(): void { + const s = liveConnectionStore.getState(); + s._relay?.close(); + s._relay = null; +} diff --git a/src/stream/StreamEngine.ts b/src/stream/StreamEngine.ts index b2036f7f..27b0681c 100644 --- a/src/stream/StreamEngine.ts +++ b/src/stream/StreamEngine.ts @@ -18,6 +18,8 @@ import { yawPitchToQuaternion, playerYawToQuaternion, torqueQuatToThreeJS, + torqueQuatHeading, + torqueQuatPitch, isValidPosition, isVec3Like, isQuatLike, @@ -94,6 +96,9 @@ export interface MutableEntity { weaponImageState?: WeaponImageState; weaponImageStates?: WeaponImageDataBlockState[]; weaponImageStatesDbId?: number; + packShape?: string; + falling?: boolean; + jetting?: boolean; headPitch?: number; headYaw?: number; targetRenderFlags?: number; @@ -158,6 +163,7 @@ export abstract class StreamEngine implements StreamingPlayback { // ── Chat & audio ── protected chatMessages: ChatMessage[] = []; + protected chatMessageIdCounter = 0; protected audioEvents: PendingAudioEvent[] = []; // ── Net strings ── @@ -181,6 +187,17 @@ export abstract class StreamEngine implements StreamingPlayback { protected controlPlayerGhostId?: string; protected lastControlType: "camera" | "player" = "camera"; protected isPiloting = false; + protected lastPilotGhostIndex?: number; + protected lastVehicleHeading = 0; + protected lastVehiclePitch = 0; + protected lastVehicleOrbitDir?: [number, number, number]; + /** Vehicle velocity in Torque space (estimated from linMomentum/mass). */ + protected lastVehicleVelocity?: [number, number, number]; + /** Time (sec) of last vehicle position update from controlObjectData. */ + protected lastVehiclePosTime = 0; + /** Last known vehicle position in Torque space for extrapolation. */ + protected lastVehiclePos?: [number, number, number]; + protected firstPerson = true; protected lastCameraMode?: number; protected lastOrbitGhostIndex?: number; protected lastOrbitDistance?: number; @@ -267,6 +284,7 @@ export abstract class StreamEngine implements StreamingPlayback { this.tickCount = 0; this.camera = null; this.chatMessages = []; + this.chatMessageIdCounter = 0; this.audioEvents = []; this.netStrings.clear(); this.targetNames.clear(); @@ -279,6 +297,14 @@ export abstract class StreamEngine implements StreamingPlayback { this.controlPlayerGhostId = undefined; this.lastControlType = "camera"; this.isPiloting = false; + this.lastPilotGhostIndex = undefined; + this.lastVehicleHeading = 0; + this.lastVehiclePitch = 0; + this.lastVehicleOrbitDir = undefined; + this.lastVehicleVelocity = undefined; + this.lastVehiclePosTime = 0; + this.lastVehiclePos = undefined; + this.firstPerson = true; this.lastCameraMode = undefined; this.lastOrbitGhostIndex = undefined; this.lastOrbitDistance = undefined; @@ -359,6 +385,17 @@ export abstract class StreamEngine implements StreamingPlayback { this.isPiloting = !!( controlData.pilot || controlData.controlObjectGhost != null ); + if (this.isPiloting && typeof controlData.controlObjectGhost === "number") { + this.lastPilotGhostIndex = controlData.controlObjectGhost; + } else if (!this.isPiloting) { + this.lastPilotGhostIndex = undefined; + this.lastVehicleHeading = 0; + this.lastVehiclePitch = 0; + this.lastVehicleOrbitDir = undefined; + this.lastVehicleVelocity = undefined; + this.lastVehiclePosTime = 0; + this.lastVehiclePos = undefined; + } } else { this.isPiloting = false; if (typeof controlData.cameraMode === "number") { @@ -772,6 +809,9 @@ export abstract class StreamEngine implements StreamingPlayback { entity.sensorGroup = undefined; entity.playerName = undefined; entity.weaponShape = undefined; + entity.packShape = undefined; + entity.falling = undefined; + entity.jetting = undefined; entity.weaponImageState = undefined; entity.weaponImageStates = undefined; entity.weaponImageStatesDbId = undefined; @@ -903,6 +943,18 @@ export abstract class StreamEngine implements StreamingPlayback { entity.weaponImageStates = undefined; } + // Pack image (slot 2 = $BackpackSlot, mountPoint 1 = Mount1) + const packImage = images.find((img) => img.index === 2); + if (packImage?.dataBlockId && packImage.dataBlockId > 0) { + const blockData = this.getDataBlockData(packImage.dataBlockId); + const shape = resolveShapeName("ShapeBaseImageData", blockData); + if (shape) { + entity.packShape = shape; + } + } else if (packImage && !packImage.dataBlockId) { + entity.packShape = undefined; + } + // Flag tracking const flagImage = images.find((img) => img.index === 3); if (flagImage) { @@ -1003,6 +1055,10 @@ export abstract class StreamEngine implements StreamingPlayback { } } + // Movement state flags (from Player MoveMask ghost data). + if (typeof data.moveFlag0 === "boolean") entity.falling = data.moveFlag0; + if (typeof data.moveFlag1 === "boolean") entity.jetting = data.moveFlag1; + // Item physics: when the server sends a position update with // atRest=false and a velocity, start client-side physics simulation. if (entity.type === "Item") { @@ -1439,7 +1495,45 @@ export abstract class StreamEngine implements StreamingPlayback { this.removeExpiredExplosions(); if (control.position) { - const { yaw, pitch } = this.getCameraYawPitch(data); + let { yaw, pitch } = this.getCameraYawPitch(data); + + // When piloting a vehicle (without freelook), mouse yaw goes to + // vehicle steering (mRot.z) and the player's head rotation (mHead) + // decays by 50% per tick — the camera is locked to the vehicle. + // Use the vehicle's heading directly instead of move-accumulated yaw. + // Verified against tribes2-engine Player::updateMove and Tribes2.exe. + if (this.isPiloting) { + if (data) { + const nested = data.controlObjectData as + | Record + | undefined; + const ang = nested?.angPosition as + | { x: number; y: number; z: number; w: number } + | undefined; + if (ang && typeof ang.w === "number") { + this.lastVehicleHeading = torqueQuatHeading(ang); + this.lastVehiclePitch = torqueQuatPitch(ang); + // Compute pullback direction from full quaternion (preserves roll). + // ShapeBase::getCameraTransform pulls back along the eye's -Y axis. + // In Torque space, forward is +Y. Transform +Y by the quaternion, + // convert to Three.js, then negate for pullback. + const threeQ = torqueQuatToThreeJS(ang); + if (threeQ) { + // Rotate Three.js forward (+X, since model default is +X) by the + // converted quaternion: v' = q * v * q^-1. + // For unit vector (1,0,0), this simplifies to: + const [qx, qy, qz, qw] = threeQ; + const fx = 1 - 2 * (qy * qy + qz * qz); + const fy = 2 * (qx * qy + qz * qw); + const fz = 2 * (qx * qz - qy * qw); + // Pullback = -forward + this.lastVehicleOrbitDir = [-fx, -fy, -fz]; + } + } + } + yaw = this.lastVehicleHeading; + pitch = this.lastVehiclePitch; + } this.camera = { time: timeSec, @@ -1476,32 +1570,126 @@ export abstract class StreamEngine implements StreamingPlayback { this.camera.mode = "observer"; } } else { - this.camera.mode = "first-person"; + // Player control object. if (control.ghostIndex >= 0) { this.controlPlayerGhostId = this.resolveEntityIdForGhostIndex(control.ghostIndex); } + if (!this.firstPerson) { + // Third-person: orbit the vehicle (if piloting) or the player. + this.camera.mode = "third-person"; + if (this.isPiloting && this.lastPilotGhostIndex != null) { + this.camera.orbitTargetId = + this.resolveEntityIdForGhostIndex(this.lastPilotGhostIndex); + this.camera.orbitDistance = 15; + if (this.lastVehicleOrbitDir) { + this.camera.orbitDirection = this.lastVehicleOrbitDir; + } + } else { + this.camera.orbitTargetId = this.controlPlayerGhostId; + // Player datablock cameraMaxDist is typically 3. + this.camera.orbitDistance = 3; + } + } else { + this.camera.mode = "first-person"; + } if (this.controlPlayerGhostId) { this.camera.controlEntityId = this.controlPlayerGhostId; } } - // Sync control player position - if ( - controlType === "player" && - !this.isPiloting && - this.controlPlayerGhostId && - control.position - ) { - const ghostEntity = this.entities.get(this.controlPlayerGhostId); - if (ghostEntity) { - ghostEntity.position = [ - control.position.x, - control.position.y, - control.position.z, - ]; - ghostEntity.rotation = playerYawToQuaternion(yaw); - ghostEntity.headPitch = this.getControlPlayerHeadPitch(pitch); + // Sync control object positions from controlObjectData. + if (controlType === "player" && control.position) { + if (this.isPiloting && this.lastPilotGhostIndex != null) { + const vehicleId = + this.resolveEntityIdForGhostIndex(this.lastPilotGhostIndex); + const vehicleEntity = vehicleId + ? this.entities.get(vehicleId) + : undefined; + if (vehicleEntity) { + const nested = data?.controlObjectData as + | Record + | undefined; + if (nested) { + // Fresh position from controlObjectData (linPosition → + // compressionPoint → control.position). + vehicleEntity.position = [ + control.position.x, + control.position.y, + control.position.z, + ]; + this.lastVehiclePos = vehicleEntity.position.slice() as [number, number, number]; + this.lastVehiclePosTime = timeSec; + + // Extract velocity from linMomentum for interpolation between + // the sparse position updates (~10 of ~62 packets contain data). + const mom = nested.linMomentum as + | { x: number; y: number; z: number } + | undefined; + if (mom && isValidPosition(mom)) { + // linMomentum = mass * velocity; look up mass from datablock. + const dbId = vehicleEntity.dataBlockId; + const dbData = dbId != null ? this.getDataBlockData(dbId) : undefined; + const mass = (dbData?.mass as number) ?? 200; + const invMass = mass > 0 ? 1 / mass : 1 / 200; + this.lastVehicleVelocity = [ + mom.x * invMass, + mom.y * invMass, + mom.z * invMass, + ]; + vehicleEntity.velocity = this.lastVehicleVelocity; + } + + // Sync vehicle rotation from nested angPosition quaternion. + const ang = nested.angPosition as + | { x: number; y: number; z: number; w: number } + | undefined; + if (ang && typeof ang.w === "number") { + const converted = torqueQuatToThreeJS(ang); + if (converted) vehicleEntity.rotation = converted; + } + } else if ( + this.lastVehiclePos && + this.lastVehicleVelocity && + this.lastVehiclePosTime > 0 + ) { + // No nested data this packet — extrapolate from last known + // position + velocity to avoid stutter. + const dt = timeSec - this.lastVehiclePosTime; + if (dt > 0 && dt < 1) { + const [vx, vy, vz] = this.lastVehicleVelocity; + vehicleEntity.position = [ + this.lastVehiclePos[0] + vx * dt, + this.lastVehiclePos[1] + vy * dt, + this.lastVehiclePos[2] + vz * dt, + ]; + } + } + } + } else if (this.controlPlayerGhostId) { + const ghostEntity = this.entities.get(this.controlPlayerGhostId); + if (ghostEntity) { + ghostEntity.position = [ + control.position.x, + control.position.y, + control.position.z, + ]; + ghostEntity.rotation = playerYawToQuaternion(yaw); + ghostEntity.headPitch = this.getControlPlayerHeadPitch(pitch); + // Sync velocity from controlObjectData. Ghost updates skip the + // control player (MoveMask is not read), so velocity and state + // flags must come from here for movement animation selection. + const vel = data?.velocity as + | { x: number; y: number; z: number } + | undefined; + if (isVec3Like(vel)) { + ghostEntity.velocity = [vel.x, vel.y, vel.z]; + // Approximate mFalling: engine sets it when no ground contact + // and vz < sFallingThreshold (-10). controlObjectData lacks + // the explicit flag, so use the velocity heuristic. + ghostEntity.falling = vel.z < -10; + } + } } } } else if (this.camera) { @@ -1575,8 +1763,8 @@ export abstract class StreamEngine implements StreamingPlayback { // ── Chat + HUD ── - protected pushChatMessage(msg: ChatMessage): void { - this.chatMessages.push(msg); + protected pushChatMessage(msg: Omit): void { + this.chatMessages.push({ ...msg, id: ++this.chatMessageIdCounter }); if (this.chatMessages.length > 200) { this.chatMessages.splice(0, this.chatMessages.length - 200); } @@ -1771,6 +1959,9 @@ export abstract class StreamEngine implements StreamingPlayback { shapeHint: entity.shapeHint, dataBlock: entity.dataBlock, weaponShape: entity.weaponShape, + packShape: entity.packShape, + falling: entity.falling, + jetting: entity.jetting, playerName: entity.playerName, targetRenderFlags: renderFlags, iffColor: @@ -1857,9 +2048,7 @@ export abstract class StreamEngine implements StreamingPlayback { chatMessages: ChatMessage[]; audioEvents: PendingAudioEvent[]; } { - const chatMessages = this.chatMessages.filter( - (m) => m.timeSec > timeSec - 15, - ); + const chatMessages = this.chatMessages.slice(); const audioEvents = this.audioEvents.filter( (e) => e.timeSec > timeSec - 0.5 && e.timeSec <= timeSec, ); diff --git a/src/stream/demoStreaming.ts b/src/stream/demoStreaming.ts index 97d48a2c..6d663f49 100644 --- a/src/stream/demoStreaming.ts +++ b/src/stream/demoStreaming.ts @@ -18,6 +18,9 @@ import { detectControlObjectType, parseColorSegments, backpackBitmapToIndex, + torqueQuatHeading, + torqueQuatPitch, + torqueQuatToThreeJS, } from "./streamHelpers"; import type { Vec3 } from "./streamHelpers"; import type { @@ -276,6 +279,7 @@ class StreamingPlayback extends StreamEngine { parsedData?: Record; }>; demoValues: string[]; + firstPerson: boolean; }; // Demo-specific: move delta tracking for V12-style camera rotation private moveTicks = 0; @@ -326,6 +330,7 @@ class StreamingPlayback extends StreamEngine { taggedStrings: initial.taggedStrings, initialEvents: initial.initialEvents, demoValues: initial.demoValues, + firstPerson: initial.firstPerson, }; this.reset(); @@ -368,7 +373,9 @@ class StreamingPlayback extends StreamEngine { protected getCameraYawPitch( _data: Record | undefined, ): { yaw: number; pitch: number } { - const hasMoves = !this.isPiloting && this.lastControlType === "player"; + // Move-derived angles are valid when the control object is a Player + // (including when piloting a vehicle — moves still drive the camera). + const hasMoves = this.lastControlType === "player"; const yaw = hasMoves ? this.absoluteYaw : this.lastAbsYaw; const pitch = hasMoves ? this.absolutePitch : this.lastAbsPitch; @@ -445,6 +452,7 @@ class StreamingPlayback extends StreamEngine { this.absolutePitch = 0; this.lastAbsYaw = 0; this.lastAbsPitch = 0; + this.firstPerson = this.initialBlock.firstPerson; this.lastControlType = detectControlObjectType(this.initialBlock.controlObjectData) ?? "player"; this.isPiloting = @@ -454,6 +462,31 @@ class StreamingPlayback extends StreamEngine { this.initialBlock.controlObjectData?.controlObjectGhost != null ) : false; + this.lastPilotGhostIndex = + this.isPiloting && + typeof this.initialBlock.controlObjectData?.controlObjectGhost === "number" + ? this.initialBlock.controlObjectData.controlObjectGhost + : undefined; + if (this.isPiloting) { + const nested = this.initialBlock.controlObjectData?.controlObjectData as + | Record + | undefined; + const ang = nested?.angPosition as + | { x: number; y: number; z: number; w: number } + | undefined; + if (ang && typeof ang.w === "number") { + this.lastVehicleHeading = torqueQuatHeading(ang); + this.lastVehiclePitch = torqueQuatPitch(ang); + const threeQ = torqueQuatToThreeJS(ang); + if (threeQ) { + const [qx, qy, qz, qw] = threeQ; + const fx = 1 - 2 * (qy * qy + qz * qz); + const fy = 2 * (qx * qy + qz * qw); + const fz = 2 * (qx * qz - qy * qw); + this.lastVehicleOrbitDir = [-fx, -fy, -fz]; + } + } + } this.lastCameraMode = this.lastControlType === "camera" && typeof this.initialBlock.controlObjectData?.cameraMode === "number" @@ -609,7 +642,7 @@ class StreamingPlayback extends StreamEngine { const isPlayerChat = hasChatColor && fullText.includes(": "); if (isPlayerChat) { const colonIdx = fullText.indexOf(": "); - this.chatMessages.push({ + this.pushChatMessage({ timeSec: 0, sender: fullText.slice(0, colonIdx), text: fullText.slice(colonIdx + 2), @@ -618,7 +651,7 @@ class StreamingPlayback extends StreamEngine { segments, }); } else { - this.chatMessages.push({ + this.pushChatMessage({ timeSec: 0, sender: "", text: fullText, @@ -749,6 +782,10 @@ class StreamingPlayback extends StreamEngine { // Apply ghost rotation to absolute tracking. This must happen before // the next move delta so that our tracking stays calibrated to V12. + // During piloting, rotationZ/headX are relative to the vehicle (reset + // to 0 on mount). We still accept the reset so move deltas accumulate + // from the correct base; the vehicle heading offset is added later in + // updateCameraAndHud. const controlData = packet.gameState.controlObjectData; if (controlData) { const absRot = this.getAbsoluteRotation(controlData); @@ -773,6 +810,9 @@ class StreamingPlayback extends StreamEngine { } if (block.type === BlockTypeInfo && this.isInfoData(block.parsed)) { + // InfoBlock: value1 byte 0 = $firstPerson flag, value2 = FOV. + // Verified against Tribes2.exe GameConnection::handleRecordedBlock. + this.firstPerson = (block.parsed.value1 & 0xff) !== 0; if (Number.isFinite(block.parsed.value2)) { this.latestFov = block.parsed.value2; } @@ -919,10 +959,14 @@ class StreamingPlayback extends StreamEngine { return !!parsed && typeof parsed === "object" && "yaw" in parsed; } - private isInfoData(parsed: unknown): parsed is { value2: number } { + private isInfoData( + parsed: unknown, + ): parsed is { value1: number; value2: number } { return ( !!parsed && typeof parsed === "object" && + "value1" in parsed && + typeof (parsed as { value1?: unknown }).value1 === "number" && "value2" in parsed && typeof (parsed as { value2?: unknown }).value2 === "number" ); diff --git a/src/stream/entityBridge.ts b/src/stream/entityBridge.ts index 700c0860..2bf6fd7f 100644 --- a/src/stream/entityBridge.ts +++ b/src/stream/entityBridge.ts @@ -101,6 +101,9 @@ export function streamEntityToGameEntity( shapeName: entity.dataBlock, dataBlock: entity.dataBlock, weaponShape: entity.weaponShape, + packShape: entity.packShape, + falling: entity.falling, + jetting: entity.jetting, playerName: entity.playerName, iffColor: entity.iffColor, threads: entity.threads, diff --git a/src/stream/liveStreaming.ts b/src/stream/liveStreaming.ts index 4b80b9f6..74558402 100644 --- a/src/stream/liveStreaming.ts +++ b/src/stream/liveStreaming.ts @@ -354,16 +354,19 @@ export class LiveStreamAdapter extends StreamEngine { this.handleGhostingMessage(event.parsedData); const type = event.parsedData.type as string; - // Log events in early packets + // Always log RemoteCommandEvents (chat, server messages, HUD). + if (type === "RemoteCommandEvent") { + const funcName = this.resolveNetString(event.parsedData.funcName as string ?? ""); + console.log(`[live] remote: ${funcName}`); + } + // Log other events in early packets if (isEarlyPacket) { - if (type !== "NetStringEvent") { + if (type !== "NetStringEvent" && type !== "RemoteCommandEvent") { console.log( `[live] event: ${type}`, - type === "RemoteCommandEvent" - ? { funcName: this.resolveNetString(event.parsedData.funcName as string ?? "") } - : type === "SimDataBlockEvent" - ? { id: event.parsedData.objectId, className: event.parsedData.dataBlockClassName } - : undefined, + type === "SimDataBlockEvent" + ? { id: event.parsedData.objectId, className: event.parsedData.dataBlockClassName } + : undefined, ); } } @@ -491,8 +494,18 @@ export class LiveStreamAdapter extends StreamEngine { ); } + const prevMode = this.camera?.mode; this.updateCameraAndHud(); + // Log camera mode transitions (always, not just early packets). + if (this.camera && this.camera.mode !== prevMode) { + console.log( + `[live] camera mode: ${prevMode ?? "none"} → ${this.camera.mode}` + + (this.camera.mode === "third-person" + ? ` orbit=${this.camera.orbitTargetId ?? "?"} dist=${this.camera.orbitDistance ?? "?"}` + : ""), + ); + } // Log camera position for early packets if (this.tickCount <= 5 && this.camera) { const [cx, cy, cz] = this.camera.position; diff --git a/src/stream/playerAnimation.ts b/src/stream/playerAnimation.ts index 87bbb8d6..6d03e484 100644 --- a/src/stream/playerAnimation.ts +++ b/src/stream/playerAnimation.ts @@ -1,17 +1,22 @@ /** * Movement animation selection logic replicating Torque's - * Player::pickActionAnimation() (player.cc:2280). + * Player::pickActionAnimation() (Tribes2.exe FUN_005d6210). + * + * The server does NOT transmit table animation indices (0-7) over the + * network. Each client independently derives the movement animation from + * the ghost's velocity, body rotation, and state flags (mFalling, jetting). */ -/** Torque falling threshold: Z velocity below this = falling. */ -const FALLING_THRESHOLD = -10; + /** Minimum velocity dot product to count as intentional movement. */ const MOVE_THRESHOLD = 0.1; + export interface MoveAnimationResult { - /** Engine alias name (e.g. "root", "run", "back", "side", "fall"). */ + /** Engine alias name (e.g. "root", "run", "back", "side", "fall", "jet"). */ animation: string; /** 1 for forward playback, -1 for reversed (right strafe). */ timeScale: number; } + /** * Extract body yaw (Torque rotationZ) from a Three.js quaternion produced by * `playerYawToQuaternion()`. That function builds a Y-axis rotation: @@ -21,41 +26,65 @@ export interface MoveAnimationResult { function quaternionToBodyYaw(q: [number, number, number, number]): number { return -2 * Math.atan2(q[1], q[3]); } + /** - * Pick the movement animation for a player based on their velocity and - * body orientation, matching Torque's pickActionAnimation(). + * Pick the movement animation for a player based on their velocity, body + * orientation, and movement state flags. * - * @param velocity Torque world-space velocity [x, y, z], or undefined for idle. - * @param rotation Three.js quaternion from playerYawToQuaternion(). + * Matches the Tribes2.exe binary (build 25034) pickActionAnimation at + * 0x005d6210. The binary checks in order: + * 1. mFalling → FallAnim (4) + * 2. contactTimer < 30 → velocity-based selection (run/back/side/root) + * 3. jetting → JetAnim (5) + * 4. else → RootAnim (0) + * + * Since we don't have contactTimer, falling=false + no velocity uses root. */ export function pickMoveAnimation( velocity: [number, number, number] | undefined, rotation: [number, number, number, number], + falling?: boolean, + jetting?: boolean, ): MoveAnimationResult { - if (!velocity) { - return { animation: "root", timeScale: 1 }; - } - const [vx, vy, vz] = velocity; - // Falling: Torque Z velocity below threshold. - if (vz < FALLING_THRESHOLD) { + // Falling overrides everything. + if (falling) { return { animation: "fall", timeScale: 1 }; } + + if (!velocity) { + // No velocity data at all — use jetting or idle. + if (jetting) return { animation: "jet", timeScale: 1 }; + return { animation: "root", timeScale: 1 }; + } + + const [vx, vy, _vz] = velocity; + // Convert world velocity to player object space using body yaw. + // mWorldToObj.mulV(mVelocity) with a pure Z-axis rotation: + // localX = vx*cos(rotZ) + vy*sin(rotZ) + // localY = -vx*sin(rotZ) + vy*cos(rotZ) const yaw = quaternionToBodyYaw(rotation); const cosY = Math.cos(yaw); const sinY = Math.sin(yaw); - // Torque object space: localY = forward, localX = right. const localX = vx * cosY + vy * sinY; const localY = -vx * sinY + vy * cosY; - // Pick direction with largest dot product. + + // Dot products against animation direction vectors: + // run dir = (0, 1, 0) → dot = localY + // back dir = (0,-1, 0) → dot = -localY + // side dir = (-1,0, 0) → dot = -localX (left), +localX (right reversed) const forwardDot = localY; const backDot = -localY; const leftDot = -localX; const rightDot = localX; + const maxDot = Math.max(forwardDot, backDot, leftDot, rightDot); if (maxDot < MOVE_THRESHOLD) { + // Below movement threshold — jetting or idle. + if (jetting) return { animation: "jet", timeScale: 1 }; return { animation: "root", timeScale: 1 }; } + if (maxDot === forwardDot) { return { animation: "run", timeScale: 1 }; } diff --git a/src/stream/relayClient.ts b/src/stream/relayClient.ts index a53cc411..41f8e363 100644 --- a/src/stream/relayClient.ts +++ b/src/stream/relayClient.ts @@ -116,9 +116,9 @@ export class RelayClient { } /** Join a specific game server. */ - joinServer(address: string): void { + joinServer(address: string, warriorName?: string): void { console.log("[relay] Joining server:", address); - this.send({ type: "joinServer", address }); + this.send({ type: "joinServer", address, warriorName }); } /** Disconnect from the current game server. */ diff --git a/src/stream/streamHelpers.ts b/src/stream/streamHelpers.ts index 378b12e1..e5906574 100644 --- a/src/stream/streamHelpers.ts +++ b/src/stream/streamHelpers.ts @@ -83,6 +83,31 @@ export function torqueQuatToThreeJS(q: { return [x * invLen, y * invLen, z * invLen, w * invLen]; } +/** Extract heading (yaw around Torque Z axis) from a Torque quaternion. */ +export function torqueQuatHeading(q: { + x: number; + y: number; + z: number; + w: number; +}): number { + return Math.atan2( + 2 * (q.w * q.z + q.x * q.y), + q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z, + ); +} + +/** Extract pitch (rotation around Torque X axis) from a Torque quaternion. */ +export function torqueQuatPitch(q: { + x: number; + y: number; + z: number; + w: number; +}): number { + const sinp = 2 * (q.w * q.x - q.y * q.z); + // Clamp for numerical stability near poles. + return Math.asin(Math.max(-1, Math.min(1, sinp))); +} + // ── Position / type guards ── export function isValidPosition( diff --git a/src/stream/types.ts b/src/stream/types.ts index a5d87be4..ab2645ec 100644 --- a/src/stream/types.ts +++ b/src/stream/types.ts @@ -130,6 +130,12 @@ export interface StreamEntity { weaponImageState?: WeaponImageState; /** Weapon image state machine states from the ShapeBaseImageData datablock. */ weaponImageStates?: WeaponImageDataBlockState[]; + /** DTS shape name for the mounted pack (slot 2, Mount1 bone). */ + packShape?: string; + /** True when the player has no ground contact and is falling. */ + falling?: boolean; + /** True when the player is using jetpack thrust. */ + jetting?: boolean; /** Head pitch for blend animations, normalized [-1,1]. -1 = max down, 1 = max up. */ headPitch?: number; /** Head yaw for blend animations (freelook), normalized [-1,1]. -1 = max right, 1 = max left. */ @@ -166,6 +172,8 @@ export interface StreamCamera { yaw?: number; /** Absolute control-object pitch in Torque radians (rotX/headX). */ pitch?: number; + /** Explicit orbit pullback direction in Three.js space (overrides yaw/pitch). */ + orbitDirection?: [number, number, number]; } /** A colored text segment from inline \c color switching. */ @@ -176,6 +184,7 @@ export interface ChatSegment { } export interface ChatMessage { + id: number; timeSec: number; sender: string; text: string;