source: binary-improvements/AllocsCommands/Commands/ListLandProtection.cs @ 371

Last change on this file since 371 was 371, checked in by alloc, 2 months ago

Fixed stuff using InternalId for every storage/lookup instead of a mix of both Native+Internal

File size: 4.6 KB
Line 
1using System;
2using System.Collections.Generic;
3using AllocsFixes.PersistentData;
4
5namespace AllocsFixes.CustomCommands {
6        public class ListLandProtection : ConsoleCmdAbstract {
7                public override string GetDescription () {
8                        return "lists all land protection blocks and owners";
9                }
10
11                public override string GetHelp () {
12                        return "Usage:\n" +
13                               "  1. listlandprotection summary\n" +
14                               "  2. listlandprotection <user id / player name / entity id> [parseable]\n" +
15                               "  3. listlandprotection nearby [length]\n" +
16                               "1. Lists only players that own claimstones, the number they own and the protection status\n" +
17                               "2. Lists only the claims of the player given by his UserID / entity id / playername, including the individual claim positions.\n" +
18                               "   If \"parseable\" is specified the output of the individual claims will be in a format better suited for programmatical readout.\n" +
19                               "3. Lists claims in a square with edge length of 64 (or the optionally specified size) around the executing player\n";
20                }
21
22                public override string[] GetCommands () {
23                        return new[] {"listlandprotection", "llp"};
24                }
25
26                public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
27                        if (_params.Count >= 1 && _params [0].EqualsCaseInsensitive ("nearby")) {
28                                if (_senderInfo.RemoteClientInfo != null) {
29                                        _params.Add (_senderInfo.RemoteClientInfo.entityId.ToString ());
30                                } else if (_senderInfo.IsLocalGame && !GameManager.IsDedicatedServer) {
31                                        _params.Add (GameManager.Instance.World.GetPrimaryPlayerId ().ToString ());
32                                }
33                        }
34
35                        World w = GameManager.Instance.World;
36                        PersistentPlayerList ppl = GameManager.Instance.GetPersistentPlayerList ();
37
38                        bool summaryOnly = false;
39                        PlatformUserIdentifierAbs userIdFilter = null;
40                        Vector3i closeTo = default (Vector3i);
41                        bool onlyCloseToPlayer = false;
42                        int closeToDistance = 32;
43                        bool parseableOutput = false;
44
45                        if (_params.Contains ("parseable")) {
46                                parseableOutput = true;
47                                _params.Remove ("parseable");
48                        }
49
50                        if (_params.Count == 1) {
51                                if (_params [0].EqualsCaseInsensitive ("summary")) {
52                                        summaryOnly = true;
53                                } else if (PlatformUserIdentifierAbs.TryFromCombinedString (_params[0], out userIdFilter)) {
54                                } else {
55                                        ClientInfo ci = ConsoleHelper.ParseParamIdOrName (_params [0]);
56                                        if (ci != null) {
57                                                userIdFilter = ci.InternalId;
58                                        } else {
59                                                SdtdConsole.Instance.Output ("Player name or entity id \"" + _params [0] + "\" not found.");
60                                                return;
61                                        }
62                                }
63                        } else if (_params.Count >= 2) {
64                                if (_params [0].EqualsCaseInsensitive ("nearby")) {
65                                        try {
66                                                if (_params.Count == 3) {
67                                                        if (!int.TryParse (_params [1], out closeToDistance)) {
68                                                                SdtdConsole.Instance.Output ("Given length is not an integer!");
69                                                                return;
70                                                        }
71
72                                                        closeToDistance /= 2;
73                                                }
74
75                                                int entityId = int.Parse (_params [_params.Count - 1]);
76                                                EntityPlayer ep = w.Players.dict [entityId];
77                                                closeTo = new Vector3i (ep.GetPosition ());
78                                                onlyCloseToPlayer = true;
79                                        } catch (Exception e) {
80                                                SdtdConsole.Instance.Output ("Error getting current player's position");
81                                                Log.Out ("Error in ListLandProtection.Run: " + e);
82                                                return;
83                                        }
84                                } else {
85                                        SdtdConsole.Instance.Output ("Illegal parameter list");
86                                        return;
87                                }
88                        }
89
90
91                        LandClaimList.OwnerFilter[] ownerFilters = null;
92                        if (userIdFilter != null) {
93                                ownerFilters = new[] {LandClaimList.UserIdFilter (userIdFilter)};
94                        }
95
96                        LandClaimList.PositionFilter[] posFilters = null;
97                        if (onlyCloseToPlayer) {
98                                posFilters = new[] {LandClaimList.CloseToFilter2dRect (closeTo, closeToDistance)};
99                        }
100
101                        Dictionary<Player, List<Vector3i>> claims = LandClaimList.GetLandClaims (ownerFilters, posFilters);
102
103                        foreach (KeyValuePair<Player, List<Vector3i>> kvp in claims) {
104                                SdtdConsole.Instance.Output (string.Format (
105                                        "Player \"{0} ({1})\" owns {4} keystones (protected: {2}, current hardness multiplier: {3})",
106                                        kvp.Key.Name,
107                                        kvp.Key.PlatformId,
108                                        kvp.Key.LandProtectionActive,
109                                        kvp.Key.LandProtectionMultiplier,
110                                        kvp.Value.Count));
111                                if (!summaryOnly) {
112                                        foreach (Vector3i v in kvp.Value) {
113                                                if (parseableOutput) {
114                                                        SdtdConsole.Instance.Output ("LandProtectionOf: id=" + kvp.Key.PlatformId +
115                                                                                     ", playerName=" + kvp.Key.Name + ", location=" + v);
116                                                } else {
117                                                        SdtdConsole.Instance.Output ("   (" + v + ")");
118                                                }
119                                        }
120                                }
121                        }
122
123                        if (userIdFilter == null) {
124                                SdtdConsole.Instance.Output ("Total of " + ppl.m_lpBlockMap.Count + " keystones in the game");
125                        }
126                }
127        }
128}
Note: See TracBrowser for help on using the repository browser.