Index: binary-improvements2/CommandExtensions/CommandExtensions.csproj
===================================================================
--- binary-improvements2/CommandExtensions/CommandExtensions.csproj	(revision 405)
+++ binary-improvements2/CommandExtensions/CommandExtensions.csproj	(revision 422)
@@ -74,20 +74,9 @@
     <Compile Include="src\Commands\Give.cs" />
     <Compile Include="src\Commands\ListItems.cs" />
-    <Compile Include="src\Commands\ListKnownPlayers.cs" />
-    <Compile Include="src\Commands\ListLandProtection.cs" />
-    <Compile Include="src\Commands\RemoveLandProtection.cs" />
     <Compile Include="src\Commands\Reply.cs" />
     <Compile Include="src\Commands\SayToPlayer.cs" />
-    <Compile Include="src\Commands\ShowInventory.cs" />
     <Compile Include="src\PrivateMessageConnections.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <ItemGroup>
-    <ProjectReference Include="..\7dtd-server-fixes\7dtd-server-fixes.csproj">
-      <Project>{81DA7F87-1A66-4920-AADA-6EAF1971F8D0}</Project>
-      <Name>7dtd-server-fixes</Name>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
   <ItemGroup>
     <None Include="ModInfo.xml">
Index: binary-improvements2/CommandExtensions/ModInfo.xml
===================================================================
--- binary-improvements2/CommandExtensions/ModInfo.xml	(revision 405)
+++ binary-improvements2/CommandExtensions/ModInfo.xml	(revision 422)
@@ -5,5 +5,5 @@
 	<Description value="Additional commands for server operation" />
 	<Author value="The Fun Pimps LLC" />
-	<Version value="21.0" />
+	<Version value="21.0.246.0" />
 	<Website value="" />
 </xml>
Index: binary-improvements2/CommandExtensions/src/Commands/ListKnownPlayers.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/ListKnownPlayers.cs	(revision 405)
+++ 	(revision )
@@ -1,76 +1,0 @@
-using System.Collections.Generic;
-using AllocsFixes.PersistentData;
-using JetBrains.Annotations;
-
-namespace CommandExtensions.Commands {
-	[UsedImplicitly]
-	public class ListKnownPlayers : ConsoleCmdAbstract {
-		protected override string getDescription () {
-			return "lists all players that were ever online";
-		}
-
-		protected override string getHelp () {
-			return "Usage:\n" +
-			       "  1. listknownplayers\n" +
-			       "  2. listknownplayers -online\n" +
-			       "  3. listknownplayers -notbanned\n" +
-			       "  4. listknownplayers <player name / userid>\n" +
-			       "1. Lists all players that have ever been online\n" +
-			       "2. Lists only the players that are currently online\n" +
-			       "3. Lists only the players that are not banned\n" +
-			       "4. Lists all players whose name contains the given string or matches the given UserID";
-		}
-
-		protected override string[] getCommands () {
-			return new[] {"listknownplayers", "lkp"};
-		}
-
-		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
-			AdminTools admTools = GameManager.Instance.adminTools;
-
-			bool onlineOnly = false;
-			bool notBannedOnly = false;
-			string nameFilter = string.Empty;
-			PlatformUserIdentifierAbs userIdFilter = null;
-
-			if (_params.Count == 1) {
-				if (_params [0].EqualsCaseInsensitive ("-online")) {
-					onlineOnly = true;
-				} else if (_params [0].EqualsCaseInsensitive ("-notbanned")) {
-					notBannedOnly = true;
-				} else if (PlatformUserIdentifierAbs.TryFromCombinedString (_params [0], out userIdFilter)) {
-					// if true nothing to do, set by the out parameter
-				} else {
-					nameFilter = _params [0];
-				}
-			}
-
-			if (userIdFilter != null) {
-				Player p = PersistentContainer.Instance.Players [userIdFilter, false];
-
-				if (p != null) {
-					SdtdConsole.Instance.Output (
-						$"{0}. {p.Name}, id={p.EntityID}, steamid={_params [0]}, online={p.IsOnline}, ip={p.IP}, playtime={p.TotalPlayTime / 60} m, seen={p.LastOnline:yyyy-MM-dd HH:mm}"
-					);
-				} else {
-					SdtdConsole.Instance.Output ($"SteamID {_params [0]} unknown!");
-				}
-			} else {
-				int num = 0;
-				foreach ((PlatformUserIdentifierAbs userId, Player player) in PersistentContainer.Instance.Players.Dict) {
-					if (
-						(!onlineOnly || player.IsOnline)
-						&& (!notBannedOnly || !admTools.Blacklist.IsBanned (userId, out _, out _))
-						&& (nameFilter.Length == 0 || player.Name.ContainsCaseInsensitive (nameFilter))
-					) {
-						SdtdConsole.Instance.Output (
-							$"{++num}. {player.Name}, id={player.EntityID}, steamid={userId}, online={player.IsOnline}, ip={player.IP}, playtime={player.TotalPlayTime / 60} m, seen={player.LastOnline:yyyy-MM-dd HH:mm}"
-						);
-					}
-				}
-
-				SdtdConsole.Instance.Output ($"Total of {PersistentContainer.Instance.Players.Count} known");
-			}
-		}
-	}
-}
Index: binary-improvements2/CommandExtensions/src/Commands/ListLandProtection.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/ListLandProtection.cs	(revision 405)
+++ 	(revision )
@@ -1,129 +1,0 @@
-using System;
-using System.Collections.Generic;
-using AllocsFixes;
-using AllocsFixes.PersistentData;
-using JetBrains.Annotations;
-
-namespace CommandExtensions.Commands {
-	[UsedImplicitly]
-	public class ListLandProtection : ConsoleCmdAbstract {
-		protected override string getDescription () {
-			return "lists all land protection blocks and owners";
-		}
-
-		protected override string getHelp () {
-			return "Usage:\n" +
-			       "  1. listlandprotection summary\n" +
-			       "  2. listlandprotection <user id / player name / entity id> [parseable]\n" +
-			       "  3. listlandprotection nearby [length]\n" +
-			       "1. Lists only players that own claimstones, the number they own and the protection status\n" +
-			       "2. Lists only the claims of the player given by his UserID / entity id / playername, including the individual claim positions.\n" +
-			       "   If \"parseable\" is specified the output of the individual claims will be in a format better suited for programmatical readout.\n" +
-			       "3. Lists claims in a square with edge length of 64 (or the optionally specified size) around the executing player\n";
-		}
-
-		protected override string[] getCommands () {
-			return new[] {"listlandprotection", "llp"};
-		}
-
-		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
-			if (_params.Count >= 1 && _params [0].EqualsCaseInsensitive ("nearby")) {
-				if (_senderInfo.RemoteClientInfo != null) {
-					_params.Add (_senderInfo.RemoteClientInfo.entityId.ToString ());
-				} else if (_senderInfo.IsLocalGame && !GameManager.IsDedicatedServer) {
-					_params.Add (GameManager.Instance.World.GetPrimaryPlayerId ().ToString ());
-				}
-			}
-
-			World w = GameManager.Instance.World;
-			PersistentPlayerList ppl = GameManager.Instance.GetPersistentPlayerList ();
-
-			bool summaryOnly = false;
-			PlatformUserIdentifierAbs userIdFilter = null;
-			Vector3i closeTo = default;
-			bool onlyCloseToPlayer = false;
-			int closeToDistance = 32;
-			bool parseableOutput = false;
-
-			if (_params.Contains ("parseable")) {
-				parseableOutput = true;
-				_params.Remove ("parseable");
-			}
-
-			if (_params.Count == 1) {
-				if (_params [0].EqualsCaseInsensitive ("summary")) {
-					summaryOnly = true;
-				} else if (PlatformUserIdentifierAbs.TryFromCombinedString (_params[0], out userIdFilter)) {
-				} else {
-					ClientInfo ci = ConsoleHelper.ParseParamIdOrName (_params [0]);
-					if (ci != null) {
-						userIdFilter = ci.InternalId;
-					} else {
-						SdtdConsole.Instance.Output ($"Player name or entity id \"{_params [0]}\" not found.");
-						return;
-					}
-				}
-			} else if (_params.Count >= 2) {
-				if (_params [0].EqualsCaseInsensitive ("nearby")) {
-					try {
-						if (_params.Count == 3) {
-							if (!int.TryParse (_params [1], out closeToDistance)) {
-								SdtdConsole.Instance.Output ("Given length is not an integer!");
-								return;
-							}
-
-							closeToDistance /= 2;
-						}
-
-						int entityId = int.Parse (_params [_params.Count - 1]);
-						EntityPlayer ep = w.Players.dict [entityId];
-						closeTo = new Vector3i (ep.GetPosition ());
-						onlyCloseToPlayer = true;
-					} catch (Exception e) {
-						SdtdConsole.Instance.Output ("Error getting current player's position");
-						Log.Out ($"Error in ListLandProtection.Run: {e}");
-						return;
-					}
-				} else {
-					SdtdConsole.Instance.Output ("Illegal parameter list");
-					return;
-				}
-			}
-
-
-			LandClaimList.OwnerFilter[] ownerFilters = null;
-			if (userIdFilter != null) {
-				ownerFilters = new[] {LandClaimList.UserIdFilter (userIdFilter)};
-			}
-
-			LandClaimList.PositionFilter[] posFilters = null;
-			if (onlyCloseToPlayer) {
-				posFilters = new[] {LandClaimList.CloseToFilter2dRect (closeTo, closeToDistance)};
-			}
-
-			Dictionary<Player, List<Vector3i>> claims = LandClaimList.GetLandClaims (ownerFilters, posFilters);
-
-			foreach ((Player claimOwner, List<Vector3i> claimPositions) in claims) {
-				SdtdConsole.Instance.Output (
-					$"Player \"{claimOwner.Name} ({claimOwner.PlatformId})\" owns {claimPositions.Count} keystones (protected: {claimOwner.LandProtectionActive}, current hardness multiplier: {claimOwner.LandProtectionMultiplier})");
-				
-				if (summaryOnly) {
-					continue;
-				}
-
-				foreach (Vector3i v in claimPositions) {
-					if (parseableOutput) {
-						SdtdConsole.Instance.Output (
-							$"LandProtectionOf: id={claimOwner.PlatformId}, playerName={claimOwner.Name}, location={v}");
-					} else {
-						SdtdConsole.Instance.Output ($"   ({v})");
-					}
-				}
-			}
-
-			if (userIdFilter == null) {
-				SdtdConsole.Instance.Output ($"Total of {ppl.m_lpBlockMap.Count} keystones in the game");
-			}
-		}
-	}
-}
Index: binary-improvements2/CommandExtensions/src/Commands/RemoveLandProtection.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/RemoveLandProtection.cs	(revision 405)
+++ 	(revision )
@@ -1,143 +1,0 @@
-using System;
-using System.Collections.Generic;
-using AllocsFixes;
-using AllocsFixes.PersistentData;
-using JetBrains.Annotations;
-
-namespace CommandExtensions.Commands {
-	[UsedImplicitly]
-	public class RemoveLandProtection : ConsoleCmdAbstract {
-		protected override string getDescription () {
-			return "removes the association of a land protection block to the owner";
-		}
-
-		protected override string getHelp () {
-			return "Usage:" +
-			       "  1. removelandprotection <userid>\n" +
-			       "  2. removelandprotection <x> <y> <z>\n" +
-			       "  3. removelandprotection nearby [length]\n" +
-			       "1. Remove all land claims owned by the user with the given UserID\n" +
-			       "2. Remove only the claim block on the exactly given block position\n" +
-			       "3. Remove all claims in a square with edge length of 64 (or the optionally specified size) around the executing player";
-		}
-
-		protected override string[] getCommands () {
-			return new[] {"removelandprotection", "rlp"};
-		}
-
-		private void removeById (string _id) {
-			try {
-				if (!PlatformUserIdentifierAbs.TryFromCombinedString (_id, out PlatformUserIdentifierAbs userId)) {
-					SdtdConsole.Instance.Output (
-						"Not a valid Steam ID or user has never logged on. Use \"listlandprotection\" to get a list of keystones.");
-					return;
-				}
-				
-				PersistentPlayerList ppl = GameManager.Instance.GetPersistentPlayerList ();
-
-				if (ppl.Players [userId].LPBlocks == null || ppl.Players [userId].LPBlocks.Count == 0) {
-					SdtdConsole.Instance.Output (
-						"Player does not own any keystones. Use \"listlandprotection\" to get a list of keystones.");
-					return;
-				}
-
-				List<BlockChangeInfo> changes = new List<BlockChangeInfo> ();
-				foreach (Vector3i pos in ppl.Players [userId].LPBlocks) {
-					BlockChangeInfo bci = new BlockChangeInfo (pos, new BlockValue (0), true, false);
-					changes.Add (bci);
-				}
-
-				GameManager.Instance.SetBlocksRPC (changes);
-
-				SdtdConsole.Instance.Output (
-					$"Tried to remove #{changes.Count} land protection blocks for player \"{_id}\". Note that only blocks in chunks that are currently loaded (close to any player) could be removed. Please check for remaining blocks by running:");
-				SdtdConsole.Instance.Output ($"  listlandprotection {_id}");
-			} catch (Exception e) {
-				Log.Out ($"Error in RemoveLandProtection.removeById: {e}");
-			}
-		}
-
-		private void removeByPosition (List<string> _coords) {
-			int.TryParse (_coords [0], out int x);
-			int.TryParse (_coords [1], out int y);
-			int.TryParse (_coords [2], out int z);
-
-			if (x == int.MinValue || y == int.MinValue || z == int.MinValue) {
-				SdtdConsole.Instance.Output ("At least one of the given coordinates is not a valid integer");
-				return;
-			}
-
-			Vector3i v = new Vector3i (x, y, z);
-
-			PersistentPlayerList ppl = GameManager.Instance.GetPersistentPlayerList ();
-
-			Dictionary<Vector3i, PersistentPlayerData> d = ppl.m_lpBlockMap;
-			if (d == null || !d.ContainsKey (v)) {
-				SdtdConsole.Instance.Output (
-					"No land protection block at the given position or not a valid position. Use \"listlandprotection\" to get a list of keystones.");
-				return;
-			}
-
-			BlockChangeInfo bci = new BlockChangeInfo (v, new BlockValue (0), true, false);
-
-			List<BlockChangeInfo> changes = new List<BlockChangeInfo> {bci};
-
-			GameManager.Instance.SetBlocksRPC (changes);
-
-			SdtdConsole.Instance.Output ($"Land protection block at ({v}) removed");
-		}
-
-		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
-			if (_params.Count > 0 && _params [0].EqualsCaseInsensitive ("nearby")) {
-				if (_senderInfo.RemoteClientInfo != null) {
-					_params.Add (_senderInfo.RemoteClientInfo.entityId.ToString ());
-				} else if (_senderInfo.IsLocalGame && !GameManager.IsDedicatedServer) {
-					_params.Add (GameManager.Instance.World.GetPrimaryPlayerId ().ToString ());
-				}
-
-				try {
-					int closeToDistance = 32;
-					if (_params.Count == 3) {
-						if (!int.TryParse (_params [1], out closeToDistance)) {
-							SdtdConsole.Instance.Output ("Given length is not an integer!");
-							return;
-						}
-
-						closeToDistance /= 2;
-					}
-
-					int entityId = int.Parse (_params [_params.Count - 1]);
-					EntityPlayer ep = GameManager.Instance.World.Players.dict [entityId];
-					Vector3i closeTo = new Vector3i (ep.GetPosition ());
-					LandClaimList.PositionFilter[] posFilters =
-						{LandClaimList.CloseToFilter2dRect (closeTo, closeToDistance)};
-					Dictionary<Player, List<Vector3i>> claims = LandClaimList.GetLandClaims (null, posFilters);
-
-					try {
-						List<BlockChangeInfo> changes = new List<BlockChangeInfo> ();
-						foreach (KeyValuePair<Player, List<Vector3i>> kvp in claims) {
-							foreach (Vector3i v in kvp.Value) {
-								BlockChangeInfo bci = new BlockChangeInfo (v, new BlockValue (0), true, false);
-								changes.Add (bci);
-							}
-						}
-
-						GameManager.Instance.SetBlocksRPC (changes);
-					} catch (Exception e) {
-						SdtdConsole.Instance.Output ("Error removing claims");
-						Log.Out ($"Error in RemoveLandProtection.Run: {e}");
-					}
-				} catch (Exception e) {
-					SdtdConsole.Instance.Output ("Error getting current player's position");
-					Log.Out ($"Error in RemoveLandProtection.Run: {e}");
-				}
-			} else if (_params.Count == 1) {
-				removeById (_params [0]);
-			} else if (_params.Count == 3) {
-				removeByPosition (_params);
-			} else {
-				SdtdConsole.Instance.Output ("Illegal parameters");
-			}
-		}
-	}
-}
Index: binary-improvements2/CommandExtensions/src/Commands/ShowInventory.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/ShowInventory.cs	(revision 405)
+++ 	(revision )
@@ -1,183 +1,0 @@
-using System.Collections.Generic;
-using AllocsFixes.PersistentData;
-using JetBrains.Annotations;
-
-namespace CommandExtensions.Commands {
-	[UsedImplicitly]
-	public class ShowInventory : ConsoleCmdAbstract {
-		protected override string getDescription () {
-			return "list inventory of a given player";
-		}
-
-		protected override string getHelp () {
-			return "Usage:\n" +
-			       "   showinventory <user id / player name / entity id> [tag]\n" +
-			       "Show the inventory of the player given by his UserID, player name or\n" +
-			       "entity id (as given by e.g. \"lpi\").\n" +
-			       "Optionally specify a tag that is included in each line of the output. In\n" +
-			       "this case output is designed to be easily parseable by tools.\n" +
-			       "Note: This only shows the player's inventory after it was first sent to\n" +
-			       "the server which happens at least every 30 seconds.";
-		}
-
-		protected override string[] getCommands () {
-			return new[] {"showinventory", "si"};
-		}
-
-		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
-			if (_params.Count < 1) {
-				SdtdConsole.Instance.Output ("Usage: showinventory <steamid|playername|entityid> [tag]");
-				return;
-			}
-
-			PlatformUserIdentifierAbs steamid = PersistentContainer.Instance.Players.GetSteamID (_params [0], true);
-			if (steamid == null) {
-				SdtdConsole.Instance.Output (
-					"Playername or entity/steamid id not found or no inventory saved (first saved after a player has been online for 30s).");
-				return;
-			}
-
-			string tag = null;
-			if (_params.Count > 1 && _params [1].Length > 0) {
-				tag = _params [1];
-			}
-
-			Player p = PersistentContainer.Instance.Players [steamid, false];
-			AllocsFixes.PersistentData.Inventory inv = p.Inventory;
-
-			if (tag == null) {
-				SdtdConsole.Instance.Output ($"Belt of player {p.Name}:");
-			}
-
-			PrintInv (inv.belt, p.EntityID, "belt", tag);
-			if (tag == null) {
-				SdtdConsole.Instance.Output (string.Empty);
-			}
-
-			if (tag == null) {
-				SdtdConsole.Instance.Output ($"Bagpack of player {p.Name}:");
-			}
-
-			PrintInv (inv.bag, p.EntityID, "backpack", tag);
-			if (tag == null) {
-				SdtdConsole.Instance.Output (string.Empty);
-			}
-
-			if (tag == null) {
-				SdtdConsole.Instance.Output ($"Equipment of player {p.Name}:");
-			}
-
-			PrintEquipment (inv.equipment, p.EntityID, "equipment", tag);
-
-			if (tag != null) {
-				SdtdConsole.Instance.Output ($"tracker_item id={p.EntityID}, tag={tag}, SHOWINVENTORY DONE");
-			}
-		}
-
-		private void PrintInv (List<InvItem> _inv, int _entityId, string _location, string _tag) {
-			for (int i = 0; i < _inv.Count; i++) {
-				if (_inv [i] == null) {
-					continue;
-				}
-
-				if (_tag == null) {
-					// no Tag defined -> readable output
-					if (_inv [i].quality < 0) {
-						SdtdConsole.Instance.Output ($"    Slot {i}: {_inv [i].count:000} * {_inv [i].itemName}");
-					} else {
-						SdtdConsole.Instance.Output ($"    Slot {i}: {_inv [i].count:000} * {_inv [i].itemName} - quality: {_inv [i].quality}");
-					}
-
-					DoParts (_inv [i].parts, 1, null);
-				} else {
-					// Tag defined -> parseable output
-					string partsMsg = DoParts (_inv [i].parts, 1, "");
-					string msg =
-						$"tracker_item id={_entityId}, tag={_tag}, location={_location}, slot={i}, item={_inv [i].itemName}, qnty={_inv [i].count}, quality={_inv [i].quality}, parts=({partsMsg})";
-					SdtdConsole.Instance.Output (msg);
-				}
-			}
-		}
-
-		private void PrintEquipment (InvItem[] _equipment, int _entityId, string _location, string _tag) {
-			AddEquipment ("head", _equipment, EquipmentSlots.Headgear, _entityId, _location, _tag);
-			AddEquipment ("eyes", _equipment, EquipmentSlots.Eyewear, _entityId, _location, _tag);
-			AddEquipment ("face", _equipment, EquipmentSlots.Face, _entityId, _location, _tag);
-
-			AddEquipment ("armor", _equipment, EquipmentSlots.ChestArmor, _entityId, _location, _tag);
-			AddEquipment ("jacket", _equipment, EquipmentSlots.Jacket, _entityId, _location, _tag);
-			AddEquipment ("shirt", _equipment, EquipmentSlots.Shirt, _entityId, _location, _tag);
-
-			AddEquipment ("legarmor", _equipment, EquipmentSlots.LegArmor, _entityId, _location, _tag);
-			AddEquipment ("pants", _equipment, EquipmentSlots.Legs, _entityId, _location, _tag);
-			AddEquipment ("boots", _equipment, EquipmentSlots.Feet, _entityId, _location, _tag);
-
-			AddEquipment ("gloves", _equipment, EquipmentSlots.Hands, _entityId, _location, _tag);
-		}
-
-		private void AddEquipment (string _slotname, InvItem[] _items, EquipmentSlots _slot, int _entityId,
-			string _location, string _tag) {
-			int[] slotindices = XUiM_PlayerEquipment.GetSlotIndicesByEquipmentSlot (_slot);
-
-			for (int i = 0; i < slotindices.Length; i++) {
-				if (_items? [slotindices [i]] == null) {
-					continue;
-				}
-
-				InvItem item = _items [slotindices [i]];
-				if (_tag == null) {
-					// no Tag defined -> readable output
-					if (item.quality < 0) {
-						SdtdConsole.Instance.Output ($"    Slot {_slotname:8}: {item.itemName:000}");
-					} else {
-						SdtdConsole.Instance.Output ($"    Slot {_slotname:8}: {item.itemName:000} - quality: {item.quality}");
-					}
-
-					DoParts (_items [slotindices [i]].parts, 1, null);
-				} else {
-					// Tag defined -> parseable output
-					string partsMsg = DoParts (_items [slotindices [i]].parts, 1, "");
-					string msg =
-						$"tracker_item id={_entityId}, tag={_tag}, location={_location}, slot={_slotname}, item={item.itemName}, qnty=1, quality={item.quality}, parts=({partsMsg})";
-					SdtdConsole.Instance.Output (msg);
-				}
-
-				return;
-			}
-		}
-
-		private string DoParts (InvItem[] _parts, int _indent, string _currentMessage) {
-			if (_parts == null || _parts.Length <= 0) {
-				return _currentMessage;
-			}
-
-			string indenter = new string (' ', _indent * 4);
-			for (int i = 0; i < _parts.Length; i++) {
-				if (_parts [i] == null) {
-					continue;
-				}
-
-				if (_currentMessage == null) {
-					// no currentMessage given -> readable output
-					if (_parts [i].quality < 0) {
-						SdtdConsole.Instance.Output ($"{indenter}         - {_parts [i].itemName}");
-					} else {
-						SdtdConsole.Instance.Output ($"{indenter}         - {_parts [i].itemName} - quality: {_parts [i].quality}");
-					}
-
-					DoParts (_parts [i].parts, _indent + 1, _currentMessage);
-				} else {
-					// currentMessage given -> parseable output
-					if (_currentMessage.Length > 0) {
-						_currentMessage += ",";
-					}
-
-					_currentMessage += $"{_parts [i].itemName}@{_parts [i].quality}";
-					_currentMessage = DoParts (_parts [i].parts, _indent + 1, _currentMessage);
-				}
-			}
-
-			return _currentMessage;
-		}
-	}
-}
