Changeset 253 for binary-improvements/MapRendering
- Timestamp:
- Dec 12, 2015, 4:08:53 PM (9 years ago)
- Location:
- binary-improvements/MapRendering
- Files:
-
- 1 deleted
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
binary-improvements/MapRendering/ModInfo.xml
r250 r253 5 5 <Description value="Render the game map to image map tiles as it is uncovered" /> 6 6 <Author value="Christian 'Alloc' Illy" /> 7 <Version value=" 9" />7 <Version value="10" /> 8 8 <Website value="http://7dtd.illy.bz" /> 9 9 </ModInfo> -
binary-improvements/MapRendering/Web/API/GetLandClaims.cs
r251 r253 7 7 namespace AllocsFixes.NetConnections.Servers.Web.API 8 8 { 9 public class GetLandClaims : WebAPI 10 { 11 public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, WebConnection user, int permissionLevel) 12 { 13 string ViewersSteamID = string.Empty; 14 ulong lViewersSteamID = 0L; 9 public class GetLandClaims : WebAPI { 10 public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, WebConnection user, int permissionLevel) { 11 string requestedSteamID = string.Empty; 15 12 16 13 if (req.QueryString ["steamid"] != null) { 17 ViewersSteamID = req.QueryString ["steamid"]; 18 if (ViewersSteamID.Length != 17 || !ulong.TryParse (ViewersSteamID, out lViewersSteamID)) { 14 ulong lViewersSteamID; 15 requestedSteamID = req.QueryString ["steamid"]; 16 if (requestedSteamID.Length != 17 || !ulong.TryParse (requestedSteamID, out lViewersSteamID)) { 19 17 resp.StatusCode = (int)HttpStatusCode.BadRequest; 20 18 Web.SetResponseTextContent (resp, "Invalid SteamID given"); … … 23 21 } 24 22 25 26 try { user = user ?? new WebConnection ("", "", 0L); } catch { } 23 // default user, cheap way to avoid 'null reference exception' 24 user = user ?? new WebConnection ("", "", 0L); 27 25 28 bool bViewAll = false; try { bViewAll = user.CanViewAllClaims (permissionLevel); } catch { } 26 bool bViewAll = WebConnection.CanViewAllClaims (permissionLevel); 29 27 30 28 JSONObject result = new JSONObject (); … … 34 32 result.Add ("claimowners", claimOwners); 35 33 36 Dictionary<Vector3i, PersistentPlayerData> d = GameManager.Instance.GetPersistentPlayerList ().m_lpBlockMap; 37 if (d != null) { 38 World w = GameManager.Instance.World; 39 Dictionary<PersistentPlayerData, List<Vector3i>> owners = new Dictionary<PersistentPlayerData, List<Vector3i>> (); 34 LandClaimList.OwnerFilter[] ownerFilters = null; 35 if (!string.IsNullOrEmpty (requestedSteamID) || !bViewAll) { 36 if (!string.IsNullOrEmpty (requestedSteamID) && !bViewAll) { 37 ownerFilters = new LandClaimList.OwnerFilter[] { 38 LandClaimList.SteamIdFilter (user.SteamID.ToString ()), 39 LandClaimList.SteamIdFilter (requestedSteamID) 40 }; 41 } else if (!bViewAll) { 42 ownerFilters = new LandClaimList.OwnerFilter[] { LandClaimList.SteamIdFilter (user.SteamID.ToString ()) }; 43 } else { 44 ownerFilters = new LandClaimList.OwnerFilter[] { LandClaimList.SteamIdFilter (requestedSteamID) }; 45 } 46 } 47 LandClaimList.PositionFilter[] posFilters = null; 40 48 41 // Add all owners to this temporary list regardless of permissions 42 foreach (KeyValuePair<Vector3i, PersistentPlayerData> kvp in d) { 43 if (kvp.Value.PlayerId.Equals (ViewersSteamID)) { 44 if (!owners.ContainsKey (kvp.Value)) { 45 owners.Add (kvp.Value, new List<Vector3i> ()); 46 } 47 owners [kvp.Value].Add (kvp.Key); 49 Dictionary<PersistentData.Player, List<Vector3i>> claims = LandClaimList.GetLandClaims (ownerFilters, posFilters); 50 51 foreach (KeyValuePair<PersistentData.Player, List<Vector3i>> kvp in claims) { 52 53 try { 54 JSONObject owner = new JSONObject (); 55 claimOwners.Add (owner); 56 57 owner.Add ("steamid", new JSONString (kvp.Key.SteamID)); 58 owner.Add ("claimactive", new JSONBoolean (kvp.Key.LandProtectionActive)); 59 60 if (kvp.Key.Name.Length > 0) { 61 owner.Add ("playername", new JSONString (kvp.Key.Name)); 62 } else { 63 owner.Add ("playername", new JSONNull ()); 48 64 } 49 }50 65 51 // Loop through all claim owners... 52 foreach (KeyValuePair<PersistentPlayerData, List<Vector3i>> kvp in owners) { 53 try 54 { 55 // ... but only show us claims that are from the current web user or if the current web user can see all claims regardless of ownership 56 if (kvp.Key.PlayerId.Equals (ViewersSteamID) || bViewAll) 57 { 58 string currentSteamID = kvp.Key.PlayerId; 59 bool isActive = w.IsLandProtectionValidForPlayer (kvp.Key); 66 JSONArray claimsJson = new JSONArray (); 67 owner.Add ("claims", claimsJson); 60 68 61 JSONObject owner = new JSONObject (); 62 claimOwners.Add (owner); 69 foreach (Vector3i v in kvp.Value) { 70 JSONObject claim = new JSONObject (); 71 claim.Add ("x", new JSONNumber (v.x)); 72 claim.Add ("y", new JSONNumber (v.y)); 73 claim.Add ("z", new JSONNumber (v.z)); 63 74 64 owner.Add("steamid", new JSONString (currentSteamID)); 65 owner.Add("claimactive", new JSONBoolean (isActive)); 66 67 if (PersistentContainer.Instance.Players [currentSteamID, false] != null) { 68 owner.Add("playername", new JSONString (PersistentContainer.Instance.Players [currentSteamID, false].Name)); 69 } else { 70 owner.Add("playername", new JSONNull ()); 71 } 72 73 JSONArray claims = new JSONArray (); 74 owner.Add ("claims", claims); 75 76 foreach (Vector3i v in kvp.Value) { 77 JSONObject claim = new JSONObject (); 78 claim.Add ("x", new JSONNumber (v.x)); 79 claim.Add ("y", new JSONNumber (v.y)); 80 claim.Add ("z", new JSONNumber (v.z)); 81 82 claims.Add (claim); 83 } 84 } 85 } 86 catch { } 75 claimsJson.Add (claim); 76 } 77 } catch { 87 78 } 88 79 } -
binary-improvements/MapRendering/Web/API/GetLog.cs
r250 r253 15 15 } 16 16 17 if (req.QueryString ["lastLine"] == null || !int.TryParse (req.QueryString ["lastLine"], out lastLine)) {18 lastLine = -1;19 }20 21 17 JSONObject result = new JSONObject (); 22 18 23 List<LogBuffer.LogEntry> logEntries = LogBuffer.Instance.GetRange (ref firstLine, reflastLine);19 List<LogBuffer.LogEntry> logEntries = LogBuffer.Instance.GetRange (ref firstLine, 50, out lastLine); 24 20 25 21 JSONArray entries = new JSONArray (); -
binary-improvements/MapRendering/Web/API/GetPlayerInventory.cs
r251 r253 8 8 { 9 9 public class GetPlayerInventory : WebAPI { 10 10 11 public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, WebConnection user, int permissionLevel) { 11 12 if (req.QueryString ["steamid"] == null) { … … 38 39 DoInventory (bag, inv.bag); 39 40 40 AddEquipment (equipment, "head", inv.equipment, XMLData.Item.EnumEquipmentSlot.Head, NGuiInvGridEquipment.EnumClothingLayer.Middle);41 AddEquipment (equipment, "eyes", inv.equipment, XMLData.Item.EnumEquipmentSlot.Eyes, NGuiInvGridEquipment.EnumClothingLayer.Middle);42 AddEquipment (equipment, "face", inv.equipment, XMLData.Item.EnumEquipmentSlot.Face, NGuiInvGridEquipment.EnumClothingLayer.Middle);41 AddEquipment (equipment, "head", inv.equipment, EquipmentSlots.Headgear); 42 AddEquipment (equipment, "eyes", inv.equipment, EquipmentSlots.Eyewear); 43 AddEquipment (equipment, "face", inv.equipment, EquipmentSlots.Face); 43 44 44 AddEquipment (equipment, "armor", inv.equipment, XMLData.Item.EnumEquipmentSlot.Chest, NGuiInvGridEquipment.EnumClothingLayer.Outer);45 AddEquipment (equipment, "jacket", inv.equipment, XMLData.Item.EnumEquipmentSlot.Chest, NGuiInvGridEquipment.EnumClothingLayer.Middle);46 AddEquipment (equipment, "shirt", inv.equipment, XMLData.Item.EnumEquipmentSlot.Chest, NGuiInvGridEquipment.EnumClothingLayer.Inner);45 AddEquipment (equipment, "armor", inv.equipment, EquipmentSlots.ChestArmor); 46 AddEquipment (equipment, "jacket", inv.equipment, EquipmentSlots.Jacket); 47 AddEquipment (equipment, "shirt", inv.equipment, EquipmentSlots.Shirt); 47 48 48 AddEquipment (equipment, "legarmor", inv.equipment, XMLData.Item.EnumEquipmentSlot.Legs, NGuiInvGridEquipment.EnumClothingLayer.Outer);49 AddEquipment (equipment, "pants", inv.equipment, XMLData.Item.EnumEquipmentSlot.Legs, NGuiInvGridEquipment.EnumClothingLayer.Inner);50 AddEquipment (equipment, "boots", inv.equipment, XMLData.Item.EnumEquipmentSlot.Feet, NGuiInvGridEquipment.EnumClothingLayer.Inner);49 AddEquipment (equipment, "legarmor", inv.equipment, EquipmentSlots.LegArmor); 50 AddEquipment (equipment, "pants", inv.equipment, EquipmentSlots.Legs); 51 AddEquipment (equipment, "boots", inv.equipment, EquipmentSlots.Feet); 51 52 52 AddEquipment (equipment, "gloves", inv.equipment, XMLData.Item.EnumEquipmentSlot.Hands, NGuiInvGridEquipment.EnumClothingLayer.Inner); 53 AddEquipment (equipment, "backpack", inv.equipment, XMLData.Item.EnumEquipmentSlot.Back, NGuiInvGridEquipment.EnumClothingLayer.Outer); 53 AddEquipment (equipment, "gloves", inv.equipment, EquipmentSlots.Hands); 54 54 55 55 WriteJSON (resp, result); … … 62 62 } 63 63 64 private void AddEquipment (JSONObject _eq, string _slotname, InvItem[] _items, XMLData.Item.EnumEquipmentSlot _slot, NGuiInvGridEquipment.EnumClothingLayer _layer) { 65 int index = (int)_slot + (int)_layer * (int)XMLData.Item.EnumEquipmentSlot.Count; 66 if (_items != null) { 67 _eq.Add (_slotname, GetJsonForItem (_items [index])); 68 } else { 69 _eq.Add (_slotname, new JSONNull ()); 64 private void AddEquipment (JSONObject _eq, string _slotname, InvItem[] _items, EquipmentSlots _slot) { 65 int[] slotindices = XUiM_PlayerEquipment.GetSlotIndicesByEquipmentSlot (_slot); 66 67 for (int i = 0; i < slotindices.Length; i++) { 68 if (_items != null && _items [slotindices [i]] != null) { 69 InvItem item = _items [slotindices [i]]; 70 _eq.Add (_slotname, GetJsonForItem (item)); 71 return; 72 } 70 73 } 74 75 _eq.Add (_slotname, new JSONNull ()); 71 76 } 72 77 … … 75 80 JSONObject jsonItem = new JSONObject (); 76 81 jsonItem.Add ("count", new JSONNumber (_item.count)); 77 78 79 jsonItem.Add ("iconcolor", new JSONString ((string.IsNullOrEmpty (_item.iconcolor) || _item.iconcolor == "FFFFFF" ? "" : _item.iconcolor)));80 jsonItem.Add ("quality", new JSONNumber(_item.quality));82 jsonItem.Add ("name", new JSONString (_item.itemName)); 83 jsonItem.Add ("icon", new JSONString (_item.icon)); 84 jsonItem.Add ("iconcolor", new JSONString (_item.iconcolor)); 85 jsonItem.Add ("quality", new JSONNumber (_item.quality)); 81 86 if (_item.quality >= 0) { 82 87 jsonItem.Add ("qualitycolor", new JSONString (QualityInfo.GetQualityColorHex (_item.quality))); -
binary-improvements/MapRendering/Web/API/GetPlayersLocation.cs
r251 r253 11 11 public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, WebConnection user, int permissionLevel) 12 12 { 13 AdminTools admTools = null; 13 AdminTools admTools = GameManager.Instance.adminTools; 14 user = user ?? new WebConnection ("", "", 0L); 14 15 15 try { admTools = GameManager.Instance.adminTools; } catch { } 16 try { user = user ?? new WebConnection ("", "", 0L); } catch { } // default user, cheap way to avoid 'null reference exception' 17 18 bool bViewAll = false; try { bViewAll = user.CanViewAllPlayers (permissionLevel); } catch { } 16 bool bViewAll = WebConnection.CanViewAllPlayers (permissionLevel); 19 17 20 18 JSONArray playersJsResult = new JSONArray (); … … 23 21 24 22 foreach (string sid in playersList.SteamIDs) { 25 try { 26 if ((admTools != null) && (PetesUtils.ValidText (sid))) 27 if (admTools.IsBanned (sid)) 28 continue; 23 if (admTools != null) 24 if (admTools.IsBanned (sid)) 25 continue; 26 27 Player p = playersList [sid, false]; 28 29 ulong player_steam_ID = 0L; 30 if (!ulong.TryParse (sid, out player_steam_ID)) 31 player_steam_ID = 0L; 32 33 if ((player_steam_ID == user.SteamID) || bViewAll) { 34 JSONObject pos = new JSONObject (); 35 pos.Add("x", new JSONNumber (p.LastPosition.x)); 36 pos.Add("y", new JSONNumber (p.LastPosition.y)); 37 pos.Add("z", new JSONNumber (p.LastPosition.z)); 38 39 JSONObject pJson = new JSONObject (); 40 pJson.Add("steamid", new JSONString (sid)); 41 pJson.Add("ip", new JSONString (p.IP)); 42 pJson.Add("name", new JSONString (p.Name)); 43 pJson.Add("online", new JSONBoolean (p.IsOnline)); 44 pJson.Add("position", pos); 45 46 playersJsResult.Add (pJson); 29 47 } 30 catch { }31 32 try33 {34 Player p = playersList [sid, false];35 36 ulong player_steam_ID = 0L;37 if (!ulong.TryParse (sid, out player_steam_ID))38 player_steam_ID = 0L;39 40 if ((player_steam_ID == user.SteamID) || bViewAll) {41 JSONObject pos = new JSONObject ();42 pos.Add("x", new JSONNumber (p.LastPosition.x));43 pos.Add("y", new JSONNumber (p.LastPosition.y));44 pos.Add("z", new JSONNumber (p.LastPosition.z));45 46 JSONObject pJson = new JSONObject ();47 pJson.Add("steamid", new JSONString (sid));48 pJson.Add("ip", new JSONString (p.IP));49 pJson.Add("name", new JSONString (p.Name));50 pJson.Add("online", new JSONBoolean (p.IsOnline));51 pJson.Add("position", pos);52 53 playersJsResult.Add (pJson);54 }55 }56 catch { }57 48 } 58 49 -
binary-improvements/MapRendering/Web/Handlers/ItemIconHandler.cs
r251 r253 8 8 namespace AllocsFixes.NetConnections.Servers.Web.Handlers 9 9 { 10 public class ItemIconHandler : PathHandler 11 { 10 public class ItemIconHandler : PathHandler { 12 11 private string staticPart; 13 12 private bool logMissingFiles; 14 15 13 private Dictionary<string, byte[]> icons = new Dictionary<string, byte[]> (); 14 private bool loaded = false; 16 15 17 16 public ItemIconHandler (string staticPart, bool logMissingFiles, string moduleName = null) : base(moduleName) { … … 29 28 } 30 29 31 // BEGIN CHANGED BY PSOUZA432 30 string requestFileName = req.Url.AbsolutePath.Remove (0, staticPart.Length); 33 31 requestFileName = requestFileName.Remove (requestFileName.LastIndexOf ('.')); 34 32 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")) { 33 if (icons.ContainsKey (requestFileName) && req.Url.AbsolutePath.ToLower ().EndsWith (".png")) { 48 34 resp.ContentType = MimeType.GetMimeType (".png"); 49 35 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 } 36 byte[] itemIconData = icons [requestFileName]; 91 37 92 38 resp.ContentLength64 = itemIconData.Length; 93 39 resp.OutputStream.Write (itemIconData, 0, itemIconData.Length); 94 // END CHANGED BY PSOUZA495 40 } else { 96 41 resp.StatusCode = (int)HttpStatusCode.NotFound; 97 if (logMissingFiles) 42 if (logMissingFiles) { 98 43 Log.Out ("Web:IconHandler:FileNotFound: \"" + req.Url.AbsolutePath + "\" "); 44 } 99 45 return; 100 46 } … … 106 52 return true; 107 53 } 54 55 MicroStopwatch microStopwatch = new MicroStopwatch (); 108 56 109 57 GameObject atlasObj = GameObject.Find ("/NGUI Root (2D)/ItemIconAtlas"); … … 120 68 } 121 69 70 Dictionary<string, List<Color>> tintedIcons = new Dictionary<string, List<Color>> (); 71 foreach (ItemClass ic in ItemClass.list) { 72 if (ic != null) { 73 Color tintColor = ic.GetIconTint (); 74 if (tintColor != Color.white) { 75 string name = ic.GetIconName (); 76 if (!tintedIcons.ContainsKey (name)) { 77 tintedIcons.Add (name, new List<Color> ()); 78 } 79 List<Color> list = tintedIcons [name]; 80 list.Add (tintColor); 81 } 82 } 83 } 84 122 85 Texture2D atlasTex = atlas.texture as Texture2D; 123 86 … … 126 89 Texture2D tex = new Texture2D (data.width, data.height, TextureFormat.ARGB32, false); 127 90 tex.SetPixels (atlasTex.GetPixels (data.x, atlasTex.height - data.height - data.y, data.width, data.height)); 128 byte[] pixData = tex.EncodeToPNG ();129 91 130 icons.Add (name, pixData); 92 icons.Add (name + "__FFFFFF", tex.EncodeToPNG ()); 93 94 if (tintedIcons.ContainsKey (name)) { 95 foreach (Color c in tintedIcons [name]) { 96 Texture2D tintedTex = new Texture2D (data.width, data.height, TextureFormat.ARGB32, false); 97 98 for (int x = 0; x < data.width; x++) { 99 for (int y = 0; y < data.height; y++) { 100 tintedTex.SetPixel (x, y, tex.GetPixel (x, y) * c); 101 } 102 } 103 104 icons.Add (name + "__" + AllocsUtils.ColorToHex (c), tintedTex.EncodeToPNG ()); 105 106 UnityEngine.Object.Destroy (tintedTex); 107 } 108 } 109 131 110 UnityEngine.Object.Destroy (tex); 132 111 } 133 112 134 113 loaded = true; 135 Log.Out ("Web:IconHandler: Icons loaded ");114 Log.Out ("Web:IconHandler: Icons loaded - {0} ms", microStopwatch.ElapsedMilliseconds); 136 115 137 116 return true; -
binary-improvements/MapRendering/Web/LogBuffer.cs
r250 r253 8 8 { 9 9 public class LogBuffer { 10 private const int MAX_ENTRIES = 50000;10 private const int MAX_ENTRIES = 30; 11 11 private static LogBuffer instance; 12 12 … … 92 92 } 93 93 94 public List<LogEntry> GetRange (ref int _start, refint _end) {94 public List<LogEntry> GetRange (ref int _start, int _count, out int _end) { 95 95 lock (logEntries) { 96 if (_end < 0) { 97 _end = listOffset + logEntries.Count; 96 if (_count < 1) { 97 _end = _start; 98 return new List<LogEntry> (); 98 99 } 99 100 … … 107 108 } 108 109 109 if (_end < _start) { 110 Log.Error ("GetRange: invalid end {0} (listOffset: {1}, count: {2})", _end, listOffset, logEntries.Count); 111 return null; 112 } 113 114 if (_end >= listOffset + logEntries.Count) { 115 _end = listOffset + logEntries.Count - 1; 116 } 117 118 return logEntries.GetRange (_start - listOffset, _end - _start + 1); 110 _end = _start + _count; 111 return logEntries.GetRange (_start - listOffset, _count); 119 112 } 120 113 } -
binary-improvements/MapRendering/Web/WebConnection.cs
r251 r253 30 30 } 31 31 32 public bool CanViewAllPlayers (int _permissionLevel) {32 public static bool CanViewAllPlayers (int _permissionLevel) { 33 33 bool val = false; 34 34 … … 47 47 } 48 48 49 public bool CanViewAllClaims (int _permissionLevel) {49 public static bool CanViewAllClaims (int _permissionLevel) { 50 50 bool val = false; 51 51 -
binary-improvements/MapRendering/WebAndMapRendering.csproj
r251 r253 23 23 <Reference Include="System"> 24 24 <HintPath>..\7dtd-binaries\System.dll</HintPath> 25 <Private>False</Private>26 </Reference>27 <Reference Include="System.Drawing">28 <HintPath>..\7dtd-binaries\System.Drawing.dll</HintPath>29 25 <Private>False</Private> 30 26 </Reference> … … 59 55 <Compile Include="API.cs" /> 60 56 <Compile Include="Web\API\GetAnimalsLocation.cs" /> 61 <Compile Include="Web\API\GetRawEntitiesList.cs" />62 57 <Compile Include="Web\API\GetHostileLocation.cs" /> 63 58 <Compile Include="Web\API\Null.cs" />
Note:
See TracChangeset
for help on using the changeset viewer.