source: binary-improvements/MapRendering/Web/Handlers/ItemIconHandler.cs @ 251

Last change on this file since 251 was 251, checked in by peter.souza, 5 years ago

Enemies (zombies and hostile animal entities) are now shown on the map as Hostiles and require permission level 'webapi.gethostilelocation' for web viewers to see.

Animals (non-hostile entities) are now shown on the map as Animals and require permission level 'webapi.getanimalslocation' for web viewers to see.

Permission level for 'webapi.viewallclaims' is now required for a viewer to see all claims, otherwise the permission level for 'webapi.getlandclaims' will only show viewer-owned claims. A viewer requires both 'webapi.getlandclaims' and 'webapi.viewallclaims' to be set for all claims to show (you can't just set 'webapi.viewallclaims').
https://7daystodie.com/forums/showthread.php?12837-Improvements-for-the-dedicated-server&p=317405&viewfull=1#post317405

Permission level for 'webapi.viewallplayers' is now required for a viewer to see all players, otherwise the permission level for 'webapi.getplayerslocation' will only show the player for the currently-authenticated viewer. A viewer requires both 'webapi.getplayerslocation' and 'webapi.viewallplayers' to be set for all players to show (you can't just set 'webapi.viewallplayers').
https://7daystodie.com/forums/showthread.php?12837-Improvements-for-the-dedicated-server&p=317405&viewfull=1#post317405

Banned players are now hidden from the web map.
https://7daystodie.com/forums/showthread.php?12837-Improvements-for-the-dedicated-server&p=320702&viewfull=1#post320702

Items using 'CustomIcon' and 'CustomIconTint' are now supported (although the exact tinting may not be perfectly the same as the game).
https://7daystodie.com/forums/showthread.php?12837-Improvements-for-the-dedicated-server&p=317117&viewfull=1#post317117
https://7daystodie.com/forums/showthread.php?12837-Improvements-for-the-dedicated-server&p=317679&viewfull=1#post317679

Map marker icons for players, hostiles, and animals have been updated.

File size: 5.9 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Net;
4using System.Threading;
5
6using UnityEngine;
7
8namespace AllocsFixes.NetConnections.Servers.Web.Handlers
9{
10        public class ItemIconHandler : PathHandler
11        {
12                private string staticPart;
13                private bool logMissingFiles;
14        private Dictionary<string, byte[]> icons = new Dictionary<string, byte[]> ();
15        private bool loaded = false;
16
17                public ItemIconHandler (string staticPart, bool logMissingFiles, string moduleName = null) : base(moduleName) {
18                        this.staticPart = staticPart;
19                        this.logMissingFiles = logMissingFiles;
20                }
21
22                public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, WebConnection user, int permissionLevel) {
23                        if (!loaded) {
24                                if (!LoadIcons ()) {
25                                        resp.StatusCode = (int)HttpStatusCode.NotFound;
26                                        Log.Out ("Web:IconHandler: Could not load icons");
27                                        return;
28                                }
29                        }
30
31            // BEGIN CHANGED BY PSOUZA4
32                        string requestFileName = req.Url.AbsolutePath.Remove (0, staticPart.Length);
33                        requestFileName = requestFileName.Remove (requestFileName.LastIndexOf ('.'));
34
35            string requestColorTintHex = string.Empty;
36           
37            // Chose a split instead of using a querystring variable in the URI, but that may arguably be cleaner
38            if (requestFileName.Contains("@@")) {
39                try {
40                    string[] tempTintingOptions = requestFileName.Split (new string[] { "@@" }, StringSplitOptions.RemoveEmptyEntries);
41                    requestFileName = tempTintingOptions [0];
42                    requestColorTintHex = tempTintingOptions [1].Trim ().ToUpper ();
43                }
44                catch { }
45            }
46
47            if (icons.ContainsKey (requestFileName) && req.Url.AbsolutePath.ToLower ().EndsWith(".png")) {
48                                resp.ContentType = MimeType.GetMimeType (".png");
49
50                byte[] itemIconData = icons [requestFileName];
51
52                // Note: optionally split this code into a ImageMultiplyBlend method
53                if (!string.IsNullOrEmpty (requestColorTintHex) && (requestColorTintHex != "FFFFFF")) {
54                    try {
55                        System.Drawing.Color colorTint = System.Drawing.ColorTranslator.FromHtml ("#" + requestColorTintHex);
56                        System.Drawing.Bitmap image = (System.Drawing.Bitmap)PetesUtils.GetImageFromBytes (itemIconData);
57
58                        for (var x = 0; x < image.Width; x++) {
59                            for (int y = 0; y < image.Height; y++) {
60                                System.Drawing.Color originalColor = image.GetPixel (x, y);
61                                System.Drawing.Color changedColor = originalColor;
62
63                                // Only change the icon tinting if the alpha channel is fully opaque
64                                if (originalColor.A == 255) {
65                                    // based on http://stackoverflow.com/questions/3837757/multiply-two-images-in-c-sharp-as-multiply-two-layers-in-photoshop
66
67                                    double component_R = (((double)originalColor.R) * ((double)colorTint.R)) / 255.0;
68                                    double component_G = (((double)originalColor.G) * ((double)colorTint.G)) / 255.0;
69                                    double component_B = (((double)originalColor.B) * ((double)colorTint.B)) / 255.0;
70
71                                    if (component_R > 255.0) component_R = 255.0;
72                                    if (component_G > 255.0) component_G = 255.0;
73                                    if (component_B > 255.0) component_B = 255.0;
74
75                                    // multiply blend shouldn't ever calculate below 0, but for completeness let's leave in this logic
76                                    if (component_R < 0.0) component_R = 0.0;
77                                    if (component_G < 0.0) component_G = 0.0;
78                                    if (component_B < 0.0) component_B = 0.0;
79
80                                    changedColor = System.Drawing.Color.FromArgb (originalColor.A, (int)component_R, (int)component_G, (int)component_B);
81                                }                               
82
83                                image.SetPixel (x, y, changedColor);
84                            }
85                        }
86
87                        itemIconData = PetesUtils.SaveImage_ToBytes (image, true);
88                    }
89                    catch { }
90                }
91
92                                resp.ContentLength64 = itemIconData.Length;
93                                resp.OutputStream.Write (itemIconData, 0, itemIconData.Length);
94                // END CHANGED BY PSOUZA4
95                        } else {
96                                resp.StatusCode = (int)HttpStatusCode.NotFound;
97                                if (logMissingFiles)
98                                        Log.Out ("Web:IconHandler:FileNotFound: \"" + req.Url.AbsolutePath + "\" ");
99                                return;
100                        }
101                }
102
103                private bool LoadIcons () {
104                        lock (icons) {
105                                if (loaded) {
106                                        return true;
107                                }
108
109                                GameObject atlasObj = GameObject.Find ("/NGUI Root (2D)/ItemIconAtlas");
110                                if (atlasObj == null) {
111                                        Log.Error ("Web:IconHandler: Atlas object not found");
112                                        loaded = true;
113                                        return false;
114                                }
115                                DynamicUIAtlas atlas = atlasObj.GetComponent<DynamicUIAtlas> ();
116                                if (atlas == null) {
117                                        Log.Error ("Web:IconHandler: Atlas component not found");
118                                        loaded = true;
119                                        return false;
120                                }
121
122                                Texture2D atlasTex = atlas.texture as Texture2D;
123
124                                foreach (UISpriteData data in atlas.spriteList) {
125                                        string name = data.name;
126                                        Texture2D tex = new Texture2D (data.width, data.height, TextureFormat.ARGB32, false);
127                                        tex.SetPixels (atlasTex.GetPixels (data.x, atlasTex.height - data.height - data.y, data.width, data.height));
128                                        byte[] pixData = tex.EncodeToPNG ();
129
130                                        icons.Add (name, pixData);
131                                        UnityEngine.Object.Destroy (tex);
132                                }
133
134                                loaded = true;
135                                Log.Out ("Web:IconHandler: Icons loaded");
136
137                                return true;
138                        }
139                }
140        }
141}
142
Note: See TracBrowser for help on using the repository browser.