@@ -368,6 +368,43 @@ void spawnPlayer (PlayerData *player) {
368368
369369}
370370
371+ // Broadcasts a player's entity metadata (sneak/sprint state) to other players
372+ void broadcastPlayerMetadata (PlayerData * player ) {
373+ uint8_t sneaking = (player -> flags & 0x04 ) != 0 ;
374+ uint8_t sprinting = (player -> flags & 0x08 ) != 0 ;
375+
376+ uint8_t player_bit_mask = 0 ;
377+ if (sneaking ) player_bit_mask |= 0x02 ;
378+ if (sprinting ) player_bit_mask |= 0x08 ;
379+
380+ int pose = 0 ;
381+ if (sneaking ) pose = 5 ;
382+
383+ EntityData metadata [] = {
384+ {
385+ 0 , // Index (Bit Mask)
386+ 0 , // Type (Byte)
387+ player_bit_mask , // Value
388+ },
389+ {
390+ 6 , // Index (Pose),
391+ 21 , // Type (Pose),
392+ pose , // Value (Standing)
393+ }
394+ };
395+
396+ for (int i = 0 ; i < MAX_PLAYERS ; i ++ ) {
397+ PlayerData * other_player = & player_data [i ];
398+ int client_fd = other_player -> client_fd ;
399+
400+ if (client_fd == -1 ) continue ;
401+ if (client_fd == player -> client_fd ) continue ;
402+ if (other_player -> flags & 0x20 ) continue ;
403+
404+ sc_setEntityMetadata (client_fd , player -> client_fd , metadata , 2 );
405+ }
406+ }
407+
371408uint8_t getBlockChange (short x , uint8_t y , short z ) {
372409 for (int i = 0 ; i < block_changes_count ; i ++ ) {
373410 if (block_changes [i ].block == 0xFF ) continue ;
@@ -1784,3 +1821,47 @@ void broadcastChestUpdate (int origin_fd, uint8_t *storage_ptr, uint16_t item, u
17841821
17851822}
17861823#endif
1824+
1825+ ssize_t writeEntityData (int client_fd , EntityData * data ) {
1826+ writeByte (client_fd , data -> index );
1827+ writeVarInt (client_fd , data -> type );
1828+
1829+ switch (data -> type ) {
1830+ case 0 : // Byte
1831+ return writeByte (client_fd , data -> value .byte );
1832+ case 21 : // Pose
1833+ writeVarInt (client_fd , data -> value .pose );
1834+ return 0 ;
1835+
1836+ default : return -1 ;
1837+ }
1838+ }
1839+
1840+ // Returns the networked size of an EntityData entry
1841+ int sizeEntityData (EntityData * data ) {
1842+ int value_size ;
1843+
1844+ switch (data -> type ) {
1845+ case 0 : // Byte
1846+ value_size = 1 ;
1847+ break ;
1848+ case 21 : // Pose
1849+ value_size = sizeVarInt (data -> value .pose );
1850+ break ;
1851+
1852+ default : return -1 ;
1853+ }
1854+
1855+ return 1 + sizeVarInt (data -> type ) + value_size ;
1856+ }
1857+
1858+ // Returns the networked size of an array of EntityData entries
1859+ int sizeEntityMetadata (EntityData * metadata , size_t length ) {
1860+ int total_size = 0 ;
1861+ for (size_t i = 0 ; i < length ; i ++ ) {
1862+ int size = sizeEntityData (& metadata [i ]);
1863+ if (size == -1 ) return -1 ;
1864+ total_size += size ;
1865+ }
1866+ return total_size ;
1867+ }
0 commit comments