├── .gitignore
├── .husky
├── .gitignore
└── pre-commit
├── .prettierignore
├── .prettierrc.json
├── LICENSE
├── README.md
├── craco.config.js
├── package.json
├── public
├── .htaccess
├── favicon.ico
├── favicon.png
├── index.html
├── robots.txt
└── static
│ └── media
│ └── .htaccess
├── screenshots
└── lumbridge.png
├── scripts
├── cache
│ ├── export-height-map.ts
│ ├── export-textures.ts
│ └── load-util.ts
└── download-caches.js
├── src
├── components
│ ├── renderer
│ │ ├── RenderStats.ts
│ │ ├── Renderer.ts
│ │ └── RendererCanvas.tsx
│ └── rs
│ │ ├── loading
│ │ ├── OsrsLoadingBar.css
│ │ └── OsrsLoadingBar.tsx
│ │ ├── menu
│ │ ├── OsrsMenu.css
│ │ └── OsrsMenu.tsx
│ │ ├── minimap
│ │ ├── MinimapContainer.css
│ │ ├── MinimapContainer.tsx
│ │ ├── MinimapImage.tsx
│ │ ├── compass.png
│ │ ├── minimap-black.png
│ │ ├── minimap-frame.png
│ │ ├── worldmap-icon-hover.png
│ │ └── worldmap-icon.png
│ │ ├── select
│ │ ├── OsrsSelect.css
│ │ └── OsrsSelect.tsx
│ │ └── worldmap
│ │ ├── WorldMap.css
│ │ ├── WorldMap.tsx
│ │ ├── WorldMapModal.css
│ │ ├── WorldMapModal.tsx
│ │ ├── close-button-hover.png
│ │ ├── close-button.png
│ │ ├── locations.json
│ │ ├── zoom-in.png
│ │ └── zoom-out.png
├── import-json.d.ts
├── index.css
├── index.tsx
├── java-random.d.ts
├── mapviewer
│ ├── Caches.ts
│ ├── Camera.ts
│ ├── Frustum.ts
│ ├── InputManager.ts
│ ├── MapManager.ts
│ ├── MapViewer.ts
│ ├── MapViewerApp.tsx
│ ├── MapViewerContainer.css
│ ├── MapViewerContainer.tsx
│ ├── MapViewerControls.tsx
│ ├── MapViewerRenderer.ts
│ ├── MapViewerRenderers.ts
│ ├── buffer
│ │ └── DataBuffer.ts
│ ├── data
│ │ ├── npc
│ │ │ ├── NpcSpawn.ts
│ │ │ ├── npc-spawns-2004.json
│ │ │ ├── npc-spawns-2004.json.LICENSE.txt
│ │ │ ├── npc-spawns-2009.json
│ │ │ ├── npc-spawns-2009.json.LICENSE.txt
│ │ │ └── npc-spawns-osrs.json
│ │ └── obj
│ │ │ ├── ObjSpawn.ts
│ │ │ └── obj-spawns.json
│ ├── webgl
│ │ ├── AnimationFrames.ts
│ │ ├── DrawRange.ts
│ │ ├── InteractType.ts
│ │ ├── Interactions.ts
│ │ ├── WebGLMapSquare.ts
│ │ ├── WebGLMapViewerRenderer.ts
│ │ ├── buffer
│ │ │ ├── ModelHashBuffer.ts
│ │ │ ├── SceneBuffer.ts
│ │ │ └── VertexBuffer.ts
│ │ ├── loader
│ │ │ ├── SdMapData.ts
│ │ │ ├── SdMapDataLoader.ts
│ │ │ └── SdMapLoaderInput.ts
│ │ ├── loc
│ │ │ ├── LocAnimated.ts
│ │ │ ├── LocAnimatedData.ts
│ │ │ ├── LocAnimatedGroup.ts
│ │ │ ├── SceneLocEntity.ts
│ │ │ └── SceneLocs.ts
│ │ ├── npc
│ │ │ ├── Npc.ts
│ │ │ ├── NpcData.ts
│ │ │ └── NpcSpawnGroup.ts
│ │ └── shaders
│ │ │ ├── ShaderUtil.ts
│ │ │ ├── Shaders.ts
│ │ │ ├── frame-fxaa.frag.glsl
│ │ │ ├── frame-fxaa.vert.glsl
│ │ │ ├── frame.frag.glsl
│ │ │ ├── frame.vert.glsl
│ │ │ ├── includes
│ │ │ ├── branchless-logic.glsl
│ │ │ ├── fog.glsl
│ │ │ ├── fxaa
│ │ │ │ ├── fxaa.glsl
│ │ │ │ └── texcoords.glsl
│ │ │ ├── height-map.glsl
│ │ │ ├── hsl-to-rgb.glsl
│ │ │ ├── material.glsl
│ │ │ ├── multi-draw.glsl
│ │ │ ├── scene-uniforms.glsl
│ │ │ ├── unpack-float.glsl
│ │ │ └── vertex.glsl
│ │ │ ├── main.frag.glsl
│ │ │ ├── main.vert.glsl
│ │ │ └── npc.vert.glsl
│ ├── webgpu
│ │ ├── WebGPUMapViewerRenderer.ts
│ │ └── shaders
│ │ │ ├── fullscreenTexturedQuad.wgsl
│ │ │ ├── red.frag.wgsl
│ │ │ └── triangle.vert.wgsl
│ └── worker
│ │ ├── MinimapData.ts
│ │ ├── RenderDataLoader.ts
│ │ ├── RenderDataWorker.ts
│ │ └── RenderDataWorkerPool.ts
├── media
│ ├── RuneScape-Bold-12.ttf
│ ├── RuneScape-Plain-11.ttf
│ ├── RuneScape-Plain-12.ttf
│ ├── interface-bg.png
│ └── interface-border.png
├── picogl.d.ts
├── picogl
│ └── PicoTexture.ts
├── react-app-env.d.ts
├── reportWebVitals.ts
├── rs
│ ├── Client.ts
│ ├── MathConstants.ts
│ ├── MenuEntry.ts
│ ├── cache
│ │ ├── ApiType.ts
│ │ ├── Archive.ts
│ │ ├── ArchiveFile.ts
│ │ ├── CacheFiles.ts
│ │ ├── CacheIndex.ts
│ │ ├── CacheInfo.ts
│ │ ├── CacheSystem.ts
│ │ ├── CacheType.ts
│ │ ├── ConfigType.ts
│ │ ├── Container.ts
│ │ ├── IndexType.ts
│ │ ├── loader
│ │ │ ├── CacheLoaderFactory.ts
│ │ │ ├── Dat2CacheLoaderFactory.ts
│ │ │ ├── DatCacheLoaderFactory.ts
│ │ │ └── LegacyCacheLoaderFactory.ts
│ │ ├── ref
│ │ │ ├── ArchiveFileReference.ts
│ │ │ ├── ArchiveReference.ts
│ │ │ └── ReferenceTable.ts
│ │ └── store
│ │ │ ├── CacheStore.ts
│ │ │ ├── MemoryStore.ts
│ │ │ ├── Sector.ts
│ │ │ └── SectorCluster.ts
│ ├── compression
│ │ ├── Bzip2.ts
│ │ ├── CompressionType.ts
│ │ ├── Gzip.ts
│ │ └── Gzip.web.ts
│ ├── config
│ │ ├── Type.ts
│ │ ├── TypeLoader.ts
│ │ ├── bastype
│ │ │ ├── BasType.ts
│ │ │ └── BasTypeLoader.ts
│ │ ├── defaults
│ │ │ ├── DefaultsGroup.ts
│ │ │ └── GraphicsDefaults.ts
│ │ ├── enumtype
│ │ │ └── EnumType.ts
│ │ ├── floortype
│ │ │ ├── FloorType.ts
│ │ │ ├── FloorTypeLoader.ts
│ │ │ ├── OverlayFloorType.ts
│ │ │ └── UnderlayFloorType.ts
│ │ ├── idktype
│ │ │ └── IdkType.ts
│ │ ├── invtype
│ │ │ └── InvType.ts
│ │ ├── loctype
│ │ │ ├── LocModelLoader.ts
│ │ │ ├── LocModelType.ts
│ │ │ ├── LocType.ts
│ │ │ └── LocTypeLoader.ts
│ │ ├── mapscenetype
│ │ │ ├── MapSceneType.ts
│ │ │ └── MapSceneTypeLoader.ts
│ │ ├── meltype
│ │ │ ├── MapElementType.ts
│ │ │ └── MapElementTypeLoader.ts
│ │ ├── npctype
│ │ │ ├── NpcModelLoader.ts
│ │ │ ├── NpcType.ts
│ │ │ └── NpcTypeLoader.ts
│ │ ├── objtype
│ │ │ ├── ObjModelLoader.ts
│ │ │ ├── ObjStackability.ts
│ │ │ ├── ObjType.ts
│ │ │ └── ObjTypeLoader.ts
│ │ ├── paramtype
│ │ │ └── ParamType.ts
│ │ ├── questtype
│ │ │ ├── QuestState.ts
│ │ │ ├── QuestType.ts
│ │ │ └── QuestTypeLoader.ts
│ │ ├── seqtype
│ │ │ ├── SeqType.ts
│ │ │ └── SeqTypeLoader.ts
│ │ ├── spotanimtype
│ │ │ └── SpotAnimType.ts
│ │ ├── structtype
│ │ │ └── StructType.ts
│ │ └── vartype
│ │ │ ├── VarManager.ts
│ │ │ ├── bit
│ │ │ ├── VarBitType.ts
│ │ │ └── VarBitTypeLoader.ts
│ │ │ ├── client
│ │ │ ├── VarClientIntType.ts
│ │ │ └── VarClientStrType.ts
│ │ │ └── player
│ │ │ └── VarPlayerType.ts
│ ├── crypto
│ │ └── Xtea.ts
│ ├── graphics
│ │ ├── Rasterizer2D.ts
│ │ └── Rasterizer3D.ts
│ ├── io
│ │ └── ByteBuffer.ts
│ ├── map
│ │ ├── MapFileIndex.ts
│ │ ├── MapFileLoader.ts
│ │ └── MapImageRenderer.ts
│ ├── model
│ │ ├── FaceNormal.ts
│ │ ├── Model.ts
│ │ ├── ModelData.ts
│ │ ├── ModelLoader.ts
│ │ ├── TextureMapper.ts
│ │ ├── VertexNormal.ts
│ │ ├── seq
│ │ │ ├── SeqBase.ts
│ │ │ ├── SeqBaseLoader.ts
│ │ │ ├── SeqFrame.ts
│ │ │ ├── SeqFrameLoader.ts
│ │ │ ├── SeqFrameMap.ts
│ │ │ └── SeqTransformType.ts
│ │ └── skeletal
│ │ │ ├── Curve.ts
│ │ │ ├── CurveInterp.ts
│ │ │ ├── CurveInterpType.ts
│ │ │ ├── CurveType.ts
│ │ │ ├── MatrixPool.ts
│ │ │ ├── QuatPool.ts
│ │ │ ├── SkeletalBase.ts
│ │ │ ├── SkeletalBone.ts
│ │ │ ├── SkeletalSeq.ts
│ │ │ ├── SkeletalSeqLoader.ts
│ │ │ └── SkeletalTransformType.ts
│ ├── pathfinder
│ │ ├── CollisionStrategy.ts
│ │ ├── Pathfinder.ts
│ │ ├── RouteStrategy.ts
│ │ └── flag
│ │ │ ├── CollisionFlag.ts
│ │ │ └── DirectionFlag.ts
│ ├── scene
│ │ ├── CollisionMap.ts
│ │ ├── FloorDecoration.ts
│ │ ├── Loc.ts
│ │ ├── Scene.ts
│ │ ├── SceneBuilder.ts
│ │ ├── SceneLoc.ts
│ │ ├── SceneTile.ts
│ │ ├── SceneTileModel.ts
│ │ ├── Wall.ts
│ │ ├── WallDecoration.ts
│ │ └── entity
│ │ │ ├── Entity.ts
│ │ │ ├── EntityTag.ts
│ │ │ └── LocEntity.ts
│ ├── sprite
│ │ ├── IndexedSprite.ts
│ │ ├── SpriteLoader.ts
│ │ └── SpritePixels.ts
│ ├── texture
│ │ ├── DatTextureLoader.ts
│ │ ├── OldProceduralTextureLoader.ts
│ │ ├── ProceduralTextureLoader.ts
│ │ ├── SpriteTextureLoader.ts
│ │ ├── TextureCombineMode.ts
│ │ ├── TextureLoader.ts
│ │ ├── TextureMaterial.ts
│ │ └── procedural
│ │ │ ├── ProceduralTexture.ts
│ │ │ ├── TextureGenerator.ts
│ │ │ ├── cache
│ │ │ ├── ColourImageCache.ts
│ │ │ └── MonochromeImageCache.ts
│ │ │ └── operation
│ │ │ ├── ArithmeticOperation.ts
│ │ │ ├── BinaryOperation.ts
│ │ │ ├── BlurOperation.ts
│ │ │ ├── BricksOperation.ts
│ │ │ ├── BrightnessOperation.ts
│ │ │ ├── ClampOperation.ts
│ │ │ ├── ColorEdgeDetectorOperation.ts
│ │ │ ├── ColourStripOperation.ts
│ │ │ ├── ConstantColourOperation.ts
│ │ │ ├── ConstantMonochromeOperation.ts
│ │ │ ├── CurveOperation.ts
│ │ │ ├── DiagonalGradientOperation.ts
│ │ │ ├── EmbossOperation.ts
│ │ │ ├── GradientOperation.ts
│ │ │ ├── GrayScaleOperation.ts
│ │ │ ├── HerringboneOperation.ts
│ │ │ ├── HorizontalGradientOperation.ts
│ │ │ ├── HslOperation.ts
│ │ │ ├── InvertOperation.ts
│ │ │ ├── IrregularBricksOperation.ts
│ │ │ ├── KaleidoscopeOperation.ts
│ │ │ ├── LineNoiseOperation.ts
│ │ │ ├── MandelbrotOperation.ts
│ │ │ ├── MirrorOperation.ts
│ │ │ ├── MixerOperation.ts
│ │ │ ├── MonochromeEdgeDetectorOperation.ts
│ │ │ ├── Operation37.ts
│ │ │ ├── PerlinNoiseOperation.ts
│ │ │ ├── PseudoRandomNoiseOperation.ts
│ │ │ ├── RangeOperation.ts
│ │ │ ├── RasterizerOperation.ts
│ │ │ ├── SpriteSourceOperation.ts
│ │ │ ├── SquareWaveformOperation.ts
│ │ │ ├── TextureOperation.ts
│ │ │ ├── TextureOperationFactory.ts
│ │ │ ├── TextureSourceOperation.ts
│ │ │ ├── TilingOperation.ts
│ │ │ ├── TilingSpriteOperation.ts
│ │ │ ├── TrigWarpOperation.ts
│ │ │ ├── VerticalGradientOperation.ts
│ │ │ ├── VoronoiNoiseOperation.ts
│ │ │ └── WeaveOperation.ts
│ └── util
│ │ ├── ArrayUtils.ts
│ │ ├── ColorUtil.ts
│ │ ├── HeightCalc.ts
│ │ └── StringUtil.ts
├── setupTests.ts
├── shaders.d.ts
└── util
│ ├── BytesUtil.ts
│ ├── DeviceUtil.ts
│ ├── FloatUtil.ts
│ ├── Hasher.ts
│ └── MathUtil.ts
├── tsconfig.json
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
25 | caches/
26 |
--------------------------------------------------------------------------------
/.husky/.gitignore:
--------------------------------------------------------------------------------
1 | _
2 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | . "$(dirname "$0")/_/husky.sh"
3 |
4 | npx lint-staged
5 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
25 | # Deliberately minified file
26 | *.min.*
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "tabWidth": 4,
3 | "printWidth": 100,
4 | "trailingComma": "all",
5 | "semi": true,
6 | "importOrder": ["^[./]"],
7 | "importOrderSeparation": true,
8 | "importOrderSortSpecifiers": true,
9 | "plugins": ["@trivago/prettier-plugin-sort-imports"]
10 | }
11 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | BSD 2-Clause License
2 |
3 | Copyright (c) 2022-2023, dennisdev
4 | All rights reserved.
5 |
6 | Redistribution and use in source and binary forms, with or without
7 | modification, are permitted provided that the following conditions are met:
8 |
9 | * Redistributions of source code must retain the above copyright notice, this
10 | list of conditions and the following disclaimer.
11 |
12 | * Redistributions in binary form must reproduce the above copyright notice,
13 | this list of conditions and the following disclaimer in the documentation
14 | and/or other materials provided with the distribution.
15 |
16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # RuneScape Map Viewer
2 |
3 | [Website](https://osrs.world) | [Discord](https://discord.gg/WfEWPE5wUd)
4 |
5 | A webapp for exploring current and historical versions of RuneScape.
6 |
7 |
8 |
9 | ## Running locally
10 |
11 | ```
12 | $ git clone https://github.com/dennisdev/rs-map-viewer.git
13 | $ cd rs-map-viewer
14 | $ yarn install
15 | $ yarn run download-caches
16 | $ yarn start
17 | ```
18 |
19 | ## Credits
20 |
21 | - Jagex
22 | - [RuneLite](https://github.com/runelite/runelite)
23 | - [OpenRS2 Archive](https://archive.openrs2.org/) - Caches
24 | - [RuneScape Archive](https://rs-archive.github.io/) - Caches
25 | - [OSRS Wiki](https://oldschool.runescape.wiki/) - Item spawns
26 | - [2004scape](https://github.com/2004scape/Server) - Npc spawns
27 | - [2009scape](https://gitlab.com/2009scape/2009scape) - Npc spawns
28 | - [RuneStar](https://github.com/RuneStar/fonts) - Fonts
29 | - [Blurite](https://github.com/blurite/pathfinder) - Some pathfinding stuff
30 | - [RuneApps Model Viewer](https://github.com/skillbert/rsmv) - Some procedural texture stuff
31 |
--------------------------------------------------------------------------------
/craco.config.js:
--------------------------------------------------------------------------------
1 | const { when, whenDev, addBeforeLoader, loaderByName } = require("@craco/craco");
2 |
3 | const ThreadsPlugin = require("threads-plugin");
4 | const JsonMinimizerPlugin = require("json-minimizer-webpack-plugin");
5 |
6 | const express = require("express");
7 |
8 | module.exports = {
9 | webpack: {
10 | configure: (webpackConfig) => {
11 | const glslLoader = {
12 | test: /\.(glsl|vs|fs)$/,
13 | loader: "ts-shader-loader",
14 | };
15 |
16 | // Kind of a hack to get the glsl loader to work
17 | // https://github.com/dilanx/craco/issues/486
18 | for (const rule of webpackConfig.module.rules) {
19 | if (rule.oneOf) {
20 | rule.oneOf.unshift(glslLoader);
21 | break;
22 | }
23 | }
24 |
25 | webpackConfig.module.rules.push({
26 | resourceQuery: /url/,
27 | type: "asset/resource",
28 | });
29 | webpackConfig.module.rules.push({
30 | resourceQuery: /source/,
31 | type: "asset/source",
32 | });
33 |
34 | // addBeforeLoader(webpackConfig, loaderByName('file-loader'), glslLoader);
35 |
36 | webpackConfig.resolve.fallback = {
37 | fs: false,
38 | };
39 |
40 | webpackConfig.resolve.extensions = [".web.js", ...webpackConfig.resolve.extensions];
41 |
42 | webpackConfig.optimization.minimizer.push(new JsonMinimizerPlugin());
43 |
44 | return webpackConfig;
45 | },
46 | plugins: [new ThreadsPlugin()],
47 | },
48 | devServer: {
49 | headers: {
50 | "Cross-Origin-Opener-Policy": "same-origin",
51 | "Cross-Origin-Embedder-Policy": "require-corp",
52 | },
53 | client: {
54 | overlay: {
55 | errors: true,
56 | warnings: false,
57 | runtimeErrors: (error) => {
58 | if (error instanceof DOMException && error.name === "AbortError") {
59 | return false;
60 | }
61 | return true;
62 | },
63 | },
64 | },
65 | setupMiddlewares: (middlewares, devServer) => {
66 | if (!devServer) {
67 | throw new Error("webpack-dev-server is not defined");
68 | }
69 |
70 | devServer.app.use("/caches", express.static("caches"));
71 |
72 | return middlewares;
73 | },
74 | },
75 | };
76 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "rs-map-viewer",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@foxglove/wasm-bz2": "^0.1.1",
7 | "@testing-library/jest-dom": "^5.14.1",
8 | "@testing-library/react": "^13.0.0",
9 | "@testing-library/user-event": "^13.2.1",
10 | "@types/jest": "^27.0.1",
11 | "@types/node": "^16.7.13",
12 | "@types/react": "^18.0.0",
13 | "@types/react-dom": "^18.0.0",
14 | "@webgpu/types": "^0.1.40",
15 | "bzip2": "^0.1.1",
16 | "denque": "^2.1.0",
17 | "fast-memoize": "^2.5.2",
18 | "file-saver": "^2.0.5",
19 | "gl-matrix": "^3.4.3",
20 | "gzip-js": "^0.3.2",
21 | "java-random": "^0.4.0",
22 | "js-xxhash": "^2.0.0",
23 | "jszip": "^3.10.1",
24 | "leva": "^0.9.35",
25 | "picogl": "^0.17.9",
26 | "react": "^18.2.0",
27 | "react-dom": "^18.2.0",
28 | "react-joystick-component": "^6.2.1",
29 | "react-modal": "^3.16.1",
30 | "react-router-dom": "^6.14.2",
31 | "react-scripts": "5.0.1",
32 | "react-select": "^5.7.4",
33 | "threads": "^1.7.0",
34 | "typescript": "^5.1.6",
35 | "usehooks-ts": "^2.9.1",
36 | "wasm-gzip": "^1.0.1",
37 | "web-vitals": "^2.1.0",
38 | "webfontloader": "^1.6.28",
39 | "xxhash-wasm": "^1.0.2"
40 | },
41 | "scripts": {
42 | "start": "craco start",
43 | "build": "craco build",
44 | "test": "craco test",
45 | "lint": "prettier --write \"./**/*.{js,ts,jsx,tsx,css,md}\"",
46 | "prepare": "husky install",
47 | "download-caches": "node scripts/download-caches.js",
48 | "export-textures": "npx tsx scripts/cache/export-textures.ts",
49 | "export-height-map": "npx tsx scripts/cache/export-height-map.ts"
50 | },
51 | "eslintConfig": {
52 | "extends": [
53 | "react-app",
54 | "react-app/jest"
55 | ]
56 | },
57 | "browserslist": {
58 | "production": [
59 | "chrome >= 67",
60 | "edge >= 79",
61 | "firefox >= 68",
62 | "opera >= 54",
63 | "safari >= 14"
64 | ],
65 | "development": [
66 | "last 1 chrome version",
67 | "last 1 firefox version",
68 | "last 1 safari version"
69 | ]
70 | },
71 | "husky": {
72 | "hooks": {
73 | "pre-commit": "lint-staged"
74 | }
75 | },
76 | "lint-staged": {
77 | "*.{js,ts,jsx,tsx,css,md}": "prettier --write"
78 | },
79 | "devDependencies": {
80 | "@craco/craco": "^7.1.0",
81 | "@trivago/prettier-plugin-sort-imports": "^4.3.0",
82 | "@types/file-saver": "^2.0.7",
83 | "@types/gzip-js": "^0.3.3",
84 | "@types/react-modal": "^3.16.0",
85 | "@types/webfontloader": "^1.6.35",
86 | "adm-zip": "^0.5.10",
87 | "husky": "^8.0.3",
88 | "json-minimizer-webpack-plugin": "^4.0.0",
89 | "lint-staged": "^13.2.3",
90 | "path": "^0.12.7",
91 | "prettier": "^3.0.0",
92 | "sharp": "^0.32.6",
93 | "threads-plugin": "^1.4.0",
94 | "ts-node": "^10.9.1",
95 | "ts-shader-loader": "^2.0.2"
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/public/.htaccess:
--------------------------------------------------------------------------------
1 | RewriteEngine On
2 | RewriteBase /
3 | RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
4 | RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
5 |
6 |