mcplayerstat.c 2.92 KB
#include <stdio.h>

#include "nbt.h"

void printInventory(TagList *inv) {
    for(int j = 0; j < inv->size; ++j) {
        TagCompound item = *(TagCompound*)inv->list[j].payload;
        uint8_t slot = 0;
        char* id;
        uint8_t count = 0;
        for(int k = 0; k < item.numTags; ++k) {
            Tag attr = item.list[k];
            if(!strncmp(attr.name,"Slot",attr.nameLength)) {
                slot = *((uint8_t*)attr.payload);
            } else if(!strncmp(attr.name,"id",attr.nameLength)) {
                id = (char*)attr.payload;
            } else if(!strncmp(attr.name,"Count",attr.nameLength)) {
                count = *((uint8_t*)attr.payload);
            }
        }
        printf("\t- [%u] %ux %s\n",slot,count,id);
    }
}

/*
 * int playerGameType
 * int XpLevel
 * list(compound) Inventory
 * list(compound) EnderItems
 * list(float) Pos
 */
int parseMCPlayerFile(const char* filename) {
    unsigned int pos = 0;
    void* data;

    ssize_t dblen = loadDB(filename, &data);
    if(dblen > 0) {
        Tag t;
        pos = parseTag((data + pos),&t);
        if(pos != dblen) {
            fprintf(stderr,"Didn't reach end of NBT file\n");
            return 4;
        }

        TagCompound root = *(TagCompound*) t.payload;
        for(int i = 0; i < root.numTags; ++i) {
            Tag node = root.list[i];
            if(node.type == TAG_INT) {
                if(!strncmp(node.name,"playerGameType",node.nameLength)) {
                    int playerGameType = *((uint32_t*)node.payload);
                    printf("playerGameType: %s\n",(playerGameType == 0 ? "Survival" : (playerGameType == 1 ? "Creative" : (playerGameType == 2 ? "Adventure" : (playerGameType == 3 ? "Spectator" : "UNKNOWN")))));
                } else if (!strncmp(node.name,"XpLevel",node.nameLength)) {
                    int xpLevel = *((uint32_t*)node.payload);
                    printf("XpLevel: %u\n",xpLevel);
                }
            } else if(node.type == TAG_LIST) {
                TagList* l = (TagList*)node.payload;
                if(!strncmp(node.name,"Inventory",node.nameLength)) {
                    printf("Inventory:\n");
                    printInventory(l);
                } else if (!strncmp(node.name,"EnderItems",node.nameLength)) {
                    printf("Ender Inventory:\n");
                    printInventory(l);
                } else if (!strncmp(node.name,"Pos",node.nameLength)) {
                    double x = (*(double*)l->list[0].payload);
                    double y = (*(double*)l->list[1].payload);
                    double z = (*(double*)l->list[2].payload);
                    printf("Pos: (x: %f,y: %f,z: %f)\n",x,y,z);
                }
            }
        }

        destroyTag(&t);
        free(data);
        return 0;
    }
    return -1;
}

int main(int argc, char** argv) {
    if(argc != 2) {
        fprintf(stderr,"No file specified\n");
        return 1;
    }

    return parseMCPlayerFile(argv[1]);
}