@@ -93,7 +93,7 @@ impl BlockBreaker {
93
93
let this = self . clone ( ) ;
94
94
match this {
95
95
BlockBreaker :: Active ( a) => {
96
- if a. ticks_remaining == 1 {
96
+ if a. can_break ( ) {
97
97
let fin = a. finish ( ) ;
98
98
* self = Self :: Finished ( fin. clone ( ) ) ;
99
99
Some ( fin)
@@ -142,18 +142,23 @@ pub struct ActiveBreaker {
142
142
pub position : ValidBlockPosition ,
143
143
pub drop_item : bool ,
144
144
pub fake_finished : bool ,
145
- pub total_ticks : u32 ,
146
- pub ticks_remaining : u32 ,
145
+ pub progress : f32 ,
146
+ pub damage : f32 ,
147
147
}
148
148
impl ActiveBreaker {
149
149
pub fn tick ( & mut self ) -> ( bool , bool ) {
150
150
let before = self . destroy_stage ( ) ;
151
- self . ticks_remaining = self . ticks_remaining . saturating_sub ( 1 ) ;
151
+ self . progress + = self . damage ;
152
152
let after = self . destroy_stage ( ) ;
153
- let break_block = self . ticks_remaining == 0 ;
153
+ let break_block = self . can_break ( ) ;
154
154
let change_stage = before != after || break_block;
155
155
( break_block, change_stage)
156
156
}
157
+ /// Check if the block has been damaged enough to break.
158
+ pub fn can_break ( & self ) -> bool {
159
+ // Comparing to 0.7 ensures good feeling in the client
160
+ self . progress >= 0.7 - self . damage / 2.0
161
+ }
157
162
pub fn new (
158
163
world : & mut World ,
159
164
block_pos : ValidBlockPosition ,
@@ -202,32 +207,20 @@ impl ActiveBreaker {
202
207
} else {
203
208
1.0 / block. hardness ( ) / 100.0
204
209
} ;
205
- let ticks = if damage > 1.0 {
206
- 0
207
- } else {
208
- ( 1.0 / damage / 1.2 ) . ceil ( ) as u32
209
- } ;
210
- println ! (
211
- "Mining {} with {} takes {} ticks" ,
212
- block. display_name( ) ,
213
- equipped_item
214
- . map( |e| e. get_item( ) . item( ) . display_name( ) )
215
- . unwrap_or( "bare hands" ) ,
216
- ticks
217
- ) ;
218
210
Some ( Self {
219
211
position : block_pos,
220
212
drop_item : true ,
221
213
fake_finished : false ,
222
- total_ticks : ticks ,
223
- ticks_remaining : ticks ,
214
+ progress : 0.0 ,
215
+ damage ,
224
216
} )
225
217
}
218
+ /// Get the destroying progress.
226
219
pub fn destroy_stage ( & self ) -> u8 {
227
220
if self . fake_finished {
228
221
10
229
222
} else {
230
- 9 - ( self . ticks_remaining as f32 / self . total_ticks as f32 * 9.0 ) . round ( ) as u8
223
+ ( self . progress * 9.0 ) . round ( ) as u8
231
224
}
232
225
}
233
226
pub fn finish ( self ) -> FinishedBreaker {
0 commit comments