MCMetadata* CD_BufferRemoveMetadata (CDBuffer* self) { MCMetadata* metadata = MC_CreateMetadata(); MCData* current = NULL; MCByte type = 0; // Format strings of the different metadata types static char* formats[] = { "b", "s", "i", "f", "S" }; while (!CD_BufferEmpty(self)) { type = CD_BufferRemoveByte(self); if (type == 127) { break; } current = MC_CreateData(); current->type = type >> 5; if (current->type == MCTypeShortByteShort) { CD_BufferRemoveFormat(self, "sbs", ¤t->data.sbs.first, ¤t->data.sbs.second, ¤t->data.sbs.third ); } else { CD_BufferRemoveFormat(self, formats[current->type], ¤t->data); } MC_AppendData(metadata, current); } return metadata; }
CDPointer CD_GetPacketDataFromBuffer (CDPacket* self, CDBuffer* input) { assert(self); assert(input); switch (self->type) { case CDKeepAlive: { return (CDPointer) CD_malloc(sizeof(CDPacketKeepAlive)); } case CDLogin: { CDPacketLogin* packet = (CDPacketLogin*) CD_malloc(sizeof(CDPacketLogin)); CD_BufferRemoveFormat(input, "iSSlb", &packet->request.version, &packet->request.username, &packet->request.password, &packet->request.mapSeed, &packet->request.dimension ); return (CDPointer) packet; } case CDHandshake: { CDPacketHandshake* packet = (CDPacketHandshake*) CD_malloc(sizeof(CDPacketHandshake)); packet->request.username = CD_BufferRemoveString(input); return (CDPointer) packet; } case CDChat: { CDPacketChat* packet = (CDPacketChat*) CD_malloc(sizeof(CDPacketChat)); packet->request.message = CD_BufferRemoveString(input); return (CDPointer) packet; } case CDUseEntity: { CDPacketUseEntity* packet = (CDPacketUseEntity*) CD_malloc(sizeof(CDPacketUseEntity)); CD_BufferRemoveFormat(input, "iib", &packet->request.user, &packet->request.target, &packet->request.leftClick ); return (CDPointer) packet; } case CDRespawn: { return (CDPointer) CD_malloc(sizeof(CDPacketRespawn)); } case CDOnGround: { CDPacketOnGround* packet = (CDPacketOnGround*) CD_malloc(sizeof(CDPacketOnGround)); packet->request.onGround = CD_BufferRemoveBoolean(input); return (CDPointer) packet; } case CDPlayerPosition: { CDPacketPlayerPosition* packet = (CDPacketPlayerPosition*) CD_malloc(sizeof(CDPacketPlayerPosition)); CD_BufferRemoveFormat(input, "ddddb", &packet->request.position.x, &packet->request.position.y, &packet->request.stance, &packet->request.position.z, &packet->request.is.onGround ); return (CDPointer) packet; } case CDPlayerLook: { CDPacketPlayerLook* packet = (CDPacketPlayerLook*) CD_malloc(sizeof(CDPacketPlayerLook)); CD_BufferRemoveFormat(input, "ffb", &packet->request.yaw, &packet->request.pitch, &packet->request.is.onGround ); return (CDPointer) packet; } case CDPlayerMoveLook: { CDPacketPlayerMoveLook* packet = (CDPacketPlayerMoveLook*) CD_malloc(sizeof(CDPacketPlayerMoveLook)); CD_BufferRemoveFormat(input, "ddddffb", &packet->request.position.x, &packet->request.stance, &packet->request.position.y, &packet->request.position.z, &packet->request.yaw, &packet->request.pitch, &packet->request.is.onGround ); return (CDPointer) packet; } case CDPlayerDigging: { CDPacketPlayerDigging* packet = (CDPacketPlayerDigging*) CD_malloc(sizeof(CDPacketPlayerDigging)); CD_BufferRemoveFormat(input, "bibib", &packet->request.status, &packet->request.position.x, &packet->request.position.y, &packet->request.position.z, &packet->request.face ); return (CDPointer) packet; } case CDPlayerBlockPlacement: { CDPacketPlayerBlockPlacement* packet = (CDPacketPlayerBlockPlacement*) CD_malloc(sizeof(CDPacketPlayerBlockPlacement)); CD_BufferRemoveFormat(input, "ibibs", &packet->request.position.x, &packet->request.position.y, &packet->request.position.z, &packet->request.direction, &packet->request.item.id ); if (packet->request.item.id != -1) { CD_BufferRemoveFormat(input, "bs", &packet->request.item.count, &packet->request.item.uses ); } return (CDPointer) packet; } case CDHoldChange: { CDPacketHoldChange* packet = (CDPacketHoldChange*) CD_malloc(sizeof(CDPacketHoldChange)); packet->request.item.id = CD_BufferRemoveShort(input); return (CDPointer) packet; } case CDAnimation: { CDPacketAnimation* packet = (CDPacketAnimation*) CD_malloc(sizeof(CDPacketAnimation)); CD_BufferRemoveFormat(input, "ib", &packet->request.entity.id, &packet->request.type ); return (CDPointer) packet; } case CDEntityAction: { CDPacketEntityAction* packet = (CDPacketEntityAction*) CD_malloc(sizeof(CDPacketEntityAction)); CD_BufferRemoveFormat(input, "ib", &packet->request.entity.id, &packet->request.action ); return (CDPointer) packet; } case CDEntityMetadata: { CDPacketEntityMetadata* packet = (CDPacketEntityMetadata*) CD_malloc(sizeof(CDPacketEntityMetadata)); CD_BufferRemoveFormat(input, "iM", &packet->request.entity.id, &packet->request.metadata ); return (CDPointer) packet; } case CDCloseWindow: { CDPacketCloseWindow* packet = (CDPacketCloseWindow*) CD_malloc(sizeof(CDPacketCloseWindow)); packet->request.id = CD_BufferRemoveByte(input); return (CDPointer) packet; } case CDWindowClick: { CDPacketWindowClick* packet = (CDPacketWindowClick*) CD_malloc(sizeof(CDPacketWindowClick)); CD_BufferRemoveFormat(input, "bsBss", &packet->request.id, &packet->request.slot, &packet->request.rightClick, &packet->request.action, &packet->request.item.id ); if (packet->request.item.id != -1) { CD_BufferRemoveFormat(input, "bs", &packet->request.item.count, &packet->request.item.uses ); } return (CDPointer) packet; } case CDTransaction: { CDPacketTransaction* packet = (CDPacketTransaction*) CD_malloc(sizeof(CDPacketTransaction)); CD_BufferRemoveFormat(input, "bsB", &packet->request.id, &packet->request.action, &packet->request.accepted ); return (CDPointer) packet; } case CDUpdateSign: { CDPacketUpdateSign* packet = (CDPacketUpdateSign*) CD_malloc(sizeof(CDPacketUpdateSign)); CD_BufferRemoveFormat(input, "iisiSSSS", &packet->request.position.x, &packet->request.position.y, &packet->request.position.z, &packet->request.first, &packet->request.second, &packet->request.third, &packet->request.fourth ); return (CDPointer) packet; } case CDDisconnect: { CDPacketDisconnect* packet = (CDPacketDisconnect*) CD_malloc(sizeof(CDPacketDisconnect)); packet->request.reason = CD_BufferRemoveString(input); return (CDPointer) packet; } default: { return (CDPointer) NULL; } } }