Changeset 251 for binary-improvements


Ignore:
Timestamp:
Oct 28, 2015, 7:51:20 PM (4 years ago)
Author:
peter.souza
Message:

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.

Location:
binary-improvements
Files:
15 added
1 deleted
24 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements/7dtd-binaries/README.txt

    r244 r251  
    11Put the Assembly-CSharp.dll, Assembly-CSharp-firstpass.dll, LogLibrary.dll, mscorlib.dll,
    2 System.dll, System.Xml.dll and UnityEngine.dll from your dedicated server in this folder.
     2System.dll, System.Drawing.dll, System.Xml.dll and UnityEngine.dll from your dedicated server in this folder.
    33
  • binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj

    r244 r251  
    1 <?xml version="1.0" encoding="utf-8"?>
     1<?xml version="1.0" encoding="utf-8"?>
    22<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    33  <PropertyGroup>
     
    4646      <Private>False</Private>
    4747    </Reference>
     48    <Reference Include="System.Drawing">
     49      <HintPath>..\7dtd-binaries\System.Drawing.dll</HintPath>
     50      <Private>False</Private>
     51    </Reference>
    4852    <Reference Include="UnityEngine">
    4953      <HintPath>..\7dtd-binaries\UnityEngine.dll</HintPath>
     
    6266    <Compile Include="src\AssemblyInfo.cs" />
    6367    <Compile Include="src\AllocsLogFunctions.cs" />
     68    <Compile Include="src\LiveData\Animals.cs" />
     69    <Compile Include="src\LiveData\Hostiles.cs" />
    6470    <Compile Include="src\PlayerDataStuff.cs" />
    6571    <Compile Include="src\PersistentData\PersistentContainer.cs" />
     
    8692    <Compile Include="src\API.cs" />
    8793    <Compile Include="src\ChatHookExample.cs" />
     94    <Compile Include="src\PetesUtils.cs" />
    8895  </ItemGroup>
    8996  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  • binary-improvements/7dtd-server-fixes/src/PersistentData/InvItem.cs

    r250 r251  
    1111                public int quality;
    1212                public InvItem[] parts;
     13        public string icon = "";
     14        public string iconcolor = "";
    1315
    1416                public InvItem (string itemName, int count, int quality = -1)
  • binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs

    r250 r251  
    7272                                        item = new InvItem (name, _count);
    7373                                }
     74
     75                // Figure out the icon's name
     76                string icon_name = "";
     77
     78                ItemClass item_class = ItemClass.list [_itemValue.type];
     79
     80                if (!PetesUtils.ValidText (icon_name)) {
     81                    try {
     82                        icon_name = item_class.GetIconName ();
     83                    }
     84                    catch { }
     85                }
     86
     87                if (!PetesUtils.ValidText (icon_name)) {
     88                    try {
     89                        icon_name = item_class.MeshFile;
     90                    }
     91                    catch { }
     92                }
     93
     94                if (!PetesUtils.ValidText (icon_name)) {
     95                    try {
     96                        icon_name = item_class.DropMeshFile;
     97                    }
     98                    catch { }
     99                }
     100
     101                if (!PetesUtils.ValidText (icon_name))
     102                    icon_name = item_class.GetItemName ();
     103
     104                if (icon_name.Contains ("\\"))
     105                    icon_name = icon_name.Substring (icon_name.LastIndexOf ("\"") + 1);
     106
     107                item.icon = icon_name;
     108
     109                try {
     110                    item.iconcolor = item_class.CustomIconTint.ToHexStringRGB ();
     111                }
     112                catch {
     113                    item.iconcolor = "FFFFFF";
     114                }
     115                   
    74116                                return item;
    75117                        } else {
     
    77119                        }
    78120                }
    79 
    80 
    81121        }
    82122}
    83 
  • binary-improvements/7dtd-server-fixes/src/PersistentData/Players.cs

    r233 r251  
    66namespace AllocsFixes.PersistentData
    77{
    8         [Serializable]
     8    [Serializable]
    99        public class Players
    1010        {
  • binary-improvements/AllocsCommands/AllocsCommands.csproj

    r238 r251  
    4949    <Compile Include="Commands\ShowInventory.cs" />
    5050    <Compile Include="Commands\TeleportPlayer.cs" />
    51     <Compile Include="PrivateMassageConnections.cs" />
     51    <Compile Include="PrivateMessageConnections.cs" />
    5252    <Compile Include="Chat.cs" />
    5353    <Compile Include="Commands\ListItems.cs" />
  • binary-improvements/AllocsCommands/Chat.cs

    r238 r251  
    88                        string senderName;
    99                        if (_sender != null) {
    10                                 PrivateMassageConnections.SetLastPMSender (_sender, _receiver);
     10                                PrivateMessageConnections.SetLastPMSender (_sender, _receiver);
    1111                                senderName = _sender.playerName;
    1212                        } else {
  • binary-improvements/AllocsCommands/Commands/Reply.cs

    r238 r251  
    3131                        string message = _params [0];
    3232
    33                         ClientInfo receiver = PrivateMassageConnections.GetLastPMSenderForPlayer (_sender);
     33                        ClientInfo receiver = PrivateMessageConnections.GetLastPMSenderForPlayer (_sender);
    3434                        if (receiver != null) {
    3535                                Chat.SendMessage (receiver, _sender, message);
  • binary-improvements/MapRendering/Web/API/GetLandClaims.cs

    r245 r251  
    1111                public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, WebConnection user, int permissionLevel)
    1212                {
    13                         string steamid = string.Empty;
     13                        string ViewersSteamID = string.Empty;
     14            ulong lViewersSteamID = 0L;
    1415
    1516                        if (req.QueryString ["steamid"] != null) {
    16                                 long tempLong;
    17                                 steamid = req.QueryString ["steamid"];
    18                                 if (steamid.Length != 17 || !long.TryParse (steamid, out tempLong)) {
     17                                ViewersSteamID = req.QueryString ["steamid"];
     18                if (ViewersSteamID.Length != 17 || !ulong.TryParse (ViewersSteamID, out lViewersSteamID)) {
    1919                                        resp.StatusCode = (int)HttpStatusCode.BadRequest;
    2020                                        Web.SetResponseTextContent (resp, "Invalid SteamID given");
     
    2323                        }
    2424
     25            // default user, cheap way to avoid 'null reference exception'
     26            try { user = user ?? new WebConnection ("", "", 0L); } catch { }
     27
     28            bool bViewAll = false; try { bViewAll = user.CanViewAllClaims (permissionLevel); } catch { }
     29           
    2530                        JSONObject result = new JSONObject ();
    2631                        result.Add ("claimsize", new JSONNumber (GamePrefs.GetInt (EnumGamePrefs.LandClaimSize)));
     
    3338                                World w = GameManager.Instance.World;
    3439                                Dictionary<PersistentPlayerData, List<Vector3i>> owners = new Dictionary<PersistentPlayerData, List<Vector3i>> ();
     40
     41                // Add all owners to this temporary list regardless of permissions
    3542                                foreach (KeyValuePair<Vector3i, PersistentPlayerData> kvp in d) {
    36                                         if (steamid.Length == 0 || kvp.Value.PlayerId.Equals (steamid)) {
     43                                        if (kvp.Value.PlayerId.Equals (ViewersSteamID)) {
    3744                                                if (!owners.ContainsKey (kvp.Value)) {
    3845                                                        owners.Add (kvp.Value, new List<Vector3i> ());
     
    4249                                }
    4350
     51                // Loop through all claim owners...
    4452                                foreach (KeyValuePair<PersistentPlayerData, List<Vector3i>> kvp in owners) {
    45                                         if (steamid.Length == 0 || kvp.Key.PlayerId.Equals (steamid)) {
    46                                                 string curID = kvp.Key.PlayerId;
    47                                                 bool isActive = w.IsLandProtectionValidForPlayer (kvp.Key);
     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);
    4860
    49                                                 JSONObject owner = new JSONObject ();
    50                                                 claimOwners.Add (owner);
     61                            JSONObject owner = new JSONObject ();
     62                            claimOwners.Add (owner);
    5163
    52                                                 owner.Add ("steamid", new JSONString (curID));
    53                                                 owner.Add ("claimactive", new JSONBoolean (isActive));
     64                            owner.Add("steamid", new JSONString (currentSteamID));
     65                            owner.Add("claimactive", new JSONBoolean (isActive));
    5466
    55                                                 if (PersistentContainer.Instance.Players [curID, false] != null) {
    56                                                         owner.Add ("playername", new JSONString (PersistentContainer.Instance.Players [curID, false].Name));
    57                                                 } else {
    58                                                         owner.Add ("playername", new JSONNull ());
    59                                                 }
     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                            }
    6072
    61                                                 JSONArray claims = new JSONArray ();
    62                                                 owner.Add ("claims", claims);
     73                            JSONArray claims = new JSONArray ();
     74                            owner.Add ("claims", claims);
    6375
    64                                                 foreach (Vector3i v in kvp.Value) {
    65                                                         JSONObject claim = new JSONObject ();
    66                                                         claim.Add ("x", new JSONNumber (v.x));
    67                                                         claim.Add ("y", new JSONNumber (v.y));
    68                                                         claim.Add ("z", new JSONNumber (v.z));
     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));
    6981
    70                                                         claims.Add (claim);
    71                                                 }
    72                                         }
     82                                claims.Add (claim);
     83                            }
     84                        }
     85                    }
     86                    catch { }
    7387                                }
    7488                        }
  • binary-improvements/MapRendering/Web/API/GetPlayerInventory.cs

    r250 r251  
    7575                                JSONObject jsonItem = new JSONObject ();
    7676                                jsonItem.Add ("count", new JSONNumber (_item.count));
    77                                 jsonItem.Add ("name", new JSONString (_item.itemName));
    78                                 jsonItem.Add ("quality", new JSONNumber (_item.quality));
     77                jsonItem.Add ("name", new JSONString (_item.itemName));
     78                jsonItem.Add ("icon", new JSONString (_item.icon));
     79                jsonItem.Add ("iconcolor", new JSONString ((string.IsNullOrEmpty (_item.iconcolor) || _item.iconcolor == "FFFFFF" ? "" : _item.iconcolor)));
     80                jsonItem.Add ("quality", new JSONNumber(_item.quality));
    7981                                if (_item.quality >= 0) {
    8082                                        jsonItem.Add ("qualitycolor", new JSONString (QualityInfo.GetQualityColorHex (_item.quality)));
  • binary-improvements/MapRendering/Web/API/GetPlayersLocation.cs

    r244 r251  
    1111                public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, WebConnection user, int permissionLevel)
    1212                {
    13                         JSONArray playersJsResult = new JSONArray ();
     13            AdminTools admTools = null;
     14
     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 { }
     19
     20            JSONArray playersJsResult = new JSONArray ();
    1421
    1522                        Players playersList = PersistentContainer.Instance.Players;
    1623
    1724                        foreach (string sid in playersList.SteamIDs) {
    18                                 Player p = playersList[sid, false];
     25                try {
     26                    if ((admTools != null) && (PetesUtils.ValidText (sid)))
     27                        if (admTools.IsBanned (sid))
     28                            continue;
     29                }
     30                catch { }
    1931
    20                                 JSONObject pos = new JSONObject();
    21                                 pos.Add("x", new JSONNumber(p.LastPosition.x));
    22                                 pos.Add("y", new JSONNumber(p.LastPosition.y));
    23                                 pos.Add("z", new JSONNumber(p.LastPosition.z));
     32                try
     33                {
     34                    Player p = playersList [sid, false];
    2435
    25                                 JSONObject pJson = new JSONObject();
    26                                 pJson.Add("steamid", new JSONString(sid));
    27                                 pJson.Add("ip", new JSONString(p.IP));
    28                                 pJson.Add("name", new JSONString(p.Name));
    29                                 pJson.Add("online", new JSONBoolean(p.IsOnline));
    30                                 pJson.Add("position", pos);
     36                    ulong player_steam_ID = 0L;
     37                    if (!ulong.TryParse (sid, out player_steam_ID))
     38                        player_steam_ID = 0L;
    3139
    32                                 playersJsResult.Add(pJson);
    33                         }
     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));
    3445
    35                         WriteJSON(resp, playersJsResult);
     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            }
     58
     59                        WriteJSON (resp, playersJsResult);
    3660                }
    3761        }
  • binary-improvements/MapRendering/Web/API/GetStats.cs

    r245 r251  
    11using AllocsFixes.JSON;
     2using AllocsFixes.LiveData;
    23using AllocsFixes.PersistentData;
    34using System;
     
    2021
    2122                        result.Add ("players", new JSONNumber (GameManager.Instance.World.Players.Count));
     23            result.Add ("hostiles", new JSONNumber (Hostiles.Count));
     24            result.Add ("animals", new JSONNumber (Animals.Count));
    2225
    2326                        WriteJSON (resp, result);
  • binary-improvements/MapRendering/Web/API/GetWebUIUpdates.cs

    r250 r251  
    11using AllocsFixes.JSON;
     2using AllocsFixes.LiveData;
    23using AllocsFixes.PersistentData;
    34using System;
     
    2324
    2425                        result.Add ("players", new JSONNumber (GameManager.Instance.World.Players.Count));
     26            result.Add ("hostiles", new JSONNumber (Hostiles.Count));
     27            result.Add ("animals", new JSONNumber (Animals.Count));
    2528
    2629                        result.Add ("newlogs", new JSONNumber (LogBuffer.Instance.LatestLine - latestLine));
  • binary-improvements/MapRendering/Web/Handlers/ApiHandler.cs

    r250 r251  
    1313                private Dictionary<String, WebAPI> apis = new Dictionary<string, WebAPI> ();
    1414
    15                 public ApiHandler (string staticPart, string moduleName = null) : base(moduleName) {
     15                public ApiHandler (string staticPart, string moduleName = null) : base (moduleName) {
    1616                        this.staticPart = staticPart;
    1717
    1818                        foreach (Type t in Assembly.GetExecutingAssembly ().GetTypes ()) {
    1919                                if (!t.IsAbstract && t.IsSubclassOf (typeof(WebAPI))) {
    20                                         ConstructorInfo ctor = t.GetConstructor (new Type[0]);
     20                                        ConstructorInfo ctor = t.GetConstructor (new Type [0]);
    2121                                        if (ctor != null) {
    22                                                 WebAPI apiInstance = (WebAPI)ctor.Invoke (new object[0]);
     22                                                WebAPI apiInstance = (WebAPI)ctor.Invoke (new object [0]);
    2323                                                addApi (t.Name.ToLower (), apiInstance);
    2424                                        }
    2525                                }
    2626                        }
     27
     28            // Add dummy types
     29            Type dummy_t = typeof (API.Null);
     30            ConstructorInfo dummy_ctor = dummy_t.GetConstructor (new Type [0]);
     31            if (dummy_ctor != null) {
     32                WebAPI dummy_apiInstance = (WebAPI)dummy_ctor.Invoke (new object[0]);
     33
     34                // Permissions that don't map to a real API
     35                addApi("viewallclaims", dummy_apiInstance);
     36                addApi("viewallplayers", dummy_apiInstance);
     37            }
    2738                }
    2839
  • binary-improvements/MapRendering/Web/Handlers/ItemIconHandler.cs

    r244 r251  
    11using System;
    22using System.Collections.Generic;
    3 using System.IO;
    43using System.Net;
    54using System.Threading;
     
    1312                private string staticPart;
    1413                private bool logMissingFiles;
    15                 private Dictionary<string, byte[]> icons = new Dictionary<string, byte[]> ();
    16                 private bool loaded = false;
     14        private Dictionary<string, byte[]> icons = new Dictionary<string, byte[]> ();
     15        private bool loaded = false;
    1716
    1817                public ItemIconHandler (string staticPart, bool logMissingFiles, string moduleName = null) : base(moduleName) {
     
    3029                        }
    3130
    32                         string fn = req.Url.AbsolutePath.Remove (0, staticPart.Length);
    33                         fn = fn.Remove (fn.LastIndexOf ('.'));
     31            // BEGIN CHANGED BY PSOUZA4
     32                        string requestFileName = req.Url.AbsolutePath.Remove (0, staticPart.Length);
     33                        requestFileName = requestFileName.Remove (requestFileName.LastIndexOf ('.'));
    3434
    35                         if (icons.ContainsKey (fn)) {
     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")) {
    3648                                resp.ContentType = MimeType.GetMimeType (".png");
    37                                 resp.ContentLength64 = icons [fn].Length;
    38                                 resp.OutputStream.Write (icons [fn], 0, icons [fn].Length);
     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
    3995                        } else {
    4096                                resp.StatusCode = (int)HttpStatusCode.NotFound;
  • binary-improvements/MapRendering/Web/Handlers/StaticHandler.cs

    r244 r251  
    2727
    2828                        byte[] content = cache.GetFileContent (datapath + "/" + fn);
     29
    2930                        if (content != null) {
    3031                                resp.ContentType = MimeType.GetMimeType (Path.GetExtension (fn));
  • binary-improvements/MapRendering/Web/WebConnection.cs

    r250 r251  
    11using System;
    22using System.Collections.Generic;
    3 
     3using AllocsFixes.NetConnections.Servers.Web;
    44using UnityEngine;
    55
     
    2929                        get { return DateTime.Now - lastAction; }
    3030                }
     31
     32        public bool CanViewAllPlayers (int _permissionLevel) {
     33            bool val = false;
     34
     35            try {
     36                const int defaultPermissionLevel = 0;
     37
     38                val = _permissionLevel <= defaultPermissionLevel;
     39
     40                foreach (WebPermissions.WebModulePermission wap in WebPermissions.Instance.GetModules ())
     41                    if (wap.module.Trim ().ToLower () == "webapi.viewallplayers")
     42                        val = _permissionLevel <= wap.permissionLevel;
     43            }
     44            catch { }
     45
     46            return val;
     47        }
     48
     49        public bool CanViewAllClaims (int _permissionLevel) {
     50            bool val = false;
     51
     52            try {
     53                const int defaultPermissionLevel = 0;
     54
     55                val = _permissionLevel <= defaultPermissionLevel;
     56
     57                foreach (WebPermissions.WebModulePermission wap in WebPermissions.Instance.GetModules ())
     58                    if (wap.module.Trim ().ToLower () == "webapi.viewallclaims")
     59                        val = _permissionLevel <= wap.permissionLevel;
     60            }
     61            catch { }
     62
     63            return val;
     64        }
    3165
    3266                public WebConnection (string _sessionId, string _endpoint, ulong _steamId) {
  • binary-improvements/MapRendering/Web/WebPermissions.cs

    r244 r251  
    9999                        if (!string.IsNullOrEmpty (_module)) {
    100100                                lock (this) {
    101                                         knownModules.Add (_module, new WebModulePermission (_module, 0));
     101                    if (!IsKnownModule( _module)) {
     102                                            knownModules.Add (_module, new WebModulePermission (_module, 0));
     103                    }
    102104                                }
    103105                        }
     
    269271
    270272                        using (StreamWriter sw = new StreamWriter(GetFullPath ())) {
    271                                 sw.WriteLine ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    272                                 sw.WriteLine ("<webpermissions>");
    273                                 sw.WriteLine ("    <admintokens>");
    274                                 sw.WriteLine ("        <!-- <token name=\"adminuser1\" token=\"supersecrettoken\" permission_level=\"0\" /> -->");
    275                                 foreach (AdminToken at in admintokens.Values) {
    276                                         sw.WriteLine (string.Format ("        <token name=\"{0}\" token=\"{1}\" permission_level=\"{2}\" />", at.name, at.token, at.permissionLevel));
    277                                 }
    278                                 sw.WriteLine ("    </admintokens>");
    279                                 sw.WriteLine ();
    280                                 sw.WriteLine ("    <permissions>");
    281                                 sw.WriteLine ("        <!-- <permission module=\"webapi.executeconsolecommand\" permission_level=\"0\" /> -->");
    282                                 sw.WriteLine ("        <!-- <permission module=\"webapi.getplayersonline\" permission_level=\"1\" /> -->");
    283                                 sw.WriteLine ("        <!-- <permission module=\"web.map\" permission_level=\"1000\" /> -->");
    284                                 foreach (WebModulePermission wap in modules.Values) {
    285                                         sw.WriteLine (string.Format ("        <permission module=\"{0}\" permission_level=\"{1}\" />", wap.module, wap.permissionLevel));
    286                                 }
    287                                 sw.WriteLine ("    </permissions>");
    288                                 sw.WriteLine ();
    289                                 sw.WriteLine ("</webpermissions>");
    290                        
     273                sw.WriteLine ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
     274                sw.WriteLine ("<webpermissions>");
     275                sw.WriteLine  ();
     276                sw.WriteLine (" <admintokens>");
     277                sw.WriteLine ("         <!-- <token name=\"adminuser1\" token=\"supersecrettoken\" permission_level=\"0\" /> -->");
     278                foreach (AdminToken at in admintokens.Values) {
     279                    sw.WriteLine (string.Format ("              <token name=\"{0}\" token=\"{1}\" permission_level=\"{2}\" />", at.name, at.token, at.permissionLevel));
     280                }
     281                sw.WriteLine (" </admintokens>");
     282                sw.WriteLine ();
     283                sw.WriteLine (" <permissions>");
     284                foreach (WebModulePermission wap in modules.Values) {
     285                    sw.WriteLine (string.Format ("              <permission module=\"{0}\" permission_level=\"{1}\" />", wap.module, wap.permissionLevel));
     286                }
     287                sw.WriteLine ("         <!-- <permission module=\"web.map\" permission_level=\"1000\" /> -->");
     288                sw.WriteLine ();
     289                sw.WriteLine ("         <!-- <permission module=\"webapi.getlog\" permission_level=\"0\" /> -->");
     290                sw.WriteLine ("         <!-- <permission module=\"webapi.executeconsolecommand\" permission_level=\"0\" /> -->");
     291                sw.WriteLine ();
     292                sw.WriteLine ("         <!-- <permission module=\"webapi.getstats\" permission_level=\"1000\" /> -->");
     293                sw.WriteLine ("         <!-- <permission module=\"webapi.getplayersonline\" permission_level=\"1000\" /> -->");
     294                sw.WriteLine ();
     295                sw.WriteLine ("         <!-- <permission module=\"webapi.getplayerslocation\" permission_level=\"1000\" /> -->");
     296                sw.WriteLine ("         <!-- <permission module=\"webapi.viewallplayers\" permission_level=\"1\" /> -->");
     297                sw.WriteLine ();
     298                sw.WriteLine ("         <!-- <permission module=\"webapi.getlandclaims\" permission_level=\"1000\" /> -->");
     299                sw.WriteLine ("         <!-- <permission module=\"webapi.viewallclaims\" permission_level=\"1\" /> -->");
     300                sw.WriteLine ();
     301                sw.WriteLine ("         <!-- <permission module=\"webapi.getplayerinventory\" permission_level=\"1\" /> -->");
     302                sw.WriteLine ();
     303                sw.WriteLine ("         <!-- <permission module=\"webapi.gethostilelocation\" permission_level=\"1\" /> -->");
     304                sw.WriteLine ("         <!-- <permission module=\"webapi.getanimalslocation\" permission_level=\"1\" /> -->");
     305                sw.WriteLine (" </permissions>");
     306                sw.WriteLine ();
     307                sw.WriteLine ("</webpermissions>");
     308
    291309                                sw.Flush ();
    292310                                sw.Close ();
  • binary-improvements/MapRendering/WebAndMapRendering.csproj

    r250 r251  
    1 <?xml version="1.0" encoding="utf-8"?>
     1<?xml version="1.0" encoding="utf-8"?>
    22<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    33  <PropertyGroup>
     
    2121  </PropertyGroup>
    2222  <ItemGroup>
    23     <Reference Include="System" />
     23    <Reference Include="System">
     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      <Private>False</Private>
     30    </Reference>
    2431    <Reference Include="LogLibrary">
    2532      <HintPath>..\7dtd-binaries\LogLibrary.dll</HintPath>
     
    5158    <Compile Include="Commands\EnableRendering.cs" />
    5259    <Compile Include="API.cs" />
     60    <Compile Include="Web\API\GetAnimalsLocation.cs" />
     61    <Compile Include="Web\API\GetRawEntitiesList.cs" />
     62    <Compile Include="Web\API\GetHostileLocation.cs" />
     63    <Compile Include="Web\API\Null.cs" />
    5364    <Compile Include="Web\Web.cs" />
    5465    <Compile Include="Web\MimeType.cs" />
     
    8798    </ProjectReference>
    8899  </ItemGroup>
    89   <ItemGroup>
    90     <Folder Include="Commands\" />
    91     <Folder Include="Web\Handlers\" />
    92   </ItemGroup>
     100  <ItemGroup />
    93101  <ItemGroup>
    94102    <None Include="ModInfo.xml">
  • binary-improvements/webserver/index.html

    r250 r251  
    33<head>
    44        <meta charset="UTF-8">
    5         <title>7dtd map browser</title>
     5        <title>7 Days to Die Map</title>
    66
    77        <!-- jQuery -->
     
    5959                        <div id="serverstats">
    6060                                <span id="stats_time">-</span><br/>
    61                                 <span id="stats_players">-</span> Players
     61                                <span id="stats_players">-</span> Players<br />
     62                                <span id="stats_hostiles">-</span> Hostiles<br />
     63                                <span id="stats_animals">-</span> Animals
    6264                        </div>
    6365
     
    8789                </div>
    8890                <div id="admincontent">
    89                         <h1 id="nopermissionwarning" style="display:none">An error occured or you do not have any permissions on this WebPanel. Log in with the link on the lower left!</h1>
     91                        <h1 id="nopermissionwarning" style="display:none">An error occured or you have not logged in.  Try logging in with the Steam login in the lower left!</h1>
    9092                        <div id="tab_map" class="adminmap"></div>
    9193                        <div id="tab_log" class="adminlog">
  • binary-improvements/webserver/js/inventory_dialog.js

    r250 r251  
    1919
    2020                if (itemdata !== null) {
    21                         cell.attr("style", "background-image: url(" + ITEMICONBASEURL + itemdata.name + ".png);");
     21                        cell.attr("style", "background-image: url(" + ITEMICONBASEURL + itemdata.icon + "@@" + itemdata.iconcolor + ".png);");
    2222                        if (itemdata.quality >= 0) {
    2323                                cell.attr("title", itemdata.name + " (quality: " + itemdata.quality + ")");
  • binary-improvements/webserver/js/map.js

    r250 r251  
    4848        var tileLayerMiniMap = GetSdtdTileLayer (mapinfo, initTime, true);
    4949
    50 
     50        // player icon
     51        var playerIcon = L.icon({
     52            iconUrl: '/static/leaflet/images/marker-survivor.png',
     53            iconRetinaUrl: '/static/leaflet/images/marker-survivor-2x.png',
     54            iconSize: [25, 48],
     55            iconAnchor: [12, 24],
     56            popupAnchor: [0, -20]
     57        });
     58       
     59        // hostile icon
     60        var hostileIcon = L.icon({
     61            iconUrl: '/static/leaflet/images/marker-zombie.png',
     62            iconRetinaUrl: '/static/leaflet/images/marker-zombie-2x.png',
     63            iconSize: [25, 33],
     64            iconAnchor: [12, 16],
     65            popupAnchor: [0, -10]
     66        });     
     67       
     68        // animal icon
     69        var animalIcon = L.icon({
     70            iconUrl: '/static/leaflet/images/marker-animal.png',
     71            iconRetinaUrl: '/static/leaflet/images/marker-animal-2x.png',
     72            iconSize: [25, 26],
     73            iconAnchor: [12, 13],
     74            popupAnchor: [0, -10]
     75        });
     76       
    5177
    5278
     
    5884        });
    5985        var playersOfflineMarkerGroup = L.markerClusterGroup({
     86                maxClusterRadius: function(zoom) { return zoom == mapinfo.maxzoom ? 10 : 50; }
     87        });
     88        var hostilesMarkerGroup = L.markerClusterGroup({
     89                maxClusterRadius: function(zoom) { return zoom == mapinfo.maxzoom ? 10 : 50; }
     90        });
     91        var animalsMarkerGroup = L.markerClusterGroup({
    6092                maxClusterRadius: function(zoom) { return zoom == mapinfo.maxzoom ? 10 : 50; }
    6193        });
     
    107139        }
    108140       
     141        if (HasPermission ("webapi.gethostilelocation")) {
     142                layerControl.addOverlay (hostilesMarkerGroup, "Hostiles (<span id='mapControlHostileCount'>0</span>)");
     143                layerCount++;
     144        }
     145       
     146        if (HasPermission ("webapi.getanimalslocation")) {
     147                layerControl.addOverlay (animalsMarkerGroup, "Animals (<span id='mapControlAnimalsCount'>0</span>)");
     148                layerCount++;
     149        }
     150       
    109151        if (HasPermission ("webapi.getplayerslocation")) {
    110152                layerControl.addOverlay (playersOfflineMarkerGroup, "Players (offline) (<span id='mapControlOfflineCount'>0</span>)");
     
    120162
    121163
     164        var hostilesMappingList = {};
     165        var animalsMappingList = {};
    122166        var playersMappingList = {};
    123167
    124 
     168       
    125169
    126170        // ===============================================================================================
     
    155199                                marker = playersMappingList[val.steamid].currentPosMarker;
    156200                        } else {
    157                                 marker = L.marker([val.position.x, val.position.z]).bindPopup(
     201                                marker = L.marker([val.position.x, val.position.z], {icon: playerIcon}).bindPopup(
    158202                                        "Player: " + val.name +
    159203                                        (HasPermission ("webapi.getplayerinventory") ?
     
    226270
    227271
     272
     273
     274        // ===============================================================================================
     275        // Hostiles markers
     276
     277        var setHostileMarkers = function(data) {
     278                updatingMarkersHostile = true;
     279               
     280                var hostileCount = 0;
     281
     282                hostilesMarkerGroup.clearLayers();
     283               
     284                $.each( data, function( key, val ) {
     285                        var marker;
     286                        if (hostilesMappingList.hasOwnProperty(val.id)) {
     287                                marker = hostilesMappingList[val.id].currentPosMarker;
     288                        } else {
     289                                marker = L.marker([val.position.x, val.position.z], {icon: hostileIcon}).bindPopup(
     290                                        "Hostile: " + val.name
     291                                );
     292                                //hostilesMappingList[val.id] = { };
     293                                hostilesMarkerGroup.addLayer(marker);
     294                        }
     295
     296                        var bAbort = false;
     297                       
     298                        oldpos = marker.getLatLng ();
     299
     300                        //if ( oldpos.lat != val.position.x || oldpos.lng != val.position.z ) {
     301                        //      hostilesMarkerGroup.removeLayer(marker);
     302                                marker.setLatLng([val.position.x, val.position.z]);
     303                                marker.setOpacity(1.0);
     304                                hostilesMarkerGroup.addLayer(marker);
     305                        //}
     306
     307                        val.currentPosMarker = marker;
     308                        hostilesMappingList[val.id] = val;
     309                       
     310                        hostileCount++;
     311                });
     312               
     313                $( "#mapControlHostileCount" ).text( hostileCount );
     314               
     315                updatingMarkersHostile = false;
     316        }
     317
     318        var updateHostileTimeout;
     319        var updateHostileEvent = function() {
     320                $.getJSON( "../api/gethostilelocation")
     321                .done(setHostileMarkers)
     322                .fail(function(jqxhr, textStatus, error) {
     323                        console.log("Error fetching hostile list");
     324                })
     325                .always(function() {
     326                        updateHostileTimeout = window.setTimeout(updateHostileEvent, 4000);
     327                });
     328        }
     329
     330        tabs.on ("tabbedcontenttabopened", function (event, data) {
     331                if (data.newTab === "#tab_map") {
     332                        if (HasPermission ("webapi.gethostilelocation")) {
     333                                updateHostileEvent ();
     334                        }
     335                } else {
     336                        window.clearTimeout (updateHostileTimeout);
     337                }
     338        });
     339       
     340        if (tabs.tabbedContent ("isTabOpen", "tab_map")) {
     341                if (HasPermission ("webapi.gethostilelocation")) {
     342                        updateHostileEvent ();
     343                }
     344        }
     345
     346
     347
     348        // ===============================================================================================
     349        // Animals markers
     350
     351        var setAnimalMarkers = function(data) {
     352                updatingMarkersAnimals = true;
     353               
     354                var animalsCount = 0;
     355
     356                animalsMarkerGroup.clearLayers();
     357               
     358                $.each( data, function( key, val ) {
     359                        var marker;
     360                        if (animalsMappingList.hasOwnProperty(val.id)) {
     361                                marker = animalsMappingList[val.id].currentPosMarker;
     362                        } else {
     363                                marker = L.marker([val.position.x, val.position.z], {icon: animalIcon}).bindPopup(
     364                                        "Animal: " + val.name
     365                                );
     366                                //animalsMappingList[val.id] = { };
     367                                animalsMarkerGroup.addLayer(marker);
     368                        }
     369
     370                        var bAbort = false;
     371                       
     372                        oldpos = marker.getLatLng ();
     373
     374                        //if ( oldpos.lat != val.position.x || oldpos.lng != val.position.z ) {
     375                        //      animalsMarkerGroup.removeLayer(marker);
     376                                marker.setLatLng([val.position.x, val.position.z]);
     377                                marker.setOpacity(1.0);
     378                                animalsMarkerGroup.addLayer(marker);
     379                        //}
     380
     381                        val.currentPosMarker = marker;
     382                        animalsMappingList[val.id] = val;
     383                       
     384                        animalsCount++;
     385                });
     386               
     387                $( "#mapControlAnimalsCount" ).text( animalsCount );
     388               
     389                updatingMarkersAnimals = false;
     390        }
     391
     392        var updateAnimalsTimeout;
     393        var updateAnimalsEvent = function() {
     394                $.getJSON( "../api/getanimalslocation")
     395                .done(setAnimalMarkers)
     396                .fail(function(jqxhr, textStatus, error) {
     397                        console.log("Error fetching animals list");
     398                })
     399                .always(function() {
     400                        updateAnimalsTimeout = window.setTimeout(updateAnimalsEvent, 4000);
     401                });
     402        }
     403
     404        tabs.on ("tabbedcontenttabopened", function (event, data) {
     405                if (data.newTab === "#tab_map") {
     406                        if (HasPermission ("webapi.getanimalslocation")) {
     407                                updateAnimalsEvent ();
     408                        }
     409                } else {
     410                        window.clearTimeout (updateAnimalsTimeout);
     411                }
     412        });
     413       
     414        if (tabs.tabbedContent ("isTabOpen", "tab_map")) {
     415                if (HasPermission ("webapi.getanimalslocation")) {
     416                        updateAnimalsEvent ();
     417                }
     418        }
     419
    228420}
    229421
  • binary-improvements/webserver/js/stats.js

    r250 r251  
    1414                        $("#stats_time").html (time);
    1515                        $("#stats_players").html (data.players);
     16                        $("#stats_hostiles").html (data.hostiles);
     17                        $("#stats_animals").html (data.animals);
    1618                })
    1719                .fail(function(jqxhr, textStatus, error) {
     
    4042                        $("#stats_time").html (time);
    4143                        $("#stats_players").html (data.players);
     44                        $("#stats_hostiles").html (data.hostiles);
     45                        $("#stats_animals").html (data.animals);
    4246                        $("#newlogcount").html (data.newlogs);
    4347                        if (data.newlogs > 0) {
  • binary-improvements/webserver/sessionheader.tmpl

    r244 r251  
    33<head>
    44        <meta charset="UTF-8">
    5         <title>7dtd map browser</title>
     5        <title>7 Days to Die Map</title>
    66
    77        <!-- Own stylesheet -->
Note: See TracChangeset for help on using the changeset viewer.