fix some door/bed updates

This commit is contained in:
javaprophet 2017-09-10 10:49:42 -07:00
parent 1ee8807e05
commit 23a8c3a413
5 changed files with 140 additions and 227 deletions

View File

@ -1887,198 +1887,6 @@
"lightOpacity": 0,
"lightEmission": 0
},
"bed_6": {
"id": 424,
"collision": {
"0": {
"minX": 0.0,
"maxX": 1.0,
"minY": 0.0,
"maxY": 0.5625,
"minZ": 0.0,
"maxZ": 1.0
}
},
"dropItem": 0,
"dropDamage": 0,
"dropAmountMin": 1,
"dropAmountMax": 1,
"hardness": 0.2,
"material": "cloth",
"slipperiness": 0.6,
"isFullCube": false,
"canProvidePower": false,
"lightOpacity": 0,
"lightEmission": 0
},
"bed_7": {
"id": 425,
"collision": {
"0": {
"minX": 0.0,
"maxX": 1.0,
"minY": 0.0,
"maxY": 0.5625,
"minZ": 0.0,
"maxZ": 1.0
}
},
"dropItem": 0,
"dropDamage": 0,
"dropAmountMin": 1,
"dropAmountMax": 1,
"hardness": 0.2,
"material": "cloth",
"slipperiness": 0.6,
"isFullCube": false,
"canProvidePower": false,
"lightOpacity": 0,
"lightEmission": 0
},
"bed_8": {
"id": 426,
"collision": {
"0": {
"minX": 0.0,
"maxX": 1.0,
"minY": 0.0,
"maxY": 0.5625,
"minZ": 0.0,
"maxZ": 1.0
}
},
"dropItem": 0,
"dropDamage": 0,
"dropAmountMin": 1,
"dropAmountMax": 1,
"hardness": 0.2,
"material": "cloth",
"slipperiness": 0.6,
"isFullCube": false,
"canProvidePower": false,
"lightOpacity": 0,
"lightEmission": 0
},
"bed_9": {
"id": 427,
"collision": {
"0": {
"minX": 0.0,
"maxX": 1.0,
"minY": 0.0,
"maxY": 0.5625,
"minZ": 0.0,
"maxZ": 1.0
}
},
"dropItem": 0,
"dropDamage": 0,
"dropAmountMin": 1,
"dropAmountMax": 1,
"hardness": 0.2,
"material": "cloth",
"slipperiness": 0.6,
"isFullCube": false,
"canProvidePower": false,
"lightOpacity": 0,
"lightEmission": 0
},
"bed_10": {
"id": 428,
"collision": {
"0": {
"minX": 0.0,
"maxX": 1.0,
"minY": 0.0,
"maxY": 0.5625,
"minZ": 0.0,
"maxZ": 1.0
}
},
"dropItem": 0,
"dropDamage": 0,
"dropAmountMin": 1,
"dropAmountMax": 1,
"hardness": 0.2,
"material": "cloth",
"slipperiness": 0.6,
"isFullCube": false,
"canProvidePower": false,
"lightOpacity": 0,
"lightEmission": 0
},
"bed_11": {
"id": 429,
"collision": {
"0": {
"minX": 0.0,
"maxX": 1.0,
"minY": 0.0,
"maxY": 0.5625,
"minZ": 0.0,
"maxZ": 1.0
}
},
"dropItem": 0,
"dropDamage": 0,
"dropAmountMin": 1,
"dropAmountMax": 1,
"hardness": 0.2,
"material": "cloth",
"slipperiness": 0.6,
"isFullCube": false,
"canProvidePower": false,
"lightOpacity": 0,
"lightEmission": 0
},
"bed_12": {
"id": 430,
"collision": {
"0": {
"minX": 0.0,
"maxX": 1.0,
"minY": 0.0,
"maxY": 0.5625,
"minZ": 0.0,
"maxZ": 1.0
}
},
"dropItem": 0,
"dropDamage": 0,
"dropAmountMin": 1,
"dropAmountMax": 1,
"hardness": 0.2,
"material": "cloth",
"slipperiness": 0.6,
"isFullCube": false,
"canProvidePower": false,
"lightOpacity": 0,
"lightEmission": 0
},
"bed_13": {
"id": 431,
"collision": {
"0": {
"minX": 0.0,
"maxX": 1.0,
"minY": 0.0,
"maxY": 0.5625,
"minZ": 0.0,
"maxZ": 1.0
}
},
"dropItem": 0,
"dropDamage": 0,
"dropAmountMin": 1,
"dropAmountMax": 1,
"hardness": 0.2,
"material": "cloth",
"slipperiness": 0.6,
"isFullCube": false,
"canProvidePower": false,
"lightOpacity": 0,
"lightEmission": 0
},
"goldenrail": {
"id": 432,
"collision": {

View File

@ -27,10 +27,56 @@
struct collection* block_infos;
struct collection* block_materials;
int canBePlaced_bed(struct world* world, block blk, int32_t x, int32_t y, int32_t z) {
block b = getBlockWorld(world, x, y - 1, z);
struct block_info* bi = getBlockInfo(b);
return isNormalCube(bi);
}
void onBlockUpdate_bed(struct world* world, block blk, int32_t x, int32_t y, int32_t z) {
block b = getBlockWorld(world, x, y - 1, z);
struct block_info* bi = getBlockInfo(b);
if (!isNormalCube(bi)) goto delete;
int facing = blk & 0b0011;
int head = blk & 0b1000;
uint8_t rf = 0;
if (facing == 0) rf = SOUTH;
else if (facing == 1) rf = WEST;
else if (facing == 2) rf = NORTH;
else if (facing == 3) rf = EAST;
if (head) {
if (rf == SOUTH) rf = NORTH;
else if (rf == NORTH) rf = SOUTH;
else if (rf == EAST) rf = WEST;
else if (rf == WEST) rf = EAST;
}
int32_t ox = x;
int32_t oy = y;
int32_t oz = z;
offsetCoordByFace(&ox, &oy, &oz, rf);
b = getBlockWorld(world, ox, oy, oz);
if (b >> 4 == blk >> 4) return;
delete:;
setBlockWorld(world, 0, x, y, z);
if (head) dropBlockDrops(world, blk, NULL, x, y, z);
}
int canBePlaced_door(struct world* world, block blk, int32_t x, int32_t y, int32_t z) {
block b = getBlockWorld(world, x, y - 1, z);
struct block_info* bi = getBlockInfo(b);
return b >> 4 == blk >> 4 || isNormalCube(bi);
return (b >> 4 == blk >> 4 && !(b & 0b1000) && (blk & 0b1000)) || isNormalCube(bi);
}
void onBlockUpdate_door(struct world* world, block blk, int32_t x, int32_t y, int32_t z) {
block b = getBlockWorld(world, x, y - 1, z);
struct block_info* bi = getBlockInfo(b);
int upper = blk & 0b1000;
if (!upper && !isNormalCube(bi)) goto delete;
b = getBlockWorld(world, x, y + (upper ? -1 : 1), z);
if (b >> 4 == blk >> 4) return;
delete:;
setBlockWorld(world, 0, x, y, z);
if (!upper) dropBlockDrops(world, blk, NULL, x, y, z);
}
void onBlockInteract_woodendoor(struct world* world, block blk, int32_t x, int32_t y, int32_t z, struct player* player, uint8_t face, float curPosX, float curPosY, float curPosZ) {
@ -95,7 +141,7 @@ void onBlockInteract_chest(struct world* world, block blk, int32_t x, int32_t y,
onBlockPlaced_chest(world, blk, x, y, z, 0);
te = getTileEntityWorld(world, x, y, z);
}
//TODO: impl locks, loot
//TODO: impl locks, loot
player_openInventory(player, te->data.chest.inv);
BEGIN_BROADCAST_DIST(player->entity, 128.)
struct packet* pkt = xmalloc(sizeof(struct packet));
@ -128,7 +174,7 @@ void onBlockInteract_furnace(struct world* world, block blk, int32_t x, int32_t
onBlockPlaced_furnace(world, blk, x, y, z, 0);
te = getTileEntityWorld(world, x, y, z);
}
//TODO: impl locks, loot
//TODO: impl locks, loot
player_openInventory(player, te->data.furnace.inv);
struct packet* pkt = xmalloc(sizeof(struct packet));
pkt->id = PKT_PLAY_CLIENT_WINDOWPROPERTY;
@ -1584,41 +1630,45 @@ void init_blocks() {
tmp = getBlockInfo(b);
tmp->onBlockInteract = &onBlockInteract_woodendoor;
tmp->canBePlaced = &canBePlaced_door;
tmp->onBlockUpdate = &onBlockUpdate_checkPlace;
tmp->onBlockUpdate = &onBlockUpdate_door;
}
for (block b = BLK_DOORSPRUCE; b < BLK_DOORSPRUCE + 16; b++) {
tmp = getBlockInfo(b);
tmp->onBlockInteract = &onBlockInteract_woodendoor;
tmp->canBePlaced = &canBePlaced_door;
tmp->onBlockUpdate = &onBlockUpdate_checkPlace;
tmp->onBlockUpdate = &onBlockUpdate_door;
}
for (block b = BLK_DOORBIRCH; b < BLK_DOORBIRCH + 16; b++) {
tmp = getBlockInfo(b);
tmp->onBlockInteract = &onBlockInteract_woodendoor;
tmp->canBePlaced = &canBePlaced_door;
tmp->onBlockUpdate = &onBlockUpdate_checkPlace;
tmp->onBlockUpdate = &onBlockUpdate_door;
}
for (block b = BLK_DOORJUNGLE; b < BLK_DOORJUNGLE + 16; b++) {
tmp = getBlockInfo(b);
tmp->onBlockInteract = &onBlockInteract_woodendoor;
tmp->canBePlaced = &canBePlaced_door;
tmp->onBlockUpdate = &onBlockUpdate_checkPlace;
tmp->onBlockUpdate = &onBlockUpdate_door;
}
for (block b = BLK_DOORACACIA; b < BLK_DOORACACIA + 16; b++) {
tmp = getBlockInfo(b);
tmp->onBlockInteract = &onBlockInteract_woodendoor;
tmp->canBePlaced = &canBePlaced_door;
tmp->onBlockUpdate = &onBlockUpdate_checkPlace;
tmp->onBlockUpdate = &onBlockUpdate_door;
}
for (block b = BLK_DOORDARKOAK; b < BLK_DOORDARKOAK + 16; b++) {
tmp = getBlockInfo(b);
tmp->onBlockInteract = &onBlockInteract_woodendoor;
tmp->canBePlaced = &canBePlaced_door;
tmp->onBlockUpdate = &onBlockUpdate_checkPlace;
tmp->onBlockUpdate = &onBlockUpdate_door;
}
for (block b = BLK_DOORIRON; b < BLK_DOORIRON + 16; b++) {
tmp = getBlockInfo(b);
tmp->canBePlaced = &canBePlaced_door;
tmp->onBlockUpdate = &onBlockUpdate_checkPlace;
tmp->onBlockUpdate = &onBlockUpdate_door;
}
tmp = getBlockInfo(BLK_BED);
tmp->canBePlaced = &canBePlaced_bed;
tmp->onBlockUpdate = &onBlockUpdate_bed;
}

View File

@ -19,7 +19,52 @@
#include "game.h"
#include "player.h"
int onItemInteract_painting(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_bed(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (face != YP) return 0;
if (!getBlockInfo(getBlockWorld(world, x, y, z))->material->replacable) offsetCoordByFace(&x, &y, &z, face);
uint32_t h = (uint32_t) floor(player->entity->yaw / 90. + .5) & 3;
uint8_t rf = 0;
if (h == 0) rf = SOUTH;
else if (h == 1) rf = WEST;
else if (h == 2) rf = NORTH;
else if (h == 3) rf = EAST;
int32_t x2 = x;
int32_t y2 = y;
int32_t z2 = z;
offsetCoordByFace(&x2, &y2, &z2, rf);
block pre = getBlockWorld(world, x, y, z);
block pre2 = getBlockWorld(world, x2, y2, z2);
block b = BLK_BED | h;
block b2 = b;
b2 |= 0b1000;
if (canPlayerPlaceBlock(player, b, x, y, z, face) && !setBlockWorld_noupdate(player->world, b, x, y, z)) {
if (!canPlayerPlaceBlock(player, b2, x2, y2, z2, face) || setBlockWorld(player->world, b2, x2, y2, z2)) {
setBlockWorld(player->world, pre, x, y, z);
setBlockWorld(player->world, pre2, x2, y2, z2);
setSlot(player, player->inventory, 36 + player->currentItem, slot, 1, 1);
return 0;
} else if (player->gamemode != 1) {
if (--slot->itemCount <= 0) {
slot = NULL;
}
setSlot(player, player->inventory, 36 + player->currentItem, slot, 1, 1);
}
updateBlockWorld_guess(world, NULL, x, y, z);
updateBlockWorld_guess(world, NULL, x + 1, y, z);
updateBlockWorld_guess(world, NULL, x - 1, y, z);
updateBlockWorld_guess(world, NULL, x, y + 1, z);
updateBlockWorld_guess(world, NULL, x, y - 1, z);
updateBlockWorld_guess(world, NULL, x, y, z + 1);
updateBlockWorld_guess(world, NULL, x, y, z - 1);
} else {
setBlockWorld(player->world, pre, x, y, z);
setBlockWorld(player->world, pre2, x2, y2, z2);
setSlot(player, player->inventory, 36 + player->currentItem, slot, 1, 1);
}
return 0;
}
int onItemInteract_painting(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
int32_t ox = x;
int32_t oy = y;
int32_t oz = z;
@ -135,7 +180,7 @@ int onItemInteract_painting(struct world* world, struct player* player, uint8_t
}
int onItemInteract_minecart(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_minecart(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
block b = getBlockWorld(world, x, y, z);
if (b >> 4 != BLK_RAIL >> 4 && b >> 4 != BLK_ACTIVATORRAIL >> 4 && b >> 4 != BLK_GOLDENRAIL >> 4 && b >> 4 != BLK_DETECTORRAIL >> 4) return 0;
double dy = 0.;
@ -153,9 +198,9 @@ int onItemInteract_minecart(struct world* world, struct player* player, uint8_t
}
int onItemInteract_door(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_door(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (face != YP) return 0;
offsetCoordByFace(&x, &y, &z, face);
if (!getBlockInfo(getBlockWorld(world, x, y, z))->material->replacable) offsetCoordByFace(&x, &y, &z, face);
block pre = getBlockWorld(world, x, y, z);
block pre2 = getBlockWorld(world, x, y + 1, z);
block b = BLK_DOOROAK;
@ -171,17 +216,25 @@ int onItemInteract_door(struct world* world, struct player* player, uint8_t slot
else if (h == 1) b |= 2;
else if (h == 2) b |= 3;
b2 |= 0b1000;
if (canPlayerPlaceBlock(player, b, x, y, z, face) && !setBlockWorld(player->world, b, x, y, z)) {
if (canPlayerPlaceBlock(player, b, x, y, z, face) && !setBlockWorld_noupdate(player->world, b, x, y, z)) {
if (!canPlayerPlaceBlock(player, b2, x, y + 1, z, face) || setBlockWorld(player->world, b2, x, y + 1, z)) {
setBlockWorld(player->world, pre, x, y, z);
setBlockWorld(player->world, pre2, x, y + 1, z);
setSlot(player, player->inventory, 36 + player->currentItem, slot, 1, 1);
return 0;
} else if (player->gamemode != 1) {
if (--slot->itemCount <= 0) {
slot = NULL;
}
setSlot(player, player->inventory, 36 + player->currentItem, slot, 1, 1);
}
updateBlockWorld_guess(world, NULL, x, y, z);
updateBlockWorld_guess(world, NULL, x + 1, y, z);
updateBlockWorld_guess(world, NULL, x - 1, y, z);
updateBlockWorld_guess(world, NULL, x, y + 1, z);
updateBlockWorld_guess(world, NULL, x, y - 1, z);
updateBlockWorld_guess(world, NULL, x, y, z + 1);
updateBlockWorld_guess(world, NULL, x, y, z - 1);
} else {
setBlockWorld(player->world, pre, x, y, z);
setBlockWorld(player->world, pre2, x, y + 1, z);
@ -190,8 +243,8 @@ int onItemInteract_door(struct world* world, struct player* player, uint8_t slot
return 0;
}
int onItemInteract_itemblock(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
offsetCoordByFace(&x, &y, &z, face);
int onItemInteract_itemblock(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (!getBlockInfo(getBlockWorld(world, x, y, z))->material->replacable) offsetCoordByFace(&x, &y, &z, face);
block pre = getBlockWorld(world, x, y, z);
block b = pre;
if (slot->item == ITM_STRING) {
@ -228,7 +281,7 @@ int onItemInteract_itemblock(struct world* world, struct player* player, uint8_t
return 0;
}
int onItemBreakBlock_tool(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z) {
int onItemBreakBlock_tool(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z) {
if (slot == NULL) return 0;
struct item_info* ii = getItemInfo(slot->item);
if (ii == NULL) return 0;
@ -250,7 +303,7 @@ float onItemAttacked_tool(struct world* world, struct player* player, uint8_t sl
return ii->damage;
}
void offsetCoordByFace(int32_t* x, uint8_t* y, int32_t* z, uint8_t face) {
void offsetCoordByFace(int32_t* x, int32_t* y, int32_t* z, uint8_t face) {
if (face == YN) (*y)--;
else if (face == YP) (*y)++;
else if (face == ZN) (*z)--;
@ -259,7 +312,7 @@ void offsetCoordByFace(int32_t* x, uint8_t* y, int32_t* z, uint8_t face) {
else if (face == XP) (*x)++;
}
int onItemInteract_flintandsteel(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_flintandsteel(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (slot == NULL) return 0;
offsetCoordByFace(&x, &y, &z, face);
if (getBlockWorld(world, x, y, z) != 0) return 0;
@ -274,10 +327,10 @@ int onItemInteract_flintandsteel(struct world* world, struct player* player, uin
return 0;
}
int onItemInteract_spawnegg(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_spawnegg(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (slot == NULL || slot->nbt == NULL) return 0;
//TODO: mob spawners
offsetCoordByFace(&x, &y, &z, face);
if (getBlockInfo(getBlockWorld(world, x, y, z))->boundingBox_count > 0) offsetCoordByFace(&x, &y, &z, face);
//if (getBlockWorld(world, x, y, z) != 0) return 0;
struct item_info* ii = getItemInfo(slot->item);
if (ii == NULL) return 0;
@ -295,9 +348,9 @@ int onItemInteract_spawnegg(struct world* world, struct player* player, uint8_t
return 0;
}
int onItemInteract_reeds(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_reeds(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (slot == NULL) return 0;
offsetCoordByFace(&x, &y, &z, face);
if (!getBlockInfo(getBlockWorld(world, x, y, z))->material->replacable) offsetCoordByFace(&x, &y, &z, face);
if (!canPlayerPlaceBlock(player, BLK_REEDS, x, y, z, face)) return 0;
if (getBlockWorld(world, x, y, z) != 0) return 0;
if (!canBePlaced_reeds(world, BLK_REEDS, x, y, z)) return 0;
@ -311,9 +364,9 @@ int onItemInteract_reeds(struct world* world, struct player* player, uint8_t slo
return 0;
}
int onItemInteract_bucket(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_bucket(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (slot == NULL) return 0;
offsetCoordByFace(&x, &y, &z, face);
if (!getBlockInfo(getBlockWorld(world, x, y, z))->material->replacable) offsetCoordByFace(&x, &y, &z, face);
block b = getBlockWorld(world, x, y, z);
struct block_info* bi = getBlockInfo(b);
if (bi == NULL) return 0;
@ -353,7 +406,7 @@ int onItemInteract_bucket(struct world* world, struct player* player, uint8_t sl
return 0;
}
int onItemInteract_bonemeal(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_bonemeal(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (slot == NULL) return 0;
if (!canPlayerPlaceBlock(player, ITM_DYEPOWDER_BLACK, x, y, z, face)) return 0;
block b = getBlockWorld(world, x, y, z);
@ -409,9 +462,9 @@ int onItemInteract_bonemeal(struct world* world, struct player* player, uint8_t
return 0;
}
int onItemInteract_seeds(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_seeds(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (slot == NULL) return 0;
offsetCoordByFace(&x, &y, &z, face);
if (!getBlockInfo(getBlockWorld(world, x, y, z))->material->replacable) offsetCoordByFace(&x, &y, &z, face);
if (!canPlayerPlaceBlock(player, ITM_DYEPOWDER_BLACK, x, y, z, face)) return 0;
block b = getBlockWorld(world, x, y, z);
if (slot->item == ITM_DYEPOWDER_BLACK) {
@ -438,7 +491,7 @@ int onItemInteract_seeds(struct world* world, struct player* player, uint8_t slo
return 0;
}
int onItemInteract_hoe(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_hoe(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (slot == NULL) return 0;
struct item_info* ii = getItemInfo(slot->item);
if (ii == NULL) return 0;
@ -454,7 +507,7 @@ int onItemInteract_hoe(struct world* world, struct player* player, uint8_t slot_
return 0;
}
int onItemInteract_shovel(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face) {
int onItemInteract_shovel(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face) {
if (slot == NULL) return 0;
struct item_info* ii = getItemInfo(slot->item);
if (ii == NULL) return 0;
@ -761,6 +814,7 @@ void init_items() {
getItemInfo(ITM_MINECARTHOPPER)->onItemInteract = &onItemInteract_minecart;
getItemInfo(ITM_MINECARTCOMMANDBLOCK)->onItemInteract = &onItemInteract_minecart;
getItemInfo(ITM_PAINTING)->onItemInteract = &onItemInteract_painting;
getItemInfo(ITM_BED)->onItemInteract = &onItemInteract_bed;
init_food(ITM_APPLE, 4, 0.3, 0);
init_food(ITM_MUSHROOMSTEW, 6, 0.6, 0);
init_food(ITM_BREAD, 5, 0.6, 0);

View File

@ -18,7 +18,7 @@ typedef int16_t item;
#include "inventory.h"
#include "tools.h"
void offsetCoordByFace(int32_t* x, uint8_t* y, int32_t* z, uint8_t face);
void offsetCoordByFace(int32_t* x, int32_t* y, int32_t* z, uint8_t face);
#define YN 0
#define YP 1
@ -264,8 +264,8 @@ struct item_info {
int (*canUseItem)(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot);
void (*onItemUseTick)(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t ticksElapsed); // not in-world usage, nor called on last tick. ticksElapsed==0 on start., -1 on cancel
void (*onItemUse)(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, uint32_t ticks); // not in-world usage, when called with long use items, full duration not guaranteed
int (*onItemInteract)(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z, uint8_t face); // in-world usage, called after onItemUse
int (*onItemBreakBlock)(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, uint8_t y, int32_t z); // in-world usage
int (*onItemInteract)(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z, uint8_t face); // in-world usage, called after onItemUse
int (*onItemBreakBlock)(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, int32_t x, int32_t y, int32_t z); // in-world usage
float (*onItemAttacked)(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, struct entity* entity); // entity may be NULL
float (*onEntityHitWhileWearing)(struct world* world, struct player* player, uint8_t slot_index, struct slot* slot, float damage); // only called for armor/shields
void* callback_arg;

View File

@ -1605,5 +1605,6 @@ int canPlayerPlaceBlock(struct player* player, block blk, int32_t x, int32_t y,
if (bi != NULL && bi->canBePlaced != NULL && !(*bi->canBePlaced)(player->world, tbb, x, y, z)) {
return 0;
}
return 1;
block b = getBlockWorld(player->world, x, y, z);
return b == 0 || getBlockInfo(b)->material->replacable;
}