Commit cf8d93723c3794db71c89936c69334b4ce61d349

Authored by Imanol-Mikel Barba Sabariego
1 parent 4f07b876

Use new version of libnbt

Showing 1 changed file with 46 additions and 67 deletions
mcplayerstat.c
1 1 #include <stdio.h>
2   -#include <unistd.h>
3   -#include <sys/mman.h>
4   -#include <sys/stat.h>
5   -#include <fcntl.h>
6   -#include <stdint.h>
7   -#include <byteswap.h>
8 2  
9 3 #include "nbt.h"
10 4  
11   -double convertDouble(uint64_t data) {
12   - double d = 0;
13   - uint64_t swapped = __bswap_64(data);
14   - memcpy(&d,&swapped,sizeof(uint64_t));
15   - return d;
16   -}
17   -
18 5 void printInventory(TagList *inv) {
19 6 for(int j = 0; j < inv->size; ++j) {
20 7 TagCompound item = *(TagCompound*)inv->list[j].payload;
... ... @@ -36,63 +23,60 @@ void printInventory(TagList *inv) {
36 23 }
37 24  
38 25 int parseMCPlayerFile(const char* filename) {
39   - struct stat sb;
40 26 unsigned int pos = 0;
  27 + void* data;
41 28  
42   - int fd = open(filename,O_RDONLY);
43   - if(fd == -1) {
44   - perror("Can't open file");
45   - return 3;
46   - }
47   - fstat(fd, &sb);
48   -
49   - void* mappedFile = mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
  29 + ssize_t dblen = loadDB(filename, &data);
  30 + if(dblen > 0) {
  31 + // int playerGameType
  32 + // int XpLevel
  33 + // list(compound) Inventory
  34 + // list(compound) EnderItems
  35 + // list(float) Pos
50 36  
51   - // int playerGameType
52   - // int XpLevel
53   - // list(compound) Inventory
54   - // list(compound) EnderItems
55   - // list(float) Pos
56   -
57   - Tag t;
58   - pos = parseTag((mappedFile + pos),&t);
59   - if(pos != sb.st_size) {
60   - fprintf(stderr,"Didn't reach end of NBT file\n");
61   - return 4;
62   - }
  37 + Tag t;
  38 + pos = parseTag((data + pos),&t);
  39 + if(pos != dblen) {
  40 + fprintf(stderr,"Didn't reach end of NBT file\n");
  41 + return 4;
  42 + }
63 43  
64   - TagCompound root = *(TagCompound*) t.payload;
65   - for(int i = 0; i < root.numTags; ++i) {
66   - Tag node = root.list[i];
67   - if(node.type == TAG_INT) {
68   - if(!strncmp(node.name,"playerGameType",node.nameLength)) {
69   - int playerGameType = __bswap_32(*((uint32_t*)node.payload));
70   - printf("playerGameType: %s\n",(playerGameType == 0 ? "Survival" : (playerGameType == 1 ? "Creative" : (playerGameType == 2 ? "Adventure" : (playerGameType == 3 ? "Spectator" : "UNKNOWN")))));
71   - } else if (!strncmp(node.name,"XpLevel",node.nameLength)) {
72   - int xpLevel = __bswap_32(*((uint32_t*)node.payload));
73   - printf("XpLevel: %u\n",xpLevel);
74   - }
75   - } else if(node.type == TAG_LIST) {
76   - TagList* l = (TagList*)node.payload;
77   - if(!strncmp(node.name,"Inventory",node.nameLength)) {
78   - printf("Inventory:\n");
79   - printInventory(l);
80   - } else if (!strncmp(node.name,"EnderItems",node.nameLength)) {
81   - printf("Ender Inventory:\n");
82   - printInventory(l);
83   - } else if (!strncmp(node.name,"Pos",node.nameLength)) {
84   - double x = convertDouble((*(uint64_t*)l->list[0].payload));
85   - double y = convertDouble((*(uint64_t*)l->list[1].payload));
86   - double z = convertDouble((*(uint64_t*)l->list[2].payload));
87   - printf("Pos: (x: %f,y: %f,z: %f)\n",x,y,z);
  44 + TagCompound root = *(TagCompound*) t.payload;
  45 + for(int i = 0; i < root.numTags; ++i) {
  46 + Tag node = root.list[i];
  47 + if(node.type == TAG_INT) {
  48 + if(!strncmp(node.name,"playerGameType",node.nameLength)) {
  49 + int playerGameType = *((uint32_t*)node.payload);
  50 + printf("playerGameType: %s\n",(playerGameType == 0 ? "Survival" : (playerGameType == 1 ? "Creative" : (playerGameType == 2 ? "Adventure" : (playerGameType == 3 ? "Spectator" : "UNKNOWN")))));
  51 + } else if (!strncmp(node.name,"XpLevel",node.nameLength)) {
  52 + int xpLevel = *((uint32_t*)node.payload);
  53 + printf("XpLevel: %u\n",xpLevel);
  54 + }
  55 + } else if(node.type == TAG_LIST) {
  56 + TagList* l = (TagList*)node.payload;
  57 + if(!strncmp(node.name,"Inventory",node.nameLength)) {
  58 + printf("Inventory:\n");
  59 + printInventory(l);
  60 + } else if (!strncmp(node.name,"EnderItems",node.nameLength)) {
  61 + printf("Ender Inventory:\n");
  62 + printInventory(l);
  63 + } else if (!strncmp(node.name,"Pos",node.nameLength)) {
  64 + double x = (*(double*)l->list[0].payload);
  65 + double y = (*(double*)l->list[1].payload);
  66 + double z = (*(double*)l->list[2].payload);
  67 + printf("Pos: (x: %f,y: %f,z: %f)\n",x,y,z);
  68 + }
88 69 }
89 70 }
  71 +
  72 + destroyTag(&t);
  73 + free(data);
  74 + return 0;
90 75 }
91 76  
92   - destroyTag(&t);
93   - munmap(mappedFile,sb.st_size);
94   - close(fd);
95   - return 0;
  77 +
  78 +
  79 +
96 80 }
97 81  
98 82 int main(int argc, char** argv) {
... ... @@ -101,10 +85,5 @@ int main(int argc, char** argv) {
101 85 return 1;
102 86 }
103 87  
104   - if(access(argv[1],R_OK) == -1) {
105   - perror("Can't access file");
106   - return 2;
107   - }
108   -
109 88 return parseMCPlayerFile(argv[1]);
110 89 }
111 90 \ No newline at end of file
... ...