No, I'm not following Joes dat parser, I'm using 8.6 as stated and 0x4 seems to be the flag stored in file for IsContainer, code follows;
Code:
struct _TIBIAOBJECT {
long id;
BOOL IsBlocking;
BOOL IsContainer;
} * gTibiaObject;
void ReadTilesBin()
{
BYTE width, height, blendframes, xrepeat, yrepeat, zrepeat, animations, buf;
long spriteCount, i;
FILE * f;
unsigned char signature[4], nItemFlags;
short nDatItems, nDatCreatures, nDatMissiles, nDatEffects;
int nDatTotalItems, nItemCounter;
f = fopen("tiles.bin", "rb");
signature[0] = fgetc(f);
signature[1] = fgetc(f);
signature[2] = fgetc(f);
signature[3] = fgetc(f);
fread(&nDatItems, 1, 2, f);
fread(&nDatCreatures, 1, 2, f);
fread(&nDatEffects, 1, 2, f);
fread(&nDatMissiles, 1, 2, f);
nDatTotalItems = nDatItems + nDatCreatures + nDatEffects + nDatMissiles;
gTibiaObject = malloc(sizeof(struct _TIBIAOBJECT) * nDatTotalItems);
for(nItemCounter = 100; nItemCounter < (nDatTotalItems - 99); nItemCounter++)
{
gTibiaObject[nItemCounter].id = nItemCounter;
do {
nItemFlags = (unsigned char)fgetc(f);
if(nItemFlags == 0xC)
gTibiaObject[nItemCounter].IsBlocking = TRUE;
if(nItemFlags == 0x4)
gTibiaObject[nItemCounter].IsContainer = TRUE;
} while(nItemFlags != 0xFF);
width = fgetc(f);
height = fgetc(f);
if(width > 1 || height > 1) { fgetc(f); }
blendframes = fgetc(f);
xrepeat = fgetc(f);
yrepeat = fgetc(f);
zrepeat = fgetc(f);
animations = fgetc(f);
spriteCount = (width * height * blendframes * xrepeat * yrepeat * zrepeat * animations * 2);
for(i = 0; i < spriteCount-1; i++)
fread(&buf, 1, 1, f);
}
fclose(f);
return;
}