Index: binary-improvements/AllocsCommands/Commands/Give.cs
===================================================================
--- binary-improvements/AllocsCommands/Commands/Give.cs	(revision 238)
+++ binary-improvements/AllocsCommands/Commands/Give.cs	(revision 250)
@@ -5,8 +5,6 @@
 namespace AllocsFixes.CustomCommands
 {
-	public class Give : ConsoleCmdAbstract
-	{
-		public override string GetDescription ()
-		{
+	public class Give : ConsoleCmdAbstract {
+		public override string GetDescription () {
 			return "give an item to a player (entity id or name)";
 		}
@@ -14,21 +12,21 @@
 		public override string GetHelp () {
 			return "Give an item to a player by dropping it in front of that player\n" +
-				   "Usage:\n" +
-				   "   give <name / entity id> <item name> <amount>\n" +
-				   "Either pass the full name of a player or his entity id (given by e.g. \"lpi\").\n" +
-				   "Item name has to be the exact name of an item as listed by \"listitems\".\n" +
-				   "Amount is the number of instances of this item to drop (as a single stack).";
+				"Usage:\n" +
+				"   give <name / entity id> <item name> <amount>\n" +
+				"   give <name / entity id> <item name> <amount> <quality>\n" +
+				"Either pass the full name of a player or his entity id (given by e.g. \"lpi\").\n" +
+				"Item name has to be the exact name of an item as listed by \"listitems\".\n" +
+				"Amount is the number of instances of this item to drop (as a single stack).\n" +
+				"Quality is the quality of the dropped items for items that have a quality.";
 		}
 
-		public override string[] GetCommands ()
-		{
+		public override string[] GetCommands () {
 			return new string[] { "give", string.Empty };
 		}
 
-		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo)
-		{
+		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
 			try {
-				if (_params.Count != 3) {
-					SdtdConsole.Instance.Output ("Wrong number of arguments, expected 3, found " + _params.Count + ".");
+				if (_params.Count != 3 && _params.Count != 4) {
+					SdtdConsole.Instance.Output ("Wrong number of arguments, expected 3 or 4, found " + _params.Count + ".");
 					return;
 				}
@@ -41,5 +39,5 @@
 				}
 
-				ItemValue iv = ItemList.Instance.GetItemValue (_params[1]);
+				ItemValue iv = ItemList.Instance.GetItemValue (_params [1]);
 				if (iv == null) {
 					SdtdConsole.Instance.Output ("Item not found.");
@@ -51,4 +49,18 @@
 					SdtdConsole.Instance.Output ("Amount is not an integer or not greater than zero.");
 					return;
+				}
+
+				if (_params.Count == 4) {
+					if (!iv.HasQuality) {
+						SdtdConsole.Instance.Output ("Item " + _params [1] + " does not support quality.");
+						return;
+					}
+
+					int quality = int.MinValue;
+					if (!int.TryParse (_params [3], out quality) || quality <= 0) {
+						SdtdConsole.Instance.Output ("Quality is not an integer or not greater than zero.");
+						return;
+					}
+					iv.Quality = quality;
 				}
 
Index: binary-improvements/AllocsCommands/Commands/ShowInventory.cs
===================================================================
--- binary-improvements/AllocsCommands/Commands/ShowInventory.cs	(revision 238)
+++ binary-improvements/AllocsCommands/Commands/ShowInventory.cs	(revision 250)
@@ -5,8 +5,6 @@
 namespace AllocsFixes.CustomCommands
 {
-	public class ShowInventory : ConsoleCmdAbstract
-	{
-		public override string GetDescription ()
-		{
+	public class ShowInventory : ConsoleCmdAbstract {
+		public override string GetDescription () {
 			return "list inventory of a given player";
 		}
@@ -14,18 +12,16 @@
 		public override string GetHelp () {
 			return "Usage:\n" +
-				   "   showinventory <steam id / player name / entity id>\n" +
-				   "Show the inventory of the player given by his SteamID, player name or\n" +
-				   "entity id (as given by e.g. \"lpi\")." +
-				   "Note: This only shows the player's inventory after it was first sent to\n" +
-				   "the server which happens at least every 30 seconds.";
+				"   showinventory <steam id / player name / entity id>\n" +
+				"Show the inventory of the player given by his SteamID, player name or\n" +
+				"entity id (as given by e.g. \"lpi\")." +
+				"Note: This only shows the player's inventory after it was first sent to\n" +
+				"the server which happens at least every 30 seconds.";
 		}
 
-		public override string[] GetCommands ()
-		{
+		public override string[] GetCommands () {
 			return new string[] { "showinventory", "si" };
 		}
 
-		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo)
-		{
+		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
 			try {
 				if (_params.Count < 1) {
@@ -44,19 +40,77 @@
 
 				SdtdConsole.Instance.Output ("Belt of player " + p.Name + ":");
-				for (int i = 0; i < inv.belt.Count; i++) {
-					if (inv.belt [i] != null)
-						SdtdConsole.Instance.Output (string.Format ("    Slot {0}: {1:000} * {2}", i, inv.belt [i].count, inv.belt [i].itemName));
-				}
+				PrintInv (inv.belt);
 				SdtdConsole.Instance.Output (string.Empty);
+
 				SdtdConsole.Instance.Output ("Bagpack of player " + p.Name + ":");
-				for (int i = 0; i < inv.bag.Count; i++) {
-					if (inv.bag [i] != null)
-						SdtdConsole.Instance.Output (string.Format ("    Slot {0}: {1:000} * {2}", i, inv.bag [i].count, inv.bag [i].itemName));
-				}
+				PrintInv (inv.bag);
 				SdtdConsole.Instance.Output (string.Empty);
+
+				SdtdConsole.Instance.Output ("Equipment of player " + p.Name + ":");
+				PrintEquipment (inv.equipment);
+
 			} catch (Exception e) {
 				Log.Out ("Error in ShowInventory.Run: " + e);
 			}
 		}
+
+		private void PrintInv (List<InvItem> _inv) {
+			for (int i = 0; i < _inv.Count; i++) {
+				if (_inv [i] != null) {
+					if (_inv [i].quality < 0) {
+						SdtdConsole.Instance.Output (string.Format ("    Slot {0}: {1:000} * {2}", i, _inv [i].count, _inv [i].itemName));
+					} else {
+						SdtdConsole.Instance.Output (string.Format ("    Slot {0}: {1:000} * {2} - quality: {3}", i, _inv [i].count, _inv [i].itemName, _inv [i].quality));
+					}
+					DoParts (_inv [i].parts, 1);
+				}
+			}
+		}
+
+		private void PrintEquipment (InvItem[] _equipment) {
+			AddEquipment ("head", _equipment, XMLData.Item.EnumEquipmentSlot.Head, NGuiInvGridEquipment.EnumClothingLayer.Middle);
+			AddEquipment ("eyes", _equipment, XMLData.Item.EnumEquipmentSlot.Eyes, NGuiInvGridEquipment.EnumClothingLayer.Middle);
+			AddEquipment ("face", _equipment, XMLData.Item.EnumEquipmentSlot.Face, NGuiInvGridEquipment.EnumClothingLayer.Middle);
+
+			AddEquipment ("armor", _equipment, XMLData.Item.EnumEquipmentSlot.Chest, NGuiInvGridEquipment.EnumClothingLayer.Outer);
+			AddEquipment ("jacket", _equipment, XMLData.Item.EnumEquipmentSlot.Chest, NGuiInvGridEquipment.EnumClothingLayer.Middle);
+			AddEquipment ("shirt", _equipment, XMLData.Item.EnumEquipmentSlot.Chest, NGuiInvGridEquipment.EnumClothingLayer.Inner);
+
+			AddEquipment ("legarmor", _equipment, XMLData.Item.EnumEquipmentSlot.Legs, NGuiInvGridEquipment.EnumClothingLayer.Outer);
+			AddEquipment ("pants", _equipment, XMLData.Item.EnumEquipmentSlot.Legs, NGuiInvGridEquipment.EnumClothingLayer.Inner);
+			AddEquipment ("boots", _equipment, XMLData.Item.EnumEquipmentSlot.Feet, NGuiInvGridEquipment.EnumClothingLayer.Inner);
+
+			AddEquipment ("gloves", _equipment, XMLData.Item.EnumEquipmentSlot.Hands, NGuiInvGridEquipment.EnumClothingLayer.Inner);
+			AddEquipment ("backpack", _equipment, XMLData.Item.EnumEquipmentSlot.Back, NGuiInvGridEquipment.EnumClothingLayer.Outer);
+		}
+
+		private void AddEquipment (string _slotname, InvItem[] _items, XMLData.Item.EnumEquipmentSlot _slot, NGuiInvGridEquipment.EnumClothingLayer _layer) {
+			int index = (int)_slot + (int)_layer * (int)XMLData.Item.EnumEquipmentSlot.Count;
+			if (_items != null && _items [index] != null) {
+				if (_items [index].quality < 0) {
+					SdtdConsole.Instance.Output (string.Format ("    Slot {0:8}: {1:000}", _slotname, _items [index].itemName));
+				} else {
+					SdtdConsole.Instance.Output (string.Format ("    Slot {0:8}: {1:000} - quality: {2}", _slotname, _items [index].itemName, _items [index].quality));
+				}
+				DoParts (_items [index].parts, 1);
+			}
+		}
+
+		private void DoParts (InvItem[] _parts, int _indent) {
+			if (_parts != null && _parts.Length > 0) {
+				string indenter = new string (' ', _indent * 4);
+				for (int i = 0; i < _parts.Length; i++) {
+					if (_parts [i] != null) {
+						if (_parts [i].quality < 0) {
+							SdtdConsole.Instance.Output (string.Format ("{0}         - {1}", indenter, _parts [i].itemName));
+						} else {
+							SdtdConsole.Instance.Output (string.Format ("{0}         - {1} - quality: {2}", indenter, _parts [i].itemName, _parts [i].quality));
+						}
+						DoParts (_parts [i].parts, _indent + 1);
+					}
+				}
+			}
+		}
+
 	}
 }
Index: binary-improvements/AllocsCommands/Commands/TeleportPlayer.cs
===================================================================
--- binary-improvements/AllocsCommands/Commands/TeleportPlayer.cs	(revision 238)
+++ binary-improvements/AllocsCommands/Commands/TeleportPlayer.cs	(revision 250)
@@ -5,8 +5,6 @@
 namespace AllocsFixes.CustomCommands
 {
-	public class TeleportPlayer : ConsoleCmdAbstract
-	{
-		public override string GetDescription ()
-		{
+	public class TeleportPlayer : ConsoleCmdAbstract {
+		public override string GetDescription () {
 			return "teleport a player to a given location";
 		}
@@ -14,38 +12,79 @@
 		public override string GetHelp () {
 			return "Usage:\n" +
-				   "  1. teleportplayer <steam id / player name / entity id> <x> <y> <z>\n" +
-				   "  2. teleportplayer <steam id / player name / entity id> <target steam id / player name / entity id>\n" +
-				   "1. Teleports the player given by his SteamID, player name or entity id (as given by e.g. \"lpi\")\n" +
-				   "   to the specified location\n" +
-					"2. As 1, but destination given by another player which has to be online";
+				"  1. teleportplayer <steam id / player name / entity id> <x> <y> <z>\n" +
+				"  2. teleportplayer <steam id / player name / entity id> <target steam id / player name / entity id>\n" +
+				"  3. teleportplayer <inc x> <inc y> <inc z>\n" +
+				"1. Teleports the player given by his SteamID, player name or entity id (as given by e.g. \"lpi\")\n" +
+				"   to the specified location\n" +
+				"2. As 1, but destination given by another player which has to be online\n" +
+				"3. Teleport the local player to the position calculated by his current position and the given offsets";
 		}
 
-		public override string[] GetCommands ()
-		{
+		public override string[] GetCommands () {
 			return new string[] { "teleportplayer", "tele" };
 		}
 
-		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo)
-		{
+		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
 			try {
-				if (_params.Count != 4 && _params.Count != 2) {
-					SdtdConsole.Instance.Output ("Usage: teleportplayer <entityid|playername|steamid> <x> <y> <z>");
-					SdtdConsole.Instance.Output ("   or: teleportplayer <entityid|playername|steamid> <target entityid|playername|steamid>");
+				if (_params.Count < 2 || _params.Count > 4) {
+					SdtdConsole.Instance.Output ("Wrong number of arguments, expected 2 to 4, found " + _params.Count + ".");
+					return;
 				} else {
-					ClientInfo ci1 = ConsoleHelper.ParseParamIdOrName (_params [0]);
-					if (ci1 == null) {
-						SdtdConsole.Instance.Output ("Playername or entity/steamid id not found.");
-						return;
-					}
-					EntityPlayer ep1 = GameManager.Instance.World.Players.dict [ci1.entityId];
+					ClientInfo ci1 = null;
+					EntityPlayer ep1 = null;
+ 
+					if (_params.Count == 2 || _params.Count == 4) {
+						ci1 = ConsoleHelper.ParseParamIdOrName (_params [0]);
+						if (ci1 == null) {
+							SdtdConsole.Instance.Output ("Playername or entity/steamid id not found.");
+							return;
+						}
+						ep1 = GameManager.Instance.World.Players.dict [ci1.entityId];
 
-					if (_params.Count == 4) {
+						if (_params.Count == 4) {
+							int x = int.MinValue;
+							int y = int.MinValue;
+							int z = int.MinValue;
+
+							int.TryParse (_params [1], out x);
+							int.TryParse (_params [2], out y);
+							int.TryParse (_params [3], out 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;
+							}
+
+							ep1.position.x = x;
+							ep1.position.y = y;
+							ep1.position.z = z;
+						} else if (_params.Count == 2) {
+							ClientInfo ci2 = ConsoleHelper.ParseParamIdOrName (_params [1]);
+							if (ci2 == null) {
+								SdtdConsole.Instance.Output ("Target playername or entity/steamid id not found.");
+								return;
+							}
+							EntityPlayer ep2 = GameManager.Instance.World.Players.dict [ci2.entityId];
+
+							ep1.position = ep2.GetPosition ();
+							ep1.position.y += 1;
+							ep1.position.z += 1;
+						}
+					} else if (_params.Count == 3) {
+						if (_senderInfo.RemoteClientInfo == null) {
+							SdtdConsole.Instance.Output ("This command can only be executed on the in-game console.");
+							return;
+						}
+
+						ci1 = _senderInfo.RemoteClientInfo;
+						ep1 = GameManager.Instance.World.Players.dict [ci1.entityId];
+
 						int x = int.MinValue;
 						int y = int.MinValue;
 						int z = int.MinValue;
 
-						int.TryParse (_params [1], out x);
-						int.TryParse (_params [2], out y);
-						int.TryParse (_params [3], out z);
+						int.TryParse (_params [0], out x);
+						int.TryParse (_params [1], out y);
+						int.TryParse (_params [2], out z);
 
 						if (x == int.MinValue || y == int.MinValue || z == int.MinValue) {
@@ -54,18 +93,7 @@
 						}
 
-						ep1.position.x = x;
-						ep1.position.y = y;
-						ep1.position.z = z;
-					} else {
-						ClientInfo ci2 = ConsoleHelper.ParseParamIdOrName (_params [1]);
-						if (ci2 == null) {
-							SdtdConsole.Instance.Output ("Target playername or entity/steamid id not found.");
-							return;
-						}
-						EntityPlayer ep2 = GameManager.Instance.World.Players.dict [ci2.entityId];
-
-						ep1.position = ep2.GetPosition();
-						ep1.position.y += 1;
-						ep1.position.z += 1;
+						ep1.position.x = ep1.position.x + x;
+						ep1.position.y = ep1.position.y + y;
+						ep1.position.z = ep1.position.z + z;
 					}
 
Index: binary-improvements/AllocsCommands/ModInfo.xml
===================================================================
--- binary-improvements/AllocsCommands/ModInfo.xml	(revision 238)
+++ binary-improvements/AllocsCommands/ModInfo.xml	(revision 250)
@@ -5,5 +5,5 @@
 		<Description value="Additional commands for server operation" />
 		<Author value="Christian 'Alloc' Illy" />
-		<Version value="4" />
+		<Version value="5" />
 		<Website value="http://7dtd.illy.bz" />
 	</ModInfo>
