ametsa

ametsa
 avatar
unknown
c_cpp
2 years ago
9.7 kB
7
Indexable
#pragma once
#include "utils.h"
#include "player.h"
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include "gt.hpp"
using namespace std;
#define HashCoord(x, y) (((y) * 100) + (x))

struct TileHeader {
	uint16_t foreground;
	uint16_t background;
	uint16_t data;
	uint8_t flags_1;
	uint8_t flags_2;
};
struct DroppedItem {
	uint16_t itemID;
	vector2_t pos;
	uint8_t count;
	uint8_t flags;
	uint32_t uid;
};

struct Tile {
	TileHeader header;
	vector2i_t pos;
};
class ItemDataContainer {
public:
	ItemDataContainer() = default;
	static std::vector<std::string> arr, itd, itr, itt, itx, ity, ita, ith;
	bool RequiresTileExtra(int id)
	{
		int actionType = stoi(ita.at(id));
		return
			actionType == 2 ||
			actionType == 3 ||
			actionType == 10 || 
			actionType == 13 || 
			actionType == 19 || 
			actionType == 26 || 
			actionType == 33 || 
			actionType == 34 || 
			actionType == 36 || 
			actionType == 38 || 
			actionType == 40 || 
			actionType == 43 || 
			actionType == 46 ||
			actionType == 47 ||
			actionType == 49 ||
			actionType == 50 ||
			actionType == 51 || 
			actionType == 52 ||
			actionType == 53 ||
			actionType == 54 || 
			actionType == 55 || 
			actionType == 56 || 
			id == 2246 ||
			actionType == 57 || 
			actionType == 59 || 
			actionType == 61 ||
			actionType == 62 ||
			actionType == 63 || 
			id == 3760 ||
			actionType == 66 || 
			actionType == 67 || 
			actionType == 73 || 
			actionType == 74 ||
			actionType == 76 || 
			actionType == 78 || 
			actionType == 80 || 
			actionType == 81 ||
			actionType == 83 || 
			actionType == 84 ||
			actionType == 85 || 
			actionType == 86 || 
			actionType == 87 || 
			actionType == 88 || 
			actionType == 89 ||
			actionType == 91 || 
			actionType == 93 || 
			actionType == 97 || 
			actionType == 100 ||
			actionType == 101 ||
			actionType == 111 ||
			actionType == 113 ||
			actionType == 115 ||
			actionType == 116 ||
			actionType == 127 ||
			actionType == -126 ||
			actionType == 130 ||
			(id % 2 == 0 && id >= 5818 && id <= 5932) || false;
	}

};


class world {
public:
	std::string name{};
	std::vector<player> players{};
	player local{};
	bool connected{};

	int width = 0, height = 0, tileCount = 0, lastDroppedUid = 0;
	vector2i_t main_door_loc;
	std::unordered_map<uint32_t, Tile> tiles;
	std::unordered_map<uint32_t, TileHeader> wblocks;
	std::unordered_map<uint32_t, DroppedItem> objects;
	void LoadFromMem(gameupdatepacket_t* packet) {
		//try
		//{
			auto extended = utils::get_extended(packet);
			tiles.clear();
			tileCount = 0;
			height = 0;
			width = 0;
			main_door_loc = vector2i_t(-1, -1);
			int len = 0;
			name.resize(*reinterpret_cast<short*>(extended + 10));
			memcpy(reinterpret_cast<PVOID>(const_cast<char*>(name.data())), extended + 12, name.size());
			if (!name.empty()) {
				std::transform(name.begin(), name.end(), name.begin(), ::tolower);
				std::vector<TileHeader> rawTiles;
				extended += 12 + name.size();
				memcpy(&width, extended, 4);
				memcpy(&height, extended + 4, 4);
				memcpy(&tileCount, extended + 8, 4);
				extended += 17;
				for (int i = 0; i < tileCount; i++) {
					TileHeader header;
					memcpy(&header.foreground, extended, 2);
					memcpy(&header.background, extended + 2, 2);
					memcpy(&header.data, extended + 4, 2);
					memcpy(&header.flags_1, extended + 6, 1);
					memcpy(&header.flags_2, extended + 7, 1);
					extended += 8;
					if (header.data)
						extended += 2;
					if (header.foreground == 3760) {
						extended += 22; // bypass
						rawTiles.push_back(header);
						continue;
					}
					if (itemDataContainer.RequiresTileExtra(header.foreground)) {
						unsigned short len = 0;
						BYTE itemType = *extended;
						extended++;
						switch (itemType)
						{
						case 0:
						{

						}
						break;
						case 1:
						{
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += len + 1;
						}
						break;
						case 0x4a: // Safe vault nothin extended
							break;
						case 2:
						{
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += len + 4;
						}
						break;
						case 3:
						{
							extended++;
							byte adminCount = *(extended + 4);
							extended += (16 + (adminCount * 4));
						}
						break;
						case 4:
						{
							extended += 5;
						}
						break;
						case 0x8:
						{
							extended++;
						}
						break;
						case 0x9:
						{
							extended += 4;
						}
						break;
						case 0xa:
						{
							extended += 5;
						}
						break;
						case 0xb:
						{
							extended += 4;
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += len;
						}
						break;
						case 0xe:
						{
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += len;
							extended += 23;
						}
						break;
						case 0x0f:
						{
							extended++;
						}
						break;
						case 0x10:
						{
							extended++;
						}
						break;
						case 0x12:
						{
							extended += 5;
						}
						break;
						case 0x13:
						{
							extended += 18;
						}
						break;
						case 0x14:
						{
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += len;
						}
						break;
						case 0x15:
						{
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += len;
							extended += 5;
						}
						break;
						case 0x17:
						{
							extended += 4;
						}
						break;
						case 0x18:
						{
							extended += 8;
						}
						break;
						case 0x19:
						{
							extended++;
							int c = *(uint32_t*)(extended); extended += 4;
							extended += 4 * c;
						}
						break;
						case 0x1B:
						{
							extended += 4;
						}
						break;
						case 0x1C:
						{
							extended += 6;
						}
						break;
						case 0x20:
						{
							extended += 4;
						}
						break;
						case 0x21:
						{

							if (header.foreground == 3394)
							{
								len = (*(uint16_t*)(extended)); extended += 2;
								extended += len;
							}
						}
						break;
						case 0x23:
						{
							extended += 4;
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += len;
						}
						break;
						case 0x25:
						{
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += 32 + len;
						}
						break;
						case 0x27:
						{
							extended += 4;
						}
						break;
						case 0x28:
						{
							extended += 4;
						}
						break;
						case 0x2a: // Data Bedrock 
							break;
						case 0x2b:
						{
							extended += 16;
						}
						break;
						case 0x2c:
						{
							extended++;
							extended += 4;
							byte adminCount = *extended;
							extended += 4;
							extended += (adminCount * 4);

						}
						break;
						case 0x2f:
						{
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += 5 + len;
						}
						break;
						case 0x30:
						{
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += 26 + len;
						}
						break;
						case 0x31:
						{
							extended += 9;
						}
						break;
						case 0x32:
						{
							extended += 4;
						}
						break;
						case 0x34:
						{
						}
						break;
						case 0x36:
						{
							short itemsSize = (*(uint16_t*)(extended)); extended += 2;
							extended += itemsSize;
						}
						break;
						case 0x38:
						{
							len = (*(uint16_t*)(extended)); extended += 2;
							extended += 4 + len;
						}
						break;
						case 0x39:
						{
							extended += 4;
						}
						break;
						case 0x3a: // ad
							break;
						case 0x3e:
						{
							extended += 14;
						}
						break;
						case 0x3f:
						{
							uint32_t r = *(uint32_t*)(extended); extended += 4;
							extended += (r * 15);
							extended += 8;
						}
						break;
						case 0x41:
						{
							extended += 17;
						}
						break;
						case 0x42:
						{
							extended++;
						}
						break;
						case 0x49:
						{
							extended += 4;
						}
						break;
						default:
							len = 0;
							break;
						}

					}
					rawTiles.push_back(header);
				}
				for (int y = 0; y < height; y++) {
					for (int x = 0; x < width; x++) {
						int chash = HashCoord(x, y);
						Tile tile;
						tile.header = rawTiles[chash];
						tile.pos.m_x = x;
						tile.pos.m_y = y;
						tiles[chash] = tile;
						if (tile.header.foreground == 6) {
							main_door_loc = tile.pos;
						}
					}
				}
				int droppedCount;
				memcpy(&droppedCount, extended, 4);
				memcpy(&lastDroppedUid, extended + 4, 4);
				//gt::send_log("Count: " + to_string(droppedCount) + " last uid: " + to_string(lastDroppedUid));

				for (int i = 0; i < droppedCount; i++) {
					DroppedItem item;
					memcpy(&item.itemID, extended, 2);
					memcpy(&item.pos.m_x, extended + 2, 4);
					memcpy(&item.pos.m_y, extended + 6, 4);
					memcpy(&item.count, extended + 10, 1);
					memcpy(&item.flags, extended + 11, 1);
					memcpy(&item.uid, extended + 12, 4);
					extended += 16;
					objects[item.uid] = item;
				}
				connected = true;
			}
		//}
		/*catch (const std::exception& e)
		{
			cout << typeid(e).name() << endl;
			cout << e.what() << endl;
			gt::send_log("`4Unable To serialize this world");
			
		}*/
	}

	static ItemDataContainer itemDataContainer;
};
Editor is loading...