@@ -68,6 +68,7 @@ void resetPlayerData (PlayerData *player) {
6868 player -> craft_items [i ] = 0 ;
6969 player -> craft_count [i ] = 0 ;
7070 }
71+ player -> flags &= ~0x80 ;
7172}
7273
7374// Assigns the given data to a player_data entry
@@ -342,6 +343,13 @@ void spawnPlayer (PlayerData *player) {
342343
343344 task_yield (); // Check task timer between packets
344345
346+ // Clear crafting grid residue, unlock craft_items
347+ for (int i = 0 ; i < 9 ; i ++ ) {
348+ player -> craft_items [i ] = 0 ;
349+ player -> craft_count [i ] = 0 ;
350+ }
351+ player -> flags &= ~0x80 ;
352+
345353 // Sync client inventory and hotbar
346354 for (uint8_t i = 0 ; i < 41 ; i ++ ) {
347355 sc_setContainerSlot (player -> client_fd , 0 , serverSlotToClientSlot (0 , i ), player -> inventory_count [i ], player -> inventory_items [i ]);
@@ -425,7 +433,9 @@ void broadcastPlayerMetadata (PlayerData *player) {
425433// If client_fd is -1, broadcasts to all player
426434void broadcastMobMetadata (int client_fd , int entity_id ) {
427435
428- MobData * mob = & mob_data [- entity_id - 2 ];
436+ int mob_index = - entity_id - 2 ;
437+ if (mob_index < 0 || mob_index >= MAX_MOBS ) return ;
438+ MobData * mob = & mob_data [mob_index ];
429439
430440 EntityData * metadata ;
431441 size_t length ;
@@ -1266,6 +1276,8 @@ void handlePlayerUseItem (PlayerData *player, short x, short y, short z, uint8_t
12661276 // is mutually exclusive with chests, though it is otherwise a
12671277 // terrible idea for obvious reasons.
12681278 memcpy (player -> craft_items , & storage_ptr , sizeof (storage_ptr ));
1279+ // Flag craft_items as locked due to holding a pointer
1280+ player -> flags |= 0x80 ;
12691281 // Show the player the chest UI
12701282 sc_openScreen (player -> client_fd , 2 , "Chest" , 5 );
12711283 // Load the slots of the chest from the block_changes array.
@@ -1420,7 +1432,9 @@ void interactEntity (int entity_id, int interactor_id) {
14201432 PlayerData * player ;
14211433 if (getPlayerData (interactor_id , & player )) return ;
14221434
1423- MobData * mob = & mob_data [- entity_id - 2 ];
1435+ int mob_index = - entity_id - 2 ;
1436+ if (mob_index < 0 || mob_index >= MAX_MOBS ) return ;
1437+ MobData * mob = & mob_data [mob_index ];
14241438
14251439 switch (mob -> type ) {
14261440 case 106 : // Sheep
@@ -1551,7 +1565,10 @@ void hurtEntity (int entity_id, int attacker_id, uint8_t damage_type, uint8_t da
15511565
15521566 } else { // The attacked entity is a mob
15531567
1554- MobData * mob = & mob_data [- entity_id - 2 ];
1568+ int mob_index = - entity_id - 2 ;
1569+ if (mob_index < 0 || mob_index >= MAX_MOBS ) return ;
1570+ MobData * mob = & mob_data [mob_index ];
1571+
15551572 uint8_t mob_health = mob -> data & 31 ;
15561573
15571574 // Don't continue if the mob is already dead
0 commit comments