I've been trying to repack my obj.dat/idx with most examines and correct female offsets for weapons/shields, it seemed to work fine until I got around to spawning stackable items, ie runes, bolts etc. They all have the same name, ie runes all have "cosmic rune" and are invisible and bolts are all one colour with the same name, it's something with the read values as they are getting repacked correctly from debugging, just wondering if someone else can take a look at my repacking method and see where I'm going wrong.

All non stackables are perfect though.

Spoiler for Read values:
Code:
	public void readValues(Stream stream) {
		do {
			int i = stream.readUnsignedByte();
			if(i == 0)
				return;
			if(i == 1) {
				modelId = stream.readUnsignedWord();
			} else
			if(i == 2)
				name = stream.readString();
			else
			if(i == 3) {
				description = stream.readString();
			}
			else
			if(i == 4)
				modelZoom = stream.readUnsignedWord();
			else
			if(i == 5)
				modelRotation1 = stream.readUnsignedWord();
			else
			if(i == 6)
				modelRotation2 = stream.readUnsignedWord();
			else
			if(i == 7)
			{
				modelOffset1 = stream.readUnsignedWord();
				if(modelOffset1 > 32767)
					modelOffset1 -= 0x10000;
			} else
			if(i == 8)
			{
				modelOffset2 = stream.readUnsignedWord();
				if(modelOffset2 > 32767)
					modelOffset2 -= 0x10000;
			} else
			if(i == 10)
				stream.readUnsignedWord();
			else
			if(i == 11)
				stackable = true;
			else
			if(i == 12)
				value = stream.readUnsignedWord();
			else
			if(i == 16)
				membersObject = true;
			else if(i == 23) {
				maleEquip1 = stream.readUnsignedWord();
				aByte205 = stream.readSignedByte();
			} else if(i == 24)
				maleEquip2 = stream.readUnsignedWord();
			else if(i == 25) {
				femaleEquip1 = stream.readUnsignedWord();
				aByte154 = stream.readSignedByte();
			} else if(i == 26)
				femaleEquip2 = stream.readUnsignedWord();
			else if(i >= 30 && i < 35) {
				if(groundActions == null)
					groundActions = new String[5];
				groundActions[i - 30] = stream.readString();
				if(groundActions[i - 30].equalsIgnoreCase("hidden"))
					groundActions[i - 30] = null;
			} else if(i >= 35 && i < 40) {
				if(actions == null)
					actions = new String[5];
				actions[i - 35] = stream.readString();
				if(actions[i - 35].equalsIgnoreCase("null"))
					actions[i - 35] = null;
			} else if(i == 40) {
				int j = stream.readUnsignedByte();
				originalModelColors = new int[j];
				modifiedModelColors = new int[j];
				for(int k = 0; k < j; k++) {
					originalModelColors[k] = stream.readUnsignedWord();
					modifiedModelColors[k] = stream.readUnsignedWord();
				}
			} else if(i == 78)
				maleSymbol = stream.readUnsignedWord();
			else if(i == 79)
				femaleSymbol = stream.readUnsignedWord();
			else if(i == 90)
				maleChatHead = stream.readUnsignedWord();
			else if(i == 91)
				femaleChatHead = stream.readUnsignedWord();
			else if(i == 92)
				femaleChatHeadHat = stream.readUnsignedWord();
			else if(i == 93)
				maleChatHeadHat = stream.readUnsignedWord();
			else if(i == 95)
				rotationZ = stream.readUnsignedWord();
			else if(i == 97)
				noteId = stream.readUnsignedWord();
			else if(i == 98)
				notedTemplateId = stream.readUnsignedWord();
			else if(i >= 100 && i < 110) {
				if(stackIDs == null)
				{
					stackIDs = new int[10];
					stackAmounts = new int[10];
				}
				stackIDs[i - 100] = stream.readUnsignedWord();
				stackAmounts[i - 100] = stream.readUnsignedWord();
			} else if(i == 110)
				itemWidth = stream.readUnsignedWord();
			else if(i == 111)
				itemHeight = stream.readUnsignedWord();
			else if(i == 112)
				itemDepth = stream.readUnsignedWord();
			else if(i == 113)
				itemBrightness = stream.readSignedByte();
			else if(i == 114)
				itemContrast = stream.readSignedByte() * 5;
			else if(i == 115)
				team = stream.readUnsignedByte();
			else
			if(i == 121)
				lendId = stream.readUnsignedWord();
			else
			if(i == 122)
				lendTemplateId = stream.readUnsignedWord();
			else if (i == 125) {
				maleEquipOffsetX = stream.readSignedByte();
				maleEquipOffsetY = stream.readSignedByte();
				maleEquipOffsetZ = stream.readSignedByte();
			} else if (i == 126) {
				femaleEquipOffsetX = stream.readSignedByte();
				femaleEquipOffsetY = stream.readSignedByte();
				femaleEquipOffsetZ = stream.readSignedByte();
			}
		} while(true);
	}


Spoiler for Repacking Items:
Code:
	public static void rewriteItems() throws IOException {
		DataOutputStream dat = new DataOutputStream(new FileOutputStream("./obj.dat"));
		DataOutputStream idx = new DataOutputStream(new FileOutputStream("./obj.idx"));
		idx.writeShort(totalItems);
		dat.writeShort(totalItems);
		
		for(int i = 0; i < totalItems; i ++) {
			try {
			int offset1 = dat.size();
			ItemDef def = ItemDef.forID(i);

			if(def.modelId > 0) {
				dat.writeByte(1);
				dat.writeShort(def.modelId);
			}
			if(def.name != null) {
				dat.writeByte(2);
				writeString(dat, def.name);
			}
			if(EXAMINES[i] != null) {
				dat.writeByte(3);
				writeString(dat, EXAMINES[i]);
			}
			if(def.modelZoom != 2000) {
				dat.writeByte(4);
				dat.writeShort(def.modelZoom);
			}
			if(def.modelRotation1 != 0) {
				dat.writeByte(5);
				dat.writeShort(def.modelRotation1);
			}
			if(def.modelRotation2 != 0) {
				dat.writeByte(6);
				dat.writeShort(def.modelRotation2);
			}
			if(def.modelOffset1 != 0) {
				dat.writeByte(7);
				dat.writeShort(def.modelOffset1);
			}
			if(def.modelOffset2 != 0) {
				dat.writeByte(8);
				dat.writeShort(def.modelOffset2);
			}
			if(def.stackable) {
				dat.writeByte(11);
			}
			if(def.value > 1) {
				dat.writeByte(12);
				dat.writeShort(def.value);
			}
			if(def.membersObject) {
				dat.writeByte(13);
			}
			if(def.maleEquip1 > -1) {
				dat.writeByte(23);
				dat.writeShort(def.maleEquip1);
				dat.writeByte(def.aByte205);
			}
			if(def.maleEquip2 > -1) {
				dat.writeByte(24);
				dat.writeShort(def.maleEquip2);
			}
			if(def.femaleEquip1 > -1) {
				dat.writeByte(25);
				dat.writeShort(def.femaleEquip1);
				dat.writeByte(def.aByte154);
			}
			if(def.femaleEquip2 > -1) {
				dat.writeByte(26);
				dat.writeShort(def.femaleEquip2);
			}
			if(def.groundActions != null) {
				for(int i2 = 0; i2 < def.groundActions.length; i2 ++) {
					dat.writeByte(30 + i2);
					if(def.groundActions[i2] == null) {
						writeString(dat, "hidden");
					} else {
						writeString(dat, def.groundActions[i2]);
					}
				}
			}
			if(def.actions != null) {
				for(int i2 = 0; i2 < def.actions.length; i2 ++) {
					dat.writeByte(35 + i2);
					if(def.actions[i2] == null) {
						writeString(dat, "null");
					} else {
						writeString(dat, def.actions[i2]);
					}
				}
			}
			if(def.originalModelColors != null) {
				dat.writeByte(40);
				dat.writeByte(def.originalModelColors.length);
				for(int i2 = 0; i2 < def.originalModelColors.length; i2 ++) {
					dat.writeShort(def.originalModelColors[i2]);
					dat.writeShort(def.modifiedModelColors[i2]);
				}
			}
			if(def.maleSymbol > -1) {
				dat.writeByte(78);
				dat.writeShort(def.maleSymbol);
			}
			if(def.femaleSymbol > -1) {
				dat.writeByte(79);
				dat.writeShort(def.femaleSymbol);
			}
			if(def.maleChatHead > -1) {
				dat.writeByte(90);
				dat.writeShort(def.maleChatHead);
			}
			if(def.femaleChatHead > -1) {
				dat.writeByte(91);
				dat.writeShort(def.femaleChatHead);
			}
			if(def.femaleChatHeadHat > -1) {
				dat.writeByte(92);
				dat.writeShort(def.femaleChatHeadHat);
			}
			if(def.maleChatHeadHat > -1) {
				dat.writeByte(93);
				dat.writeShort(def.maleChatHeadHat);
			}
			if(def.rotationZ != 0) {
				dat.writeByte(95);
				dat.writeShort(def.rotationZ);
			}
			if(def.noteId > 0) {
				dat.writeByte(97);
				dat.writeShort(def.noteId);
			}
			if(def.notedTemplateId > 0) {
				dat.writeByte(98);
				dat.writeShort(def.notedTemplateId);
			}
			if(def.stackIDs != null) {
				for(int i2 = 0; i2 < def.stackIDs.length; i2 ++) {
					dat.writeByte(100 + i2);
					dat.writeShort(def.stackIDs[i2]);
					dat.writeShort(def.stackAmounts[i2]);
				}
			}	
			if(def.itemWidth != 128) {
				dat.writeByte(110);
				dat.writeShort(def.itemWidth);
			}
			if(def.itemHeight != 128) {
				dat.writeByte(111);
				dat.writeShort(def.itemHeight);
			}

			if(def.itemDepth != 128) {
				dat.writeByte(112);
				dat.writeShort(def.itemDepth);
			}
			if(def.itemBrightness != 0) {
				dat.writeByte(113);
				dat.writeShort(def.itemBrightness);
			}
			if(def.itemContrast != 0) {
				dat.writeByte(114);
				dat.writeShort(def.itemContrast);
			}
			if(def.team != 0) {
				dat.writeByte(115);
				dat.writeShort(def.team);
			}
			if(def.lendId > 0) {
				dat.writeByte(121);
				dat.writeShort(def.lendId);
			}
			if(def.lendTemplateId > 0) {
				dat.writeByte(122);
				dat.writeShort(def.lendTemplateId);
			}
			
			if(isWeapon(i) || isShield(i)) {
			/*	dat.writeByte(125);
				dat.writeByte(def.maleEquipOffsetX);
				dat.writeByte(def.maleEquipOffsetY);
				dat.writeByte(def.maleEquipOffsetZ);*/
				dat.writeByte(126);
				dat.writeByte(itemInfo[i].getFemaleX());
				dat.writeByte(itemInfo[i].getFemaleY());
				dat.writeByte(itemInfo[i].getFemaleZ());
			}
			dat.writeByte(0);
			int offset2 = dat.size();
			int writeOffset = offset2 - offset1;
			idx.writeShort(writeOffset);	
			} catch (Exception e) {
				System.out.println("Error repacking " + i + " Name: " + ItemDef.forID(i).name + ".");
				e.printStackTrace();
			}
		}
		dat.close();
		idx.close();
	}


Thanks.