Simply block define api again by avoiding need to call Block_SetCollide/Block_RecalculateBB

This commit is contained in:
UnknownShadow200 2022-08-27 17:07:48 +10:00
parent e525c6ae0e
commit 4bc9842e4e
5 changed files with 47 additions and 46 deletions

View File

@ -93,7 +93,7 @@ static const struct SimpleBlockDef core_blockDefs[] = {
{ "Mossy rocks", 36, 36, 36, 16, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_SOLID, SOUND_STONE, SOUND_STONE }, { "Mossy rocks", 36, 36, 36, 16, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_SOLID, SOUND_STONE, SOUND_STONE },
{ "Obsidian", 37, 37, 37, 16, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_SOLID, SOUND_STONE, SOUND_STONE }, { "Obsidian", 37, 37, 37, 16, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_SOLID, SOUND_STONE, SOUND_STONE },
{ "Cobblestone slab", 16, 16, 16, 8, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_SOLID, SOUND_STONE, SOUND_STONE }, { "Cobblestone slab", 16, 16, 16, 8, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_SOLID, SOUND_STONE, SOUND_STONE },
{ "Rope", 11, 11, 11, 16, FOG_NONE , 0, false, false, 100, DRAW_SPRITE, COLLIDE_NONE, SOUND_CLOTH, SOUND_CLOTH }, { "Rope", 11, 11, 11, 16, FOG_NONE , 0, false, false, 100, DRAW_SPRITE, COLLIDE_CLIMB, SOUND_CLOTH, SOUND_CLOTH },
{ "Sandstone", 25, 41, 57, 16, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_SOLID, SOUND_STONE, SOUND_STONE }, { "Sandstone", 25, 41, 57, 16, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_SOLID, SOUND_STONE, SOUND_STONE },
{ "Snow", 50, 50, 50, 4, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_NONE, SOUND_SNOW, SOUND_SNOW }, { "Snow", 50, 50, 50, 4, FOG_NONE , 0, false, true, 100, DRAW_OPAQUE, COLLIDE_NONE, SOUND_SNOW, SOUND_SNOW },
{ "Fire", 38, 38, 38, 16, FOG_NONE , 0, true, false, 100, DRAW_SPRITE, COLLIDE_NONE, SOUND_WOOD, SOUND_NONE }, { "Fire", 38, 38, 38, 16, FOG_NONE , 0, true, false, 100, DRAW_SPRITE, COLLIDE_NONE, SOUND_WOOD, SOUND_NONE },
@ -113,9 +113,9 @@ static const struct SimpleBlockDef core_blockDefs[] = {
/*NAME TOP SID BOT HEI FOG_COLOR DENS FULL BLOCKS GRAV DRAW_MODE COLLIDE_MODE DIG_SOUND STEP_SOUND */ /*NAME TOP SID BOT HEI FOG_COLOR DENS FULL BLOCKS GRAV DRAW_MODE COLLIDE_MODE DIG_SOUND STEP_SOUND */
}; };
/* Returns a backwards compatible collide type of a block. */ /* Returns a backwards compatible collide type of a block */
static cc_uint8 DefaultSet_MapOldCollide(BlockID b, cc_uint8 collide) { static cc_uint8 DefaultSet_MapOldCollide(BlockID b, cc_uint8 collide) {
if (b == BLOCK_ROPE && collide == COLLIDE_NONE) return COLLIDE_CLIMB_ROPE; if (b == BLOCK_ROPE && collide == COLLIDE_NONE) return COLLIDE_CLIMB;
if (b == BLOCK_ICE && collide == COLLIDE_SOLID) return COLLIDE_ICE; if (b == BLOCK_ICE && collide == COLLIDE_SOLID) return COLLIDE_ICE;
if ((b == BLOCK_WATER || b == BLOCK_STILL_WATER) && collide == COLLIDE_LIQUID) if ((b == BLOCK_WATER || b == BLOCK_STILL_WATER) && collide == COLLIDE_LIQUID)
@ -136,9 +136,8 @@ static void Block_RecalcIsLiquid(BlockID b) {
(collide == COLLIDE_LAVA && Blocks.Draw[b] == DRAW_TRANSPARENT); (collide == COLLIDE_LAVA && Blocks.Draw[b] == DRAW_TRANSPARENT);
} }
void Block_SetCollide(BlockID block, cc_uint8 collide) { /* Sets the basic and extended collide types of the given block */
/* necessary if servers redefined core blocks, before extended collide types were added */ static void Block_SetCollide(BlockID block, cc_uint8 collide) {
collide = DefaultSet_MapOldCollide(block, collide);
Blocks.ExtendedCollide[block] = collide; Blocks.ExtendedCollide[block] = collide;
Block_RecalcIsLiquid(block); Block_RecalcIsLiquid(block);
@ -212,15 +211,6 @@ static void Block_CalcLightOffset(BlockID block) {
Blocks.LightOffset[block] = flags; Blocks.LightOffset[block] = flags;
} }
/* Recalculates bounding boxes of all sprite blocks */
static void Block_RecalculateAllSpriteBB(void) {
int block;
for (block = BLOCK_AIR; block < BLOCK_COUNT; block++) {
if (Blocks.Draw[block] != DRAW_SPRITE) continue;
Block_RecalculateBB((BlockID)block);
}
}
static float GetSpriteBB_MinX(int size, int tileX, int tileY, const struct Bitmap* bmp) { static float GetSpriteBB_MinX(int size, int tileX, int tileY, const struct Bitmap* bmp) {
BitmapCol* row; BitmapCol* row;
@ -274,7 +264,8 @@ static float GetSpriteBB_MaxY(int size, int tileX, int tileY, const struct Bitma
return 0.0f; return 0.0f;
} }
void Block_RecalculateBB(BlockID block) { /* Recalculates bounding box of the given sprite block */
static void Block_RecalculateBB(BlockID block) {
struct Bitmap* bmp = &Atlas2D.Bmp; struct Bitmap* bmp = &Atlas2D.Bmp;
int tileSize = Atlas2D.TileSize; int tileSize = Atlas2D.TileSize;
TextureLoc texLoc = Block_Tex(block, FACE_XMAX); TextureLoc texLoc = Block_Tex(block, FACE_XMAX);
@ -298,6 +289,16 @@ void Block_RecalculateBB(BlockID block) {
Block_CalcRenderBounds(block); Block_CalcRenderBounds(block);
} }
/* Recalculates bounding boxes of all sprite blocks */
static void Block_RecalculateAllSpriteBB(void) {
int block;
for (block = BLOCK_AIR; block < BLOCK_COUNT; block++) {
if (Blocks.Draw[block] != DRAW_SPRITE) continue;
Block_RecalculateBB((BlockID)block);
}
}
static void Block_CalcStretch(BlockID block) { static void Block_CalcStretch(BlockID block) {
/* faces which can be stretched on X axis */ /* faces which can be stretched on X axis */
@ -420,11 +421,14 @@ static void Block_SetCustomDefined(BlockID block, cc_bool defined) {
} }
} }
void Block_DefineCustom(BlockID block) { void Block_DefineCustom(BlockID block, cc_bool checkSprite) {
PackedCol black = PackedCol_Make(0, 0, 0, 255); PackedCol black = PackedCol_Make(0, 0, 0, 255);
cc_string name = Block_UNSAFE_GetName(block); cc_string name = Block_UNSAFE_GetName(block);
/* necessary if servers redefined core blocks, before extended collide types were added */
cc_uint8 collide = DefaultSet_MapOldCollide(block, Blocks.Collide[block]);
Blocks.Tinted[block] = Blocks.FogCol[block] != black && String_IndexOf(&name, '#') >= 0; Blocks.Tinted[block] = Blocks.FogCol[block] != black && String_IndexOf(&name, '#') >= 0;
Block_SetCollide(block, collide);
Block_SetDrawType(block, Blocks.Draw[block]); Block_SetDrawType(block, Blocks.Draw[block]);
Block_CalcRenderBounds(block); Block_CalcRenderBounds(block);
Block_UpdateCulling(block); Block_UpdateCulling(block);
@ -433,6 +437,10 @@ void Block_DefineCustom(BlockID block) {
Inventory_AddDefault(block); Inventory_AddDefault(block);
Block_SetCustomDefined(block, true); Block_SetCustomDefined(block, true);
Event_RaiseVoid(&BlockEvents.BlockDefChanged); Event_RaiseVoid(&BlockEvents.BlockDefChanged);
if (!checkSprite) return; /* TODO eliminate this */
/* Update sprite BoundingBox if necessary */
if (Blocks.Draw[block] == DRAW_SPRITE) Block_RecalculateBB(block);
} }
void Block_UndefineCustom(BlockID block) { void Block_UndefineCustom(BlockID block) {

View File

@ -37,7 +37,7 @@ enum CollideType {
COLLIDE_SLIPPERY_ICE, /* Block is solid and fully slidable on. */ COLLIDE_SLIPPERY_ICE, /* Block is solid and fully slidable on. */
COLLIDE_WATER, /* Water style 'swimming'/'bobbing' interaction when player collides. */ COLLIDE_WATER, /* Water style 'swimming'/'bobbing' interaction when player collides. */
COLLIDE_LAVA, /* Lava style 'swimming'/'bobbing' interaction when player collides. */ COLLIDE_LAVA, /* Lava style 'swimming'/'bobbing' interaction when player collides. */
COLLIDE_CLIMB_ROPE /* Rope/Ladder style climbing interaction when player collides. */ COLLIDE_CLIMB /* Rope/Ladder style climbing interaction when player collides. */
}; };
CC_VAR extern struct _BlockLists { CC_VAR extern struct _BlockLists {
@ -113,44 +113,38 @@ if (Blocks.Tinted[block]) col = PackedCol_Tint(col, Blocks.FogCol[block]);
/* and comparing whether the block directly behind them is in shadow or not */ /* and comparing whether the block directly behind them is in shadow or not */
#define LIGHT_FLAG_SHADES_FROM_BELOW 6 #define LIGHT_FLAG_SHADES_FROM_BELOW 6
/* Returns whether the given block has been changed from default. */ /* Returns whether the given block has been changed from default */
cc_bool Block_IsCustomDefined(BlockID block); cc_bool Block_IsCustomDefined(BlockID block);
/* Updates state and raises event after the given block has been defined */ /* Updates state and raises event after the given block has been defined */
void Block_DefineCustom(BlockID block); void Block_DefineCustom(BlockID block, cc_bool checkSprite);
/* Resets the given block to default */ /* Resets the given block to default */
void Block_UndefineCustom(BlockID block); void Block_UndefineCustom(BlockID block);
/* Resets all the properties of the given block to default */
/* Sets the basic and extended collide types of the given block. */
void Block_SetCollide(BlockID block, cc_uint8 collide);
/* Resets all the properties of the given block to default. */
void Block_ResetProps(BlockID block); void Block_ResetProps(BlockID block);
/* Gets the name of the given block. */ /* Gets the name of the given block */
/* NOTE: Name points directly within underlying buffer, you MUST NOT persist this string. */ /* NOTE: Name points directly within underlying buffer, you MUST NOT persist this string */
CC_API STRING_REF cc_string Block_UNSAFE_GetName(BlockID block); CC_API STRING_REF cc_string Block_UNSAFE_GetName(BlockID block);
/* Sets the name of the given block. */ /* Sets the name of the given block. */
void Block_SetName(BlockID block, const cc_string* name); void Block_SetName(BlockID block, const cc_string* name);
/* Finds the ID of the block whose name caselessly matches given name. */ /* Finds the ID of the block whose name caselessly matches given name */
CC_API int Block_FindID(const cc_string* name); CC_API int Block_FindID(const cc_string* name);
/* Attempts to parse given name as a numerical block ID. */ /* Attempts to parse given name as a numerical block ID */
/* Falls back to Block_FindID if this fails. */ /* Falls back to Block_FindID if this fails */
CC_API int Block_Parse(const cc_string* name); CC_API int Block_Parse(const cc_string* name);
/* Recalculates bounding box of the given sprite block. */ /* Sets the textures of the side faces of the given block */
void Block_RecalculateBB(BlockID block);
/* Sets the textures of the side faces of the given block. */
void Block_SetSide(TextureLoc texLoc, BlockID blockId); void Block_SetSide(TextureLoc texLoc, BlockID blockId);
/* The texture for the given face of the given block. */ /* The texture for the given face of the given block */
#define Block_Tex(block, face) Blocks.Textures[(block) * FACE_COUNT + (face)] #define Block_Tex(block, face) Blocks.Textures[(block) * FACE_COUNT + (face)]
/* Whether the given face of this block is occluded/hidden */ /* Whether the given face of this block is occluded/hidden */
#define Block_IsFaceHidden(block, other, face) (Blocks.Hidden[((block) * BLOCK_COUNT) + (other)] & (1 << (face))) #define Block_IsFaceHidden(block, other, face) (Blocks.Hidden[((block) * BLOCK_COUNT) + (other)] & (1 << (face)))
/* Whether blocks can be automatically rotated. */ /* Whether blocks can be automatically rotated */
extern cc_bool AutoRotate_Enabled; extern cc_bool AutoRotate_Enabled;
/* Attempts to find the rotated block based on the user's orientation and offset on selected block. */ /* Attempts to find the rotated block based on the user's orientation and offset on selected block */
/* If no rotated block is found, returns given block. */ /* If no rotated block is found, returns given block */
BlockID AutoRotate_RotateBlock(BlockID block); BlockID AutoRotate_RotateBlock(BlockID block);
/* Returns non 0 if both blocks belong to the same autorotate group */ /* Returns non 0 if both blocks belong to the same autorotate group */
cc_bool AutoRotate_BlocksShareGroup(BlockID block, BlockID blockOther); cc_bool AutoRotate_BlocksShareGroup(BlockID block, BlockID blockOther);

View File

@ -194,7 +194,7 @@ cc_bool Entity_TouchesAny(struct AABB* bounds, Entity_TouchesCondition condition
return false; return false;
} }
static cc_bool IsRopeCollide(BlockID b) { return Blocks.ExtendedCollide[b] == COLLIDE_CLIMB_ROPE; } static cc_bool IsRopeCollide(BlockID b) { return Blocks.ExtendedCollide[b] == COLLIDE_CLIMB; }
cc_bool Entity_TouchesAnyRope(struct Entity* e) { cc_bool Entity_TouchesAnyRope(struct Entity* e) {
struct AABB bounds; Entity_GetBounds(e, &bounds); struct AABB bounds; Entity_GetBounds(e, &bounds);
bounds.Max.Y += 0.5f / 16.0f; bounds.Max.Y += 0.5f / 16.0f;

View File

@ -714,7 +714,7 @@ static void Cw_Callback_4(struct NbtTag* tag) {
Blocks.SpriteOffset[id] = 0; Blocks.SpriteOffset[id] = 0;
} }
Block_DefineCustom(id); Block_DefineCustom(id, false);
Blocks.CanPlace[id] = true; Blocks.CanPlace[id] = true;
Blocks.CanDelete[id] = true; Blocks.CanDelete[id] = true;
Event_RaiseVoid(&BlockEvents.PermissionsChanged); Event_RaiseVoid(&BlockEvents.PermissionsChanged);
@ -740,7 +740,7 @@ static void Cw_Callback_5(struct NbtTag* tag) {
if (IsTag(tag->parent->parent, "BlockDefinitions") && Game_AllowCustomBlocks) { if (IsTag(tag->parent->parent, "BlockDefinitions") && Game_AllowCustomBlocks) {
if (IsTag(tag, "ID")) { cw_curID = NbtTag_U8(tag); return; } if (IsTag(tag, "ID")) { cw_curID = NbtTag_U8(tag); return; }
if (IsTag(tag, "ID2")) { cw_curID = NbtTag_U16(tag); return; } if (IsTag(tag, "ID2")) { cw_curID = NbtTag_U16(tag); return; }
if (IsTag(tag, "CollideType")) { Block_SetCollide(id, NbtTag_U8(tag)); return; } if (IsTag(tag, "CollideType")) { Blocks.Collide[id] = NbtTag_U8(tag); return; }
if (IsTag(tag, "Speed")) { Blocks.SpeedMultiplier[id] = NbtTag_F32(tag); return; } if (IsTag(tag, "Speed")) { Blocks.SpeedMultiplier[id] = NbtTag_F32(tag); return; }
if (IsTag(tag, "TransmitsLight")) { Blocks.BlocksLight[id] = NbtTag_U8(tag) == 0; return; } if (IsTag(tag, "TransmitsLight")) { Blocks.BlocksLight[id] = NbtTag_U8(tag) == 0; return; }
if (IsTag(tag, "FullBright")) { Blocks.FullBright[id] = NbtTag_U8(tag) != 0; return; } if (IsTag(tag, "FullBright")) { Blocks.FullBright[id] = NbtTag_U8(tag) != 0; return; }

View File

@ -1663,7 +1663,7 @@ static BlockID BlockDefs_DefineBlockCommonStart(cc_uint8** ptr, cc_bool uniqueSi
name = UNSAFE_GetString(data); data += STRING_SIZE; name = UNSAFE_GetString(data); data += STRING_SIZE;
Block_SetName(block, &name); Block_SetName(block, &name);
Block_SetCollide(block, *data++); Blocks.Collide[block] = *data++;
speedLog2 = (*data++ - 128) / 64.0f; speedLog2 = (*data++ - 128) / 64.0f;
#define LOG_2 0.693147180559945 #define LOG_2 0.693147180559945
@ -1703,7 +1703,6 @@ static void BlockDefs_DefineBlockCommonEnd(cc_uint8* data, cc_uint8 shape, Block
Blocks.FogDensity[block] = data[1] == 0 ? 0.0f : (data[1] + 1) / 128.0f; Blocks.FogDensity[block] = data[1] == 0 ? 0.0f : (data[1] + 1) / 128.0f;
Blocks.FogCol[block] = PackedCol_Make(data[2], data[3], data[4], 255); Blocks.FogCol[block] = PackedCol_Make(data[2], data[3], data[4], 255);
Block_DefineCustom(block);
} }
static void BlockDefs_DefineBlock(cc_uint8* data) { static void BlockDefs_DefineBlock(cc_uint8* data) {
@ -1715,8 +1714,7 @@ static void BlockDefs_DefineBlock(cc_uint8* data) {
} }
BlockDefs_DefineBlockCommonEnd(data, shape, block); BlockDefs_DefineBlockCommonEnd(data, shape, block);
/* Update sprite BoundingBox if necessary */ Block_DefineCustom(block, true);
if (Blocks.Draw[block] == DRAW_SPRITE) Block_RecalculateBB(block);
} }
static void BlockDefs_UndefineBlock(cc_uint8* data) { static void BlockDefs_UndefineBlock(cc_uint8* data) {
@ -1745,6 +1743,7 @@ static void BlockDefs_DefineBlockExt(cc_uint8* data) {
Blocks.MinBB[block] = minBB; Blocks.MinBB[block] = minBB;
Blocks.MaxBB[block] = maxBB; Blocks.MaxBB[block] = maxBB;
BlockDefs_DefineBlockCommonEnd(data, 1, block); BlockDefs_DefineBlockCommonEnd(data, 1, block);
Block_DefineCustom(block, false);
} }
static void BlockDefs_Reset(void) { static void BlockDefs_Reset(void) {