Example #1
0
        ParseParams(List <string> parameters, CommandSenderInfo senderInfo)
        {
            // Parse /all parameter
            var all = parameters.Remove("/all");

            if (parameters.Count == 0)
            {
                throw new FriendlyMessageException(Resources.ErrorParameerCountNotValid);
            }

            // Parse prefab name
            var prefabName = parameters[0];

            // Verify existence of prefab files
            const string tts = global::Constants.cExtPrefabs; // Cannot interpolate in string: https://youtrack.jetbrains.com/issue/RSRP-465524

            if (!File.Exists(Path.Combine(Constants.PrefabsFolder, prefabName + ".xml")) ||
                !File.Exists(Path.Combine(Constants.PrefabsFolder, prefabName + tts)))
            {
                throw new FriendlyMessageException($"Could not find {prefabName}.xml/{tts} in {Constants.PrefabsFolder}.");
            }

            // Verify existence and validity of tile entity file
            if (all)
            {
                var fileName = prefabName + Export.TileEntityFileExtension;
                var filePath = Path.Combine(Constants.PrefabsFolder, fileName);
                if (!File.Exists(filePath))
                {
                    throw new FriendlyMessageException($"Could not find {fileName} in prefabs folder. This prefab does not have block metadata available, so you cannot use the /all option.");
                }
            }

            // Parse coordinates
            Vector3i pos1;

            if (parameters.Count == 1 || parameters.Count == 2)
            {
                pos1 = senderInfo.GetRemoteClientInfo().GetEntityPlayer().GetServerPos().ToVector3i();
            }
            else if (parameters.Count == 4 || parameters.Count == 5)
            {
                pos1 = CommandTools.ParseXYZ(parameters, 1);
            }
            else
            {
                throw new FriendlyMessageException(Resources.ErrorParameerCountNotValid);
            }

            // Parse rotation
            var rotate = 0;

            if (parameters.Count == 2 || parameters.Count == 5)
            {
                rotate = parameters[parameters.Count - 1].ToInt()
                         ?? throw new FriendlyMessageException("Rotation value is not valid. Allowed values: 0, 1, 2, or 3");
            }

            return(prefabName, pos1, rotate, all);
        }
Example #2
0
        /// <summary>
        /// Parses the given command parameters for the sender and returns the area to regenerate chunks for.
        /// </summary>
        /// <param name="parameters"></param>
        /// <param name="senderInfo"></param>
        /// <returns>The area from pos1 to pos2 for which chunks should be regenerated; y value should be ignored</returns>
        private static (Vector3i pos1, Vector3i pos2) ParseParams(List <string> parameters, CommandSenderInfo senderInfo)
        {
            Vector3i pos1, pos2;

            switch (parameters.Count)
            {
            case 0:
                // one point is enough; area will extend to the chunk
                pos1 = pos2 = senderInfo.GetRemoteClientInfo().GetEntityPlayer().GetServerPos().ToVector3i();
                break;

            case 1:
                var ci         = senderInfo.GetRemoteClientInfo();
                var currentPos = ci.GetEntityPlayer().GetServerPos().ToVector3i();
                switch (parameters[0])
                {
                case "from":
                    savedPos[ci.entityId] = currentPos;
                    throw new FriendlyMessageException("Your current position was saved: " + savedPos[ci.entityId]);

                case "to":
                    if (!savedPos.ContainsKey(ci.entityId))
                    {
                        throw new FriendlyMessageException("Please save start point of the area first. See help for details.");
                    }
                    pos1 = savedPos[ci.entityId];
                    pos2 = currentPos;
                    break;

                default:
                    throw new FriendlyMessageException("Parameter unknown. See help for details.");
                }
                break;

            case 4:
                pos1 = CommandTools.ParseXZ(parameters, 0);
                pos2 = CommandTools.ParseXZ(parameters, 2);
                break;

            default:
                throw new FriendlyMessageException(Resources.ErrorParameerCountNotValid);
            }

            return(pos1, pos2);
        }
Example #3
0
        private static (string prefabName, Vector3i pos1, Vector3i pos2) ParseParams(List <string> parameters, CommandSenderInfo senderInfo)
        {
            if (parameters.Count == 0)
            {
                var ci = senderInfo.GetRemoteClientInfo();
                savedPos[ci.entityId] = ci.GetEntityPlayer().GetServerPos().ToVector3i();
                throw new FriendlyMessageException("Your current position was saved: " + savedPos[ci.entityId]);
            }

            var prefabName = parameters[0];

            // Sanatize prefabName to only include allowed characters
            if (!Regex.IsMatch(prefabName, @"^\w[\w.-]*$", RegexOptions.CultureInvariant))
            {
                throw new FriendlyMessageException("The prefix name contains illegal characters. Please use only letters, numbers, dash, and underscore.");
            }

            Vector3i pos1, pos2;

            if (parameters.Count == 1)
            {
                var ci = senderInfo.GetRemoteClientInfo();
                if (!savedPos.ContainsKey(ci.entityId))
                {
                    throw new FriendlyMessageException("Please save start point of the area first. See help for details.");
                }
                pos1 = savedPos[ci.entityId];
                pos2 = ci.GetEntityPlayer().GetServerPos().ToVector3i();
            }
            else if (parameters.Count == 7)
            {
                pos1 = CommandTools.ParseXYZ(parameters, 1);
                pos2 = CommandTools.ParseXYZ(parameters, 4);
            }
            else
            {
                throw new FriendlyMessageException(Resources.ErrorParameerCountNotValid);
            }

            return(prefabName, pos1, pos2);
        }
Example #4
0
        public override void Execute(List <string> parameters, CommandSenderInfo senderInfo)
        {
            TelemetryTools.CollectEvent("command", "execute", GetCommands()[0]);
            try
            {
                var player = senderInfo.GetRemoteClientInfo().GetEntityPlayer();
                var world  = GameManager.Instance.World;

                var worldPosExact = player.GetServerPos();
                SdtdConsole.Instance.Output($"Exact player position in world (x y z): {worldPosExact.x} {worldPosExact.y} {worldPosExact.z}");

                var worldPos = worldPosExact.ToVector3i();
                SdtdConsole.Instance.Output($"Player block position in world (x y z): {worldPos.x} {worldPos.y} {worldPos.z}");

                //string mapPos = Math.Abs(worldPos.z) + (worldPos.z >= 0 ? "N " : "S ") + Math.Abs(worldPos.x) + (worldPos.x >= 0 ? "E " : "W "); // todo: add elevation
                //SdtdConsole.Instance.Output($"Map position in world: {mapPos}"); // todo: incorrect

                var chunkPos = World.toBlock(worldPos);
                SdtdConsole.Instance.Output($"Position in chunk (x y z): {chunkPos.x} {chunkPos.y} {chunkPos.z}");

                var chunkXZ = ChunkTools.WorldPosToChunkXZ(worldPos);
                SdtdConsole.Instance.Output($"Chunk (x z): {chunkXZ.x} {chunkXZ.z}");
                //var chunk = world.GetChunkSync(chunkXZ.x, chunkXZ.z) as Chunk;
                //if (chunk != null && chunk.ChunkCustomData.dict.Count > 0)
                //    SdtdConsole.Instance.Output(DumpCustomChunkData(chunk));

                var areaMasterChunkXY = Chunk.ToAreaMasterChunkPos(worldPos);
                SdtdConsole.Instance.Output($"Area master chunk (x z): {areaMasterChunkXY.x} {areaMasterChunkXY.z}");
                //var araeMasterChunk = world.GetChunkSync(areaMasterChunkXY.x, areaMasterChunkXY.z) as Chunk;
                //if (araeMasterChunk != null && araeMasterChunk.ChunkCustomData.dict.Count > 0)
                //    SdtdConsole.Instance.Output(DumpCustomChunkData(araeMasterChunk));

                var regionXZ = ChunkTools.ChunkXZToRegionXZ(chunkXZ);
                SdtdConsole.Instance.Output($"Region file: r.{regionXZ.x}.{regionXZ.z}.7rg");
            }
            catch (Exception ex)
            {
                CommandTools.HandleCommandException(ex);
            }
        }