#ifndef H_GLOBALS #define H_GLOBALS #include #include #ifdef ESP_PLATFORM #define WIFI_SSID "your-ssid" #define WIFI_PASS "your-password" void task_yield (); #else #define task_yield(); #endif #define true 1 #define false 0 // TCP port, Minecraft's default is 25565 #define PORT 25565 // How many players to keep in memory, NOT the amount of concurrent players // Even when offline, players who have logged on before take up a slot #define MAX_PLAYERS 16 // How many mobs to allocate memory for #define MAX_MOBS (MAX_PLAYERS) // Manhattan distance at which mobs despawn #define MOB_DESPAWN_DISTANCE 256 // Server game mode: 0 - survival; 1 - creative; 2 - adventure; 3 - spectator #define GAMEMODE 0 // Max render distance, determines how many chunks to send #define VIEW_DISTANCE 2 // Time between server ticks in microseconds (default = 0.05s) #define TIME_BETWEEN_TICKS 50000 // Calculated from TIME_BETWEEN_TICKS #define TICKS_PER_SECOND ((float)1000000 / TIME_BETWEEN_TICKS) // Size of each bilinearly interpolated area ("minichunk") // For best performance, CHUNK_SIZE should be a power of 2 #define CHUNK_SIZE 8 // Terrain low point - should start a bit below sea level for rivers/lakes #define TERRAIN_BASE_HEIGHT 60 // Cave generation Y level #define CAVE_BASE_DEPTH 24 // Size of every major biome in multiples of CHUNK_SIZE // For best performance, should also be a power of 2 #define BIOME_SIZE (CHUNK_SIZE * 8) // Calculated from BIOME_SIZE #define BIOME_RADIUS (BIOME_SIZE / 2) // How many visited chunk coordinates to "remember" // The server will not re-send chunks that the player has recently been in // Must be at least 1, otherwise chunks will be sent on each position update #define VISITED_HISTORY 4 // How many player-made block changes to allow // Determines the fixed amount of memory allocated to blocks #define MAX_BLOCK_CHANGES 20000 // How many "deferred" (happen at a later time than triggered) block updates to store. // Determines the fixed amount of memory allocated to that list #define MAX_DEFERRED_BLOCK_UPDATES 64 // If defined, writes and reads world data to/from disk (or flash). // This is a synchronous operation, and can cause performance issues if // frequent random disk access is slow. Data is still stored in and // accessed from memory - reading from disk is only done on startup. // When targeting ESP-IDF, LittleFS is used to manage flash reads and // writes. Flash is typically *very* slow and unreliable, which is why // this option is disabled by default when targeting ESP-IDF. #ifndef ESP_PLATFORM #define SYNC_WORLD_TO_DISK #endif // The minimum interval (in microseconds) at which certain data is written // to disk/flash. Bounded on the low end by TIME_BETWEEN_TICKS. By default, // applies only to player data. Block changes are written as soon as they // are made, but in much smaller portions. Set DISK_SYNC_BLOCKS_ON_INTERVAL // to make this apply to block changes as well. #define DISK_SYNC_INTERVAL 15000000 // Whether to sync block changes to disk on an interval, instead of syncing // on each change. On systems with fast random disk access, this shouldn't // be necessary. // #define DISK_SYNC_BLOCKS_ON_INTERVAL // Time in microseconds to spend waiting for data transmission before // timing out. Default is 15s, which leaves 5s to prevent starving other // clients from Keep Alive packets. #define NETWORK_TIMEOUT_TIME 15000000 // Size of the receive buffer for incoming string data #define MAX_RECV_BUF_LEN 256 // If defined, sends the server brand to clients. Doesn't do much, but will // show up in the top-left of the F3/debug menu, in the Minecraft client. // You can change the brand string in the "brand" variable in src/globals.c #define SEND_BRAND // If defined, rebroadcasts ALL incoming movement updates, disconnecting // movement from the server's tickrate. This makes movement much smoother // on very low tickrates, at the cost of potential network instability when // hosting more than just a couple of players. When disabling this on low // tickrates, consider disabling SCALE_MOVEMENT_UPDATES_TO_PLAYER_COUNT too. #define BROADCAST_ALL_MOVEMENT // If defined, scales the frequency at which player movement updates are // broadcast based on the amount of players, reducing overhead for higher // player counts. For very many players, makes movement look jittery. // It is not recommended to use this if BROADCAST_ALL_MOVEMENT is disabled // on low tickrates, as that might drastically decrease the update rate. #define SCALE_MOVEMENT_UPDATES_TO_PLAYER_COUNT // If defined, calculates fluid flow when blocks are updated near fluids // Somewhat computationally expensive and potentially unstable #define DO_FLUID_FLOW // If defined, allows players to craft and use chests. // Chests take up 15 block change slots each, require additional checks, // and use some terrible memory hacks to function. On some platforms, this // could cause bad performance or even crashes during gameplay. #define ALLOW_CHESTS // If defined, enables flight for all players. As a side-effect, allows // players to sprint when starving. // #define ENABLE_PLAYER_FLIGHT // If defined, enables the item pickup animation when mining a block/ // Does not affect how item pickups work! Items from broken blocks still // get placed directly in the inventory, this is just an animation. // Relatively inexpensive, though requires sending a few more packets // every time a block is broken. #define ENABLE_PICKUP_ANIMATION // If defined, players are able to receive damage from nearby cacti. #define ENABLE_CACTUS_DAMAGE // If defined, logs unrecognized packet IDs // #define DEV_LOG_UNKNOWN_PACKETS // If defined, logs cases when packet length doesn't match parsed byte count #define DEV_LOG_LENGTH_DISCREPANCY // If defined, log chunk generation events // #define DEV_LOG_CHUNK_GENERATION // If defined, allows dumping world data by sending 0xBEEF (big-endian), // and uploading world data by sending 0xFEED, followed by the data buffer. // Doesn't implement authentication, hence disabled by default. // #define DEV_ENABLE_BEEF_DUMPS #define STATE_NONE 0 #define STATE_STATUS 1 #define STATE_LOGIN 2 #define STATE_TRANSFER 3 #define STATE_CONFIGURATION 4 #define STATE_PLAY 5 extern ssize_t recv_count; extern uint8_t recv_buffer[MAX_RECV_BUF_LEN]; extern uint32_t world_seed; extern uint32_t rng_seed; extern uint16_t world_time; extern uint32_t server_ticks; extern char motd[]; extern uint8_t motd_len; #ifdef SEND_BRAND extern char brand[]; extern uint8_t brand_len; #endif extern uint16_t client_count; typedef struct { short x; short z; uint8_t y; uint8_t block; } BlockChange; #define UPDATE_BASIC (1 << 0) // the sand at this position will be moved down immediately when this is processed #define UPDATE_FALL_SAND (1 << 1) #define UPDATE_FLOW_WATER (1 << 2) // the sand below this block will fall soon #define UPDATE_CHECK_SAND_FALL (1 << 3) #define UPDATE_CHECK_WATER (1 << 4) #define UPDATE_NOW (UPDATE_BASIC | UPDATE_CHECK_SAND_FALL | UPDATE_CHECK_WATER) typedef struct { short update_kind; short x; short z; uint8_t y; uint8_t await_ticks; } DeferredBlockUpdate; #pragma pack(push, 1) typedef struct { uint8_t uuid[16]; char name[16]; int client_fd; short x; uint8_t y; short z; short visited_x[VISITED_HISTORY]; short visited_z[VISITED_HISTORY]; #ifdef SCALE_MOVEMENT_UPDATES_TO_PLAYER_COUNT uint16_t packets_since_update; #endif int8_t yaw; int8_t pitch; uint8_t grounded_y; uint8_t health; uint8_t hunger; uint16_t saturation; uint8_t hotbar; uint16_t inventory_items[41]; uint16_t craft_items[9]; uint8_t inventory_count[41]; uint8_t craft_count[9]; // Usage depends on player's flags, see below // When no flags are set, acts as cursor item ID uint16_t flagval_16; // Usage depends on player's flags, see below // When no flags are set, acts as cursor item count uint8_t flagval_8; // 0x01 - attack cooldown, uses flagval_8 as the timer // 0x02 - has not spawned yet // 0x04 - sneaking // 0x08 - sprinting // 0x10 - eating, makes flagval_16 act as eating timer // 0x20 - client loading, uses flagval_16 as fallback timer // 0x40 - movement update cooldown uint8_t flags; } PlayerData; typedef struct { uint8_t type; short x; // When the mob is dead (health is 0), the Y coordinate acts // as a timer for deleting and deallocating the mob uint8_t y; short z; // Lower 5 bits: health // Middle 1 bit: sheep sheared, unused for other mobs // Upper 2 bits: panic timer uint8_t data; } MobData; #pragma pack(pop) union EntityDataValue { uint8_t byte; int pose; }; typedef struct { uint8_t index; // 0 - Byte // 21 - Pose int type; union EntityDataValue value; } EntityData; extern BlockChange block_changes[MAX_BLOCK_CHANGES]; extern int block_changes_count; extern DeferredBlockUpdate deferred_block_updates[MAX_DEFERRED_BLOCK_UPDATES]; extern int deferred_block_updates_count; extern uint8_t is_processing_deferred_block_updates; extern PlayerData player_data[MAX_PLAYERS]; extern int player_data_count; extern MobData mob_data[MAX_MOBS]; #endif