improve query param handling, add support for linking too coords

This commit is contained in:
Brian Beck 2025-12-16 17:31:13 -08:00
parent 2a36c18f92
commit 55c1067682
39 changed files with 939 additions and 678 deletions

View file

@ -1,4 +1,5 @@
import { ReactNode } from "react";
import { NuqsAdapter } from "nuqs/adapters/next/app";
import "./style.css";
export const metadata = {
@ -9,7 +10,15 @@ export const metadata = {
export default function RootLayout({ children }: { children: ReactNode }) {
return (
<html lang="en">
<body>{children}</body>
<body>
<NuqsAdapter
defaultOptions={{
clearOnDefault: false,
}}
>
{children}
</NuqsAdapter>
</body>
</html>
);
}

View file

@ -1,8 +1,7 @@
"use client";
import { useState, useEffect, useCallback, Suspense, useMemo } from "react";
import { useSearchParams, useRouter } from "next/navigation";
import { useState, useEffect, useCallback, Suspense, useRef } from "react";
import { Canvas, GLProps } from "@react-three/fiber";
import { NoToneMapping, SRGBColorSpace, PCFShadowMap } from "three";
import { NoToneMapping, SRGBColorSpace, PCFShadowMap, Camera } from "three";
import { Mission } from "@/src/components/Mission";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ObserverControls } from "@/src/components/ObserverControls";
@ -13,8 +12,9 @@ import { AudioProvider } from "@/src/components/AudioContext";
import { DebugElements } from "@/src/components/DebugElements";
import { CamerasProvider } from "@/src/components/CamerasProvider";
import { getMissionList, getMissionInfo } from "@/src/manifest";
import { createParser, useQueryState } from "nuqs";
// three.js has its own loaders for textures and models, but we need to load other
// Three.js has its own loaders for textures and models, but we need to load other
// stuff too, e.g. missions, terrains, and more. This client is used for those.
const queryClient = new QueryClient();
@ -26,23 +26,52 @@ const glSettings: GLProps = {
outputColorSpace: SRGBColorSpace,
};
type CurrentMission = {
missionName: string;
missionType?: string;
};
const defaultMission: CurrentMission = {
missionName: "RiverDance",
missionType: "CTF",
};
const parseAsMissionWithType = createParser<CurrentMission>({
parse(query: string) {
let [missionName, missionType] = query.split("~");
const availableMissionTypes = getMissionInfo(missionName).missionTypes;
if (!missionType || !availableMissionTypes.includes(missionType)) {
missionType = availableMissionTypes[0];
}
return { missionName, missionType };
},
serialize({ missionName, missionType }): string {
const availableMissionTypes = getMissionInfo(missionName).missionTypes;
if (availableMissionTypes.length === 1) {
return missionName;
}
return `${missionName}~${missionType}`;
},
eq(a, b) {
return a.missionName === b.missionName && a.missionType === b.missionType;
},
}).withDefault(defaultMission);
function MapInspector() {
const searchParams = useSearchParams();
const router = useRouter();
const [initialMissionName, initialMissionType] = useMemo(
() => (searchParams.get("mission") || "RiverDance~CTF").split("~"),
[],
const [currentMission, setCurrentMission] = useQueryState(
"mission",
parseAsMissionWithType,
);
const [missionName, setMissionName] = useState(initialMissionName);
const availableMissionTypes = getMissionInfo(missionName).missionTypes;
const [missionType, setMissionType] = useState(() =>
initialMissionType && availableMissionTypes.includes(initialMissionType)
? initialMissionType
: availableMissionTypes[0],
);
const isOnlyMissionType = availableMissionTypes.length === 1;
const changeMission = useCallback(
(mission: CurrentMission) => {
window.location.hash = "";
setCurrentMission(mission);
},
[setCurrentMission],
);
const { missionName, missionType } = currentMission;
const [loadingProgress, setLoadingProgress] = useState(0);
const [showLoadingIndicator, setShowLoadingIndicator] = useState(true);
const isLoading = loadingProgress < 1;
@ -59,7 +88,13 @@ function MapInspector() {
useEffect(() => {
// For automation, like the t2-maps app!
window.setMissionName = setMissionName;
window.setMissionName = (missionName: string) => {
const availableMissionTypes = getMissionInfo(missionName).missionTypes;
changeMission({
missionName,
missionType: availableMissionTypes[0],
});
};
window.getMissionList = getMissionList;
window.getMissionInfo = getMissionInfo;
@ -68,17 +103,7 @@ function MapInspector() {
delete window.getMissionList;
delete window.getMissionInfo;
};
}, []);
// Update query params when state changes
useEffect(() => {
const params = new URLSearchParams();
const value = isOnlyMissionType
? missionName
: `${missionName}~${missionType}`;
params.set("mission", value);
router.replace(`?${params.toString()}`, { scroll: false });
}, [missionName, missionType, isOnlyMissionType, router]);
}, [changeMission]);
const handleLoadingChange = useCallback(
(_loading: boolean, progress: number = 0) => {
@ -87,6 +112,8 @@ function MapInspector() {
[],
);
const cameraRef = useRef<Camera | null>(null);
return (
<QueryClientProvider client={queryClient}>
<main>
@ -110,6 +137,9 @@ function MapInspector() {
frameloop="always"
gl={glSettings}
shadows={{ type: PCFShadowMap }}
onCreated={(state) => {
cameraRef.current = state.camera;
}}
>
<CamerasProvider>
<AudioProvider>
@ -118,7 +148,6 @@ function MapInspector() {
name={missionName}
missionType={missionType}
onLoadingChange={handleLoadingChange}
setMissionType={setMissionType}
/>
<ObserverCamera />
<DebugElements />
@ -130,10 +159,8 @@ function MapInspector() {
<InspectorControls
missionName={missionName}
missionType={missionType}
onChangeMission={({ missionName, missionType }) => {
setMissionName(missionName);
setMissionType(missionType);
}}
onChangeMission={changeMission}
cameraRef={cameraRef}
/>
</SettingsProvider>
</main>

View file

@ -77,6 +77,42 @@ input[type="range"] {
gap: 6px;
}
.IconButton {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
margin: 0 0 0 -12px;
font-size: 15px;
padding: 0;
border-top: 1px solid rgba(255, 255, 255, 0.3);
border-left: 1px solid rgba(255, 255, 255, 0.3);
border-right: 1px solid rgba(200, 200, 200, 0.3);
border-bottom: 1px solid rgba(200, 200, 200, 0.3);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
border-radius: 4px;
background: rgba(3, 82, 147, 0.6);
color: #fff;
cursor: pointer;
transform: translate(0, 0);
transition:
background 0.1s,
border-color 0.1s;
}
.IconButton:hover {
background: rgba(0, 98, 179, 0.8);
border-color: rgba(255, 255, 255, 0.4);
}
.IconButton:active {
background: rgba(0, 98, 179, 0.7);
border-color: rgba(255, 255, 255, 0.3);
transform: translate(0, 1px);
}
.StaticShapeLabel {
background: rgba(0, 0, 0, 0.5);
color: #fff;
@ -353,3 +389,26 @@ input[type="range"] {
color: rgba(255, 255, 255, 0.7);
font-variant-numeric: tabular-nums;
}
.CopyCoordinatesButton .ClipboardCheck {
display: none;
opacity: 1;
}
@keyframes showClipboardCheck {
0% {
opacity: 1;
}
100% {
opacity: 0.2;
}
}
.CopyCoordinatesButton[data-copied="true"] .ClipboardCheck {
display: block;
animation: showClipboardCheck 300ms linear infinite;
}
.CopyCoordinatesButton[data-copied="true"] .MapPin {
display: none;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,9 +1,9 @@
1:"$Sreact.fragment"
2:I[47257,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ClientPageRoot"]
3:I[31713,["/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","/t2-mapper/_next/static/chunks/88a69012eeffa5b8.js","/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","/t2-mapper/_next/static/chunks/acd032a5b4d059f4.js"],"default"]
3:I[31713,["/t2-mapper/_next/static/chunks/9309477277712998.js","/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","/t2-mapper/_next/static/chunks/259e253a988800da.js","/t2-mapper/_next/static/chunks/acd032a5b4d059f4.js"],"default"]
6:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
7:"$Sreact.suspense"
0:{"buildId":"B9Mz834jSAfO_CiVWkcwc","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","async":true}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/88a69012eeffa5b8.js","async":true}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","async":true}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/acd032a5b4d059f4.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"loading":null,"isPartial":false}
0:{"buildId":"scQMBCUl76V3bQl4SK2Zy","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","async":true}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","async":true}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/259e253a988800da.js","async":true}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/acd032a5b4d059f4.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

View file

@ -1,18 +1,19 @@
1:"$Sreact.fragment"
2:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
3:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[47257,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ClientPageRoot"]
5:I[31713,["/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","/t2-mapper/_next/static/chunks/88a69012eeffa5b8.js","/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","/t2-mapper/_next/static/chunks/acd032a5b4d059f4.js"],"default"]
8:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
9:"$Sreact.suspense"
b:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"]
d:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
f:I[68027,[],"default"]
:HL["/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","style"]
0:{"P":null,"b":"B9Mz834jSAfO_CiVWkcwc","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",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":[["$","$L4",null,{"Component":"$5","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@6","$@7"]}}],[["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/88a69012eeffa5b8.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/acd032a5b4d059f4.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$@c"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$@e"}]}]}],null]}],false]],"m":"$undefined","G":["$f",[]],"S":true}
6:{}
7:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
10:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
e:[["$","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"}],["$","$L10","3",{}]]
a:null
2:I[12985,["/t2-mapper/_next/static/chunks/9309477277712998.js"],"NuqsAdapter"]
3:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
5:I[47257,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ClientPageRoot"]
6:I[31713,["/t2-mapper/_next/static/chunks/9309477277712998.js","/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","/t2-mapper/_next/static/chunks/259e253a988800da.js","/t2-mapper/_next/static/chunks/acd032a5b4d059f4.js"],"default"]
9:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
a:"$Sreact.suspense"
c:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"]
e:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
10:I[68027,[],"default"]
:HL["/t2-mapper/_next/static/chunks/045236f705732fea.css","style"]
0:{"P":null,"b":"scQMBCUl76V3bQl4SK2Zy","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/045236f705732fea.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/9309477277712998.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"]}}],[["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/259e253a988800da.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/acd032a5b4d059f4.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":"$@d"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$@f"}]}]}],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"}]]
11:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
f:[["$","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"}],["$","$L11","3",{}]]
b:null

View file

@ -3,6 +3,6 @@
4:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
5:"$Sreact.suspense"
7:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
0:{"buildId":"B9Mz834jSAfO_CiVWkcwc","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":"$@3"}],["$","div",null,{"hidden":true,"children":["$","$L4",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@6"}]}]}],null]}],"loading":null,"isPartial":false}
0:{"buildId":"scQMBCUl76V3bQl4SK2Zy","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":"$@3"}],["$","div",null,{"hidden":true,"children":["$","$L4",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@6"}]}]}],null]}],"loading":null,"isPartial":false}
3:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
6:[["$","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"}],["$","$L7","3",{}]]

View file

@ -1,5 +1,6 @@
1:"$Sreact.fragment"
2:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
3:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
:HL["/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","style"]
0:{"buildId":"B9Mz834jSAfO_CiVWkcwc","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","precedence":"next"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",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}
2:I[12985,["/t2-mapper/_next/static/chunks/9309477277712998.js"],"NuqsAdapter"]
3:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
:HL["/t2-mapper/_next/static/chunks/045236f705732fea.css","style"]
0:{"buildId":"scQMBCUl76V3bQl4SK2Zy","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/045236f705732fea.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/9309477277712998.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}

View file

@ -1,2 +1,2 @@
:HL["/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","style"]
0:{"buildId":"B9Mz834jSAfO_CiVWkcwc","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/045236f705732fea.css","style"]
0:{"buildId":"scQMBCUl76V3bQl4SK2Zy","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}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
html{box-sizing:border-box;background:#000;margin:0;padding:0}*,:before,:after{box-sizing:inherit}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:100%}body{margin:0;padding:0}main{width:100vw;height:100vh}#canvasContainer{z-index:0;position:absolute;inset:0}#controls{color:#fff;z-index:1;background:#00000080;border-radius:0 0 4px;align-items:center;gap:20px;padding:8px 12px 8px 8px;font-size:13px;display:flex;position:fixed;top:0;left:0}input[type=range]{max-width:80px}.CheckboxField,.Field{align-items:center;gap:6px;display:flex}.StaticShapeLabel{color:#fff;white-space:nowrap;text-align:center;background:#00000080;border-radius:1px;padding:1px 3px;font-size:11px}.StatsPanel{right:0;left:auto!important}.AxisLabel{pointer-events:none;font-size:12px}.AxisLabel[data-axis=x]{color:#f90}.AxisLabel[data-axis=y]{color:#9f0}.AxisLabel[data-axis=z]{color:#09f}.MissionSelect-inputWrapper{align-items:center;display:flex;position:relative}.MissionSelect-shortcut{color:#fff9;pointer-events:none;background:#ffffff26;border-radius:3px;padding:1px 4px;font-family:system-ui,sans-serif;font-size:11px;position:absolute;right:7px}.MissionSelect-input[aria-expanded=true]~.MissionSelect-shortcut{display:none}.MissionSelect-input{color:#fff;background:#0009;border:1px solid #ffffff4d;border-radius:3px;outline:none;width:280px;padding:6px 36px 6px 8px;font-size:14px}.MissionSelect-input[aria-expanded=true]{padding-right:8px}.MissionSelect-input:focus{border-color:#fff9}.MissionSelect-input::placeholder{color:#0000}.MissionSelect-selectedValue{pointer-events:none;align-items:center;gap:6px;display:flex;position:absolute;left:8px;right:36px;overflow:hidden}.MissionSelect-input[aria-expanded=true]~.MissionSelect-selectedValue{display:none}.MissionSelect-selectedName{color:#fff;white-space:nowrap;text-overflow:ellipsis;flex-shrink:1;min-width:0;font-size:14px;font-weight:600;overflow:hidden}.MissionSelect-selectedValue>.MissionSelect-itemType{flex-shrink:0}.MissionSelect-popover{z-index:100;min-width:320px;max-height:var(--popover-available-height,90vh);overscroll-behavior:contain;background:#141414f2;border:1px solid #ffffff80;border-radius:3px;overflow-y:auto;box-shadow:0 8px 24px #0009}.MissionSelect-list{padding:4px 0}.MissionSelect-list:has(>.MissionSelect-group:first-child){padding-top:0}.MissionSelect-group{padding-bottom:4px}.MissionSelect-groupLabel{color:#c6caca;z-index:1;background:#3a4548f2;border-bottom:1px solid #ffffff4d;padding:6px 8px 6px 12px;font-size:13px;font-weight:600;position:sticky;top:0}.MissionSelect-group:not(:last-child){border-bottom:1px solid #ffffff4d}.MissionSelect-item{cursor:pointer;border-radius:4px;outline:none;flex-direction:column;gap:1px;margin:4px 4px 0;padding:6px 8px;scroll-margin-top:32px;display:flex}.MissionSelect-list>.MissionSelect-item:first-child{margin-top:0}.MissionSelect-item[data-active-item]{background:#ffffff26}.MissionSelect-item[aria-selected=true]{background:#6496ff4d}.MissionSelect-itemHeader{align-items:center;gap:6px;display:flex}.MissionSelect-itemName{color:#fff;font-size:14px;font-weight:600}.MissionSelect-itemTypes{gap:3px;display:flex}.MissionSelect-itemType{color:#fff;background:#ff9d0066;border-radius:3px;padding:2px 5px;font-size:10px;font-weight:600}.MissionSelect-itemType:hover{background:#ff9d00b3}.MissionSelect-itemMissionName{color:#ffffff80;font-size:12px}.MissionSelect-noResults{color:#ffffff80;text-align:center;padding:12px 8px;font-size:13px}.LoadingSpinner{border:4px solid #fff3;border-top-color:#fff;border-radius:50%;width:48px;height:48px;animation:1s linear infinite LoadingSpinner-spin}@keyframes LoadingSpinner-spin{to{transform:rotate(360deg)}}#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%)}#loadingIndicator[data-complete=true]{animation:.3s ease-out forwards loadingComplete}@keyframes loadingComplete{0%{opacity:1}to{opacity:0}}.LoadingProgress{background:#fff3;border-radius:2px;width:200px;height:4px;overflow:hidden}.LoadingProgress-bar{background:#fff;border-radius:2px;height:100%;transition:width .1s ease-out}.LoadingProgress-text{color:#ffffffb3;font-variant-numeric:tabular-nums;font-size:14px}

View file

@ -1,14 +1,15 @@
1:"$Sreact.fragment"
2:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
3:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
5:"$Sreact.suspense"
7:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"]
9:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
b:I[68027,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
:HL["/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","style"]
0:{"P":null,"b":"B9Mz834jSAfO_CiVWkcwc","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/c2a0c8ce789a084e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",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,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",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: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: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: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:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L7",null,{"children":"$@8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@a"}]}]}],null]}],false]],"m":"$undefined","G":["$b","$undefined"],"S":true}
8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
c:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
a:[["$","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"}],["$","$Lc","3",{}]]
6:null
2:I[12985,["/t2-mapper/_next/static/chunks/9309477277712998.js"],"NuqsAdapter"]
3:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
5:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
6:"$Sreact.suspense"
8:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"]
a:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
c:I[68027,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
:HL["/t2-mapper/_next/static/chunks/045236f705732fea.css","style"]
0:{"P":null,"b":"scQMBCUl76V3bQl4SK2Zy","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/045236f705732fea.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/9309477277712998.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":"$@9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$6",null,{"name":"Next.Metadata","children":"$@b"}]}]}],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"}]]
d:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
b:[["$","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"}],["$","$Ld","3",{}]]
7:null

View file

@ -3,6 +3,6 @@
4:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
5:"$Sreact.suspense"
7:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
0:{"buildId":"B9Mz834jSAfO_CiVWkcwc","rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":"$@3"}],["$","div",null,{"hidden":true,"children":["$","$L4",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@6"}]}]}],null]}],"loading":null,"isPartial":false}
0:{"buildId":"scQMBCUl76V3bQl4SK2Zy","rsc":["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L2",null,{"children":"$@3"}],["$","div",null,{"hidden":true,"children":["$","$L4",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@6"}]}]}],null]}],"loading":null,"isPartial":false}
3:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
6:[["$","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"}],["$","$L7","3",{}]]

View file

@ -1,5 +1,6 @@
1:"$Sreact.fragment"
2:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
3:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
:HL["/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","style"]
0:{"buildId":"B9Mz834jSAfO_CiVWkcwc","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","precedence":"next"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",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}
2:I[12985,["/t2-mapper/_next/static/chunks/9309477277712998.js"],"NuqsAdapter"]
3:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
:HL["/t2-mapper/_next/static/chunks/045236f705732fea.css","style"]
0:{"buildId":"scQMBCUl76V3bQl4SK2Zy","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/045236f705732fea.css","precedence":"next"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/9309477277712998.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}

View file

@ -1,5 +1,5 @@
1:"$Sreact.fragment"
2:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
3:"$Sreact.suspense"
0:{"buildId":"B9Mz834jSAfO_CiVWkcwc","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":"scQMBCUl76V3bQl4SK2Zy","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

View file

@ -1,4 +1,4 @@
1:"$Sreact.fragment"
2:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
3:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
0:{"buildId":"B9Mz834jSAfO_CiVWkcwc","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
0:{"buildId":"scQMBCUl76V3bQl4SK2Zy","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}

View file

@ -1,2 +1,2 @@
:HL["/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","style"]
0:{"buildId":"B9Mz834jSAfO_CiVWkcwc","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}
:HL["/t2-mapper/_next/static/chunks/045236f705732fea.css","style"]
0:{"buildId":"scQMBCUl76V3bQl4SK2Zy","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}

File diff suppressed because one or more lines are too long

View file

@ -1,14 +1,15 @@
1:"$Sreact.fragment"
2:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
3:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
5:"$Sreact.suspense"
7:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"]
9:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
b:I[68027,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
:HL["/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","style"]
0:{"P":null,"b":"B9Mz834jSAfO_CiVWkcwc","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/c2a0c8ce789a084e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",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,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",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: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: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: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:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L7",null,{"children":"$@8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$@a"}]}]}],null]}],false]],"m":"$undefined","G":["$b","$undefined"],"S":true}
8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
c:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
a:[["$","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"}],["$","$Lc","3",{}]]
6:null
2:I[12985,["/t2-mapper/_next/static/chunks/9309477277712998.js"],"NuqsAdapter"]
3:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
5:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
6:"$Sreact.suspense"
8:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"]
a:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
c:I[68027,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
:HL["/t2-mapper/_next/static/chunks/045236f705732fea.css","style"]
0:{"P":null,"b":"scQMBCUl76V3bQl4SK2Zy","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/045236f705732fea.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/9309477277712998.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":"$@9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$6",null,{"name":"Next.Metadata","children":"$@b"}]}]}],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"}]]
d:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
b:[["$","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"}],["$","$Ld","3",{}]]
7:null

File diff suppressed because one or more lines are too long

View file

@ -1,18 +1,19 @@
1:"$Sreact.fragment"
2:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
3:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[47257,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ClientPageRoot"]
5:I[31713,["/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","/t2-mapper/_next/static/chunks/88a69012eeffa5b8.js","/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","/t2-mapper/_next/static/chunks/acd032a5b4d059f4.js"],"default"]
8:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
9:"$Sreact.suspense"
b:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"]
d:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
f:I[68027,[],"default"]
:HL["/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","style"]
0:{"P":null,"b":"B9Mz834jSAfO_CiVWkcwc","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/c2a0c8ce789a084e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",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":[["$","$L4",null,{"Component":"$5","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@6","$@7"]}}],[["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/88a69012eeffa5b8.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/acd032a5b4d059f4.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$@c"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$@e"}]}]}],null]}],false]],"m":"$undefined","G":["$f",[]],"S":true}
6:{}
7:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
10:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
e:[["$","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"}],["$","$L10","3",{}]]
a:null
2:I[12985,["/t2-mapper/_next/static/chunks/9309477277712998.js"],"NuqsAdapter"]
3:I[39756,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
4:I[37457,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"default"]
5:I[47257,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ClientPageRoot"]
6:I[31713,["/t2-mapper/_next/static/chunks/9309477277712998.js","/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","/t2-mapper/_next/static/chunks/259e253a988800da.js","/t2-mapper/_next/static/chunks/acd032a5b4d059f4.js"],"default"]
9:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"OutletBoundary"]
a:"$Sreact.suspense"
c:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"ViewportBoundary"]
e:I[97367,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"MetadataBoundary"]
10:I[68027,[],"default"]
:HL["/t2-mapper/_next/static/chunks/045236f705732fea.css","style"]
0:{"P":null,"b":"scQMBCUl76V3bQl4SK2Zy","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/t2-mapper/_next/static/chunks/045236f705732fea.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/9309477277712998.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"]}}],[["$","script","script-0",{"src":"/t2-mapper/_next/static/chunks/3a3cff0360e2ba9f.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/t2-mapper/_next/static/chunks/ed074071f28b33e1.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/t2-mapper/_next/static/chunks/259e253a988800da.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/t2-mapper/_next/static/chunks/acd032a5b4d059f4.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":"$@d"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$@f"}]}]}],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"}]]
11:I[27201,["/t2-mapper/_next/static/chunks/42879de7b8087bc9.js"],"IconMark"]
f:[["$","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"}],["$","$L11","3",{}]]
b:null

50
package-lock.json generated
View file

@ -17,10 +17,12 @@
"lodash.orderby": "^4.6.0",
"match-sorter": "^8.2.0",
"next": "^16.0.10",
"nuqs": "^2.8.5",
"picomatch": "^4.0.3",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"react-error-boundary": "^6.0.0",
"react-icons": "^5.5.0",
"three": "^0.182.0",
"unzipper": "^0.12.3",
"zustand": "^5.0.9"
@ -1753,7 +1755,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz",
"integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==",
"dev": true,
"license": "MIT"
},
"node_modules/@swc/helpers": {
@ -3951,6 +3952,7 @@
"resolved": "https://registry.npmjs.org/next/-/next-16.0.10.tgz",
"integrity": "sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@next/env": "16.0.10",
"@swc/helpers": "0.5.15",
@ -4004,6 +4006,43 @@
"integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
"license": "MIT"
},
"node_modules/nuqs": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/nuqs/-/nuqs-2.8.5.tgz",
"integrity": "sha512-ndhnNB9eLX/bsiGFkBNsrfOWf3BCbzBMD+b5GkD5o2Q96Q+llHnoUlZsrO3tgJKZZV7LLlVCvFKdj+sjBITRzg==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/franky47"
},
"peerDependencies": {
"@remix-run/react": ">=2",
"@tanstack/react-router": "^1",
"next": ">=14.2.0",
"react": ">=18.2.0 || ^19.0.0-0",
"react-router": "^5 || ^6 || ^7",
"react-router-dom": "^5 || ^6 || ^7"
},
"peerDependenciesMeta": {
"@remix-run/react": {
"optional": true
},
"@tanstack/react-router": {
"optional": true
},
"next": {
"optional": true
},
"react-router": {
"optional": true
},
"react-router-dom": {
"optional": true
}
}
},
"node_modules/object-inspect": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@ -4494,6 +4533,15 @@
"react": ">=16.13.1"
}
},
"node_modules/react-icons": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz",
"integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==",
"license": "MIT",
"peerDependencies": {
"react": "*"
}
},
"node_modules/react-reconciler": {
"version": "0.31.0",
"resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz",

View file

@ -29,10 +29,12 @@
"lodash.orderby": "^4.6.0",
"match-sorter": "^8.2.0",
"next": "^16.0.10",
"nuqs": "^2.8.5",
"picomatch": "^4.0.3",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"react-error-boundary": "^6.0.0",
"react-icons": "^5.5.0",
"three": "^0.182.0",
"unzipper": "^0.12.3",
"zustand": "^5.0.9"

View file

@ -36,8 +36,13 @@ export function useCameras() {
export function CamerasProvider({ children }: { children: ReactNode }) {
const { camera } = useThree();
const [cameraIndex, setCameraIndex] = useState(0);
const [cameraIndex, setCameraIndex] = useState(-1);
const [cameraMap, setCameraMap] = useState<Record<string, CameraEntry>>({});
const [initialViewState, setInitialViewState] = useState(() => ({
initialized: false,
position: null,
quarternion: null,
}));
const registerCamera = useCallback((camera: CameraEntry) => {
setCameraMap((prevCameraMap) => ({
@ -55,38 +60,70 @@ export function CamerasProvider({ children }: { children: ReactNode }) {
const cameraCount = Object.keys(cameraMap).length;
const nextCamera = useCallback(() => {
setCameraIndex((prev) => {
if (cameraCount === 0) {
return 0;
}
return (prev + 1) % cameraCount;
});
}, [cameraCount]);
const setCamera = useCallback(
(index: number) => {
console.log(`[CamerasProvider] setCamera(${index})`);
if (index >= 0 && index < cameraCount) {
console.log(`[CamerasProvider] setCameraIndex(${index})`);
setCameraIndex(index);
const cameraId = Object.keys(cameraMap)[index];
const cameraInfo = cameraMap[cameraId];
camera.position.copy(cameraInfo.position);
// Apply coordinate system correction for Torque3D to Three.js
const correction = new Quaternion().setFromAxisAngle(
new Vector3(0, 1, 0),
-Math.PI / 2,
);
camera.quaternion.copy(cameraInfo.rotation).multiply(correction);
console.log(`[CamerasProvider] Done updating camera.`);
}
},
[cameraCount],
[camera, cameraCount, cameraMap],
);
const nextCamera = useCallback(() => {
console.log(`[CamerasProvider] nextCamera()`, cameraCount, cameraIndex);
setCamera(cameraCount ? (cameraIndex + 1) % cameraCount : -1);
}, [cameraCount, cameraIndex, setCamera]);
useEffect(() => {
const cameraCount = Object.keys(cameraMap).length;
if (cameraIndex < cameraCount) {
const cameraId = Object.keys(cameraMap)[cameraIndex];
const cameraInfo = cameraMap[cameraId];
camera.position.copy(cameraInfo.position);
// Apply coordinate system correction for Torque3D to Three.js
const correction = new Quaternion().setFromAxisAngle(
new Vector3(0, 1, 0),
-Math.PI / 2,
);
camera.quaternion.copy(cameraInfo.rotation).multiply(correction);
const hash = window.location.hash;
if (hash.startsWith("#c")) {
const [positionString, quarternionString] = hash.slice(2).split("~");
const position = positionString.split(",").map((s) => parseFloat(s));
const quarternion = quarternionString
.split(",")
.map((s) => parseFloat(s));
setInitialViewState({
initialized: true,
position: new Vector3(...position),
quarternion: new Quaternion(...quarternion),
});
} else {
setInitialViewState({
initialized: true,
position: null,
quarternion: null,
});
}
}, [cameraIndex, cameraMap, camera]);
}, []);
useEffect(() => {
if (initialViewState.initialized && initialViewState.position) {
camera.position.copy(initialViewState.position);
if (initialViewState.quarternion) {
camera.quaternion.copy(initialViewState.quarternion);
}
}
}, [initialViewState]);
useEffect(() => {
if (!initialViewState.initialized || initialViewState.position) return;
if (cameraCount > 0 && cameraIndex === -1) {
console.log(`[CamerasProvider] setCamera(0) in useEffect`);
setCamera(0);
}
}, [cameraCount, setCamera, cameraIndex]);
const context: CamerasContextValue = useMemo(
() => ({

View file

@ -0,0 +1,60 @@
import { RefObject, useCallback, useRef, useState } from "react";
import { FaMapPin } from "react-icons/fa";
import { FaClipboardCheck } from "react-icons/fa6";
import { Camera, Quaternion, Vector3 } from "three";
function encodeViewHash({
position,
quaternion,
}: {
position: Vector3;
quaternion: Quaternion;
}) {
const trunc = (num: number) => parseFloat(num.toFixed(3));
const encodedPosition = `${trunc(position.x)},${trunc(position.y)},${trunc(position.z)}`;
const encodedQuaternion = `${trunc(quaternion.x)},${trunc(quaternion.y)},${trunc(quaternion.z)},${trunc(quaternion.w)}`;
return `#c${encodedPosition}~${encodedQuaternion}`;
}
export function CopyCoordinatesButton({
cameraRef,
}: {
cameraRef: RefObject<Camera | null>;
}) {
const [showCopied, setShowCopied] = useState(false);
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const handleCopyLink = useCallback(async () => {
clearTimeout(timerRef.current);
const camera = cameraRef.current;
if (!camera) return;
const hash = encodeViewHash(camera);
// Update the URL hash
const fullPath = `${window.location.pathname}${window.location.search}${hash}`;
const fullUrl = `${window.location.origin}${fullPath}`;
window.history.replaceState(null, "", fullPath);
try {
await navigator.clipboard.writeText(fullUrl);
setShowCopied(true);
timerRef.current = setTimeout(() => {
setShowCopied(false);
}, 1300);
} catch (err) {
console.error(err);
}
}, [cameraRef]);
return (
<button
type="button"
className="IconButton CopyCoordinatesButton"
aria-label="Copy coordinates URL"
title="Copy coordinates URL"
onClick={handleCopyLink}
data-copied={showCopied ? "true" : "false"}
>
<FaMapPin className="MapPin" />
<FaClipboardCheck className="ClipboardCheck" />
</button>
);
}

View file

@ -1,10 +1,14 @@
import { useControls, useDebug, useSettings } from "./SettingsProvider";
import { MissionSelect } from "./MissionSelect";
import { RefObject } from "react";
import { Camera } from "three";
import { CopyCoordinatesButton } from "./CopyCoordinatesButton";
export function InspectorControls({
missionName,
missionType,
onChangeMission,
cameraRef,
}: {
missionName: string;
missionType: string;
@ -15,6 +19,7 @@ export function InspectorControls({
missionName: string;
missionType: string;
}) => void;
cameraRef: RefObject<Camera | null>;
}) {
const {
fogEnabled,
@ -41,6 +46,7 @@ export function InspectorControls({
missionType={missionType}
onChange={onChangeMission}
/>
<CopyCoordinatesButton cameraRef={cameraRef} />
<div className="CheckboxField">
<input
id="fogInput"

View file

@ -139,7 +139,6 @@ function useExecutedMission(
interface MissionProps {
name: string;
missionType: string;
setMissionType: (type: string) => void;
onLoadingChange?: (isLoading: boolean, progress?: number) => void;
}

View file

@ -212,7 +212,7 @@ export function MissionSelect({
if (!searchValue)
return { type: "grouped" as const, groups: defaultGroups };
const matches = matchSorter(allMissions, searchValue, {
keys: ["displayName", "missionName"],
keys: ["displayName", "missionName", "missionTypes", "groupName"],
});
return { type: "flat" as const, missions: matches };
}, [searchValue]);

View file

@ -45,8 +45,15 @@ function CameraMovement() {
const controls = new PointerLockControls(camera, gl.domElement);
controlsRef.current = controls;
return () => {
controls.dispose();
};
}, [camera, gl.domElement]);
useEffect(() => {
const handleClick = (e: MouseEvent) => {
if (controls.isLocked) {
const controls = controlsRef.current;
if (!controls || controls.isLocked) {
nextCamera();
} else if (e.target === gl.domElement) {
// Only lock if clicking directly on the canvas (not on UI elements)
@ -58,9 +65,8 @@ function CameraMovement() {
return () => {
document.removeEventListener("click", handleClick);
controls.dispose();
};
}, [camera, gl, nextCamera]);
}, [nextCamera]);
// Handle number keys 1-9 for camera selection
useEffect(() => {