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

Last change on this file since 252 was 251, checked in by peter.souza, 10 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
RevLine 
[251]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.