source: binary-improvements/7dtd-server-fixes/src/FileCache/MapTileCache.cs @ 324

Last change on this file since 324 was 324, checked in by alloc, 3 years ago

A17 compatibility changes

File size: 2.2 KB
Line 
1using System;
2using System.IO;
3using UnityEngine;
4
5namespace AllocsFixes.FileCache
6{
7        // Special "cache" for map tile folder as both map rendering and webserver access files in there.
8        // Only map rendering tiles are cached. Writing is done by WriteThrough.
9        public class MapTileCache : AbstractCache
10        {
11                private struct CurrentZoomFile
12                {
13                        public string filename;
14                        public byte[] data;
15                }
16
17                private CurrentZoomFile[] cache;
18
19                private byte[] transparentTile;
20
21                public MapTileCache (int _tileSize)
22                {
23                        Texture2D tex = new Texture2D (_tileSize, _tileSize);
24                        Color nullColor = new Color (0, 0, 0, 0);
25                        for (int x = 0; x < _tileSize; x++) {
26                                for (int y = 0; y < _tileSize; y++) {
27                                        tex.SetPixel (x, y, nullColor);
28                                }
29                        }
30                        transparentTile = tex.EncodeToPNG ();
31                        UnityEngine.Object.Destroy (tex);
32                }
33
34                public void SetZoomCount (int count)
35                {
36                        cache = new CurrentZoomFile[count];
37                }
38
39                public byte[] LoadTile (int zoomlevel, string filename)
40                {
41                        try {
42                                lock (cache) {
43                                        if (cache [zoomlevel].filename == null || !cache [zoomlevel].filename.Equals (filename)) {
44                                                cache [zoomlevel].filename = filename;
45
46                                                if (!File.Exists (filename)) {
47                                                        cache [zoomlevel].data = null;
48                                                        return null;
49                                                }
50
51                                                cache [zoomlevel].data = File.ReadAllBytes (filename);
52                                        }
53                                        return cache [zoomlevel].data;
54                                }
55                        } catch (Exception e) {
56                                Log.Out ("Error in MapTileCache.LoadTile: " + e);
57                        }
58                        return null;
59                }
60
61                public void SaveTile (int zoomlevel, byte[] content)
62                {
63                        try {
64                                lock (cache) {
65                                        if (cache [zoomlevel].filename != null) {
66                                                cache [zoomlevel].data = content;
67                                                File.WriteAllBytes (cache [zoomlevel].filename, content);
68                                        }
69                                }
70                        } catch (Exception e) {
71                                Log.Out ("Error in MapTileCache.SaveTile: " + e);
72                        }
73                }
74
75                public override byte[] GetFileContent (string filename)
76                {
77                        try {
78                                lock (cache) {
79                                        foreach (CurrentZoomFile czf in cache) {
80                                                if (czf.filename != null && czf.filename.Equals (filename))
81                                                        return czf.data;
82                                        }
83
84                                        if (!File.Exists (filename)) {
85                                                return transparentTile;
86                                        }
87                                        return File.ReadAllBytes (filename);
88                                }
89                        } catch (Exception e) {
90                                Log.Out ("Error in MapTileCache.GetFileContent: " + e);
91                        }
92                        return null;
93                }
94
95        }
96}
97
Note: See TracBrowser for help on using the repository browser.