Skip to content

Fix #3685: Prevent coin collection through solid weak blocks#3762

Open
baltazarReis wants to merge 1 commit into
SuperTux:masterfrom
baltazarReis:fix-iceblock-coin-bug
Open

Fix #3685: Prevent coin collection through solid weak blocks#3762
baltazarReis wants to merge 1 commit into
SuperTux:masterfrom
baltazarReis:fix-iceblock-coin-bug

Conversation

@baltazarReis

@baltazarReis baltazarReis commented Mar 26, 2026

Copy link
Copy Markdown

This PR fixes a bug where players could collect coins trapped inside a WeakBlock (like ice blocks) before the block was destroyed.

Added is_solid_block() method to WeakBlock to check its current state.

Modified Coin::collision to prevent collection if the coin's center is inside a solid WeakBlock.

Closes #3685

Comment thread src/object/weak_block.hpp
Comment on lines +49 to +51

/** Check if this block is still solid (not destroyed) and blocking objects */
inline bool is_solid_block() const { return state != STATE_DISINTEGRATING; }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this really necessary? Getting this information from the current collision group would be much more accurate and would not require this extra method.

Suggested change
/** Check if this block is still solid (not destroyed) and blocking objects */
inline bool is_solid_block() const { return state != STATE_DISINTEGRATING; }

Comment thread src/object/coin.cpp
Comment on lines +250 to +258
if (weak_block.is_solid_block()) {
const Rectf& block_bbox = weak_block.get_bbox();
if (coin_center.x >= block_bbox.get_left() &&
coin_center.x <= block_bbox.get_right() &&
coin_center.y >= block_bbox.get_top() &&
coin_center.y <= block_bbox.get_bottom()) {
return ABORT_MOVE;
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without that extra method, it becomes easier to write this in a concise manner:

Suggested change
if (weak_block.is_solid_block()) {
const Rectf& block_bbox = weak_block.get_bbox();
if (coin_center.x >= block_bbox.get_left() &&
coin_center.x <= block_bbox.get_right() &&
coin_center.y >= block_bbox.get_top() &&
coin_center.y <= block_bbox.get_bottom()) {
return ABORT_MOVE;
}
}
if (weak_block.get_group() == COLGROUP_DISABLED)
continue;
if (weak_block.get_bbox().contains(coin_center))
return ABORT_MOVE;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Some coins inside ice blocks can be grabbed without melting

2 participants