Skip to content

Commit 6fb16a7

Browse files
committed
cleaned up dungeon breaker code
1 parent 94e4c6a commit 6fb16a7

File tree

7 files changed

+119
-69
lines changed

7 files changed

+119
-69
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,4 @@ codegen-units = 1
3535
lto = "thin"
3636

3737
[features]
38-
dungeon_breaker = []
38+
dungeon-breaker = []

server/src/player/player.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use glam::{dvec3, DVec3, IVec3, Vec3};
2424
use std::cell::UnsafeCell;
2525
use std::collections::HashMap;
2626
use std::f32::consts::PI;
27+
use std::ops::{Deref, DerefMut};
2728
use std::ptr::NonNull;
2829
use uuid::Uuid;
2930

@@ -286,6 +287,10 @@ impl<E : PlayerExtension> Player<E> {
286287
)
287288
}
288289

290+
pub fn get_held_item(&self) -> &Option<E::Item> {
291+
self.inventory.get_hotbar_slot(self.held_slot as usize)
292+
}
293+
289294
pub fn open_container(&mut self, mut container: OpenContainer<E>) {
290295
if matches!(*self.open_container.get_mut(), OpenContainer::Menu(_)) {
291296
self.write_packet(&clientbound::CloseWindow {
@@ -325,3 +330,17 @@ impl<E : PlayerExtension> Player<E> {
325330
}
326331
}
327332

333+
impl<P : PlayerExtension> Deref for Player<P> {
334+
type Target = P;
335+
336+
fn deref(&self) -> &Self::Target {
337+
&self.extension
338+
}
339+
}
340+
341+
impl<P : PlayerExtension> DerefMut for Player<P> {
342+
fn deref_mut(&mut self) -> &mut Self::Target {
343+
&mut self.extension
344+
}
345+
}
346+

src/dungeon/dungeon.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ impl WorldExtension for Dungeon {
149149
cooldowns: HashMap::new(),
150150
active_abilities: Cell::new(Vec::new()),
151151

152-
#[cfg(feature = "dungeon_breaker")]
152+
#[cfg(feature = "dungeon-breaker")]
153153
pickaxe_charges: 20,
154-
#[cfg(feature = "dungeon_breaker")]
154+
#[cfg(feature = "dungeon-breaker")]
155155
broken_blocks: vec![],
156156
}
157157
);

src/dungeon/dungeon_player.rs

Lines changed: 32 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,23 @@
11
use crate::dungeon::dungeon::{Dungeon, DungeonState};
22
use crate::dungeon::items::ability::{Ability, ActiveAbility, Cooldown};
3+
#[cfg(feature = "dungeon-breaker")]
4+
use crate::dungeon::items::dungeon_breaker::dungeon_breaker_dig;
35
use crate::dungeon::items::dungeon_items::DungeonItem;
46
use crate::dungeon::room::room::Room;
57
use chrono::Local;
6-
#[cfg(feature = "dungeon_breaker")]
7-
use glam::{dvec3, IVec3};
8+
use glam::IVec3;
89
use indoc::{formatdoc, indoc};
9-
#[cfg(feature = "dungeon_breaker")]
10-
use server::block::blocks::Blocks;
1110
use server::constants::PotionEffect;
1211
use server::inventory::item::get_item_stack;
1312
use server::inventory::item_stack::ItemStack;
1413
use server::network::protocol::play::clientbound::{AddEffect, BlockChange, Chat};
1514
use server::network::protocol::play::serverbound::PlayerDiggingAction;
1615
use server::player::packet_handling::BlockInteractResult;
1716
use server::player::sidebar::Sidebar;
18-
#[cfg(feature = "dungeon_breaker")]
19-
use server::types::aabb::AABB;
2017
use server::types::chat_component::ChatComponent;
2118
use server::types::direction::Direction;
2219
use server::{Player, PlayerExtension, World};
2320
use std::cell::{Cell, RefCell};
24-
#[cfg(feature = "dungeon_breaker")]
25-
use std::cmp::min;
2621
use std::collections::HashMap;
2722
use std::rc::Rc;
2823
use std::time::{SystemTime, UNIX_EPOCH};
@@ -38,10 +33,10 @@ pub struct DungeonPlayer {
3833
pub active_abilities: Cell<Vec<ActiveAbility>>,
3934
pub cooldowns: HashMap<DungeonItem, Cooldown>,
4035

41-
#[cfg(feature = "dungeon_breaker")]
36+
#[cfg(feature = "dungeon-breaker")]
4237
pub pickaxe_charges: usize,
43-
#[cfg(feature = "dungeon_breaker")]
44-
pub broken_blocks: Vec<(IVec3, Blocks, usize)>,
38+
#[cfg(feature = "dungeon-breaker")]
39+
pub broken_blocks: Vec<(IVec3, server::block::blocks::Blocks, usize)>,
4540

4641
}
4742

@@ -71,24 +66,24 @@ impl PlayerExtension for DungeonPlayer {
7166
DungeonPlayer::update_sidebar(player);
7267
}
7368

74-
let mut abilities = player.extension.active_abilities.take();
69+
let mut abilities = player.active_abilities.take();
7570
abilities.retain_mut(|active| {
7671
active.ticks_active += 1;
7772
active.ability.tick(active.ticks_active, player);
7873
active.ticks_active != active.ability.duration()
7974
});
80-
player.extension.active_abilities.set(abilities);
75+
player.active_abilities.set(abilities);
8176

82-
player.extension.cooldowns.retain(|_, cooldown| {
77+
player.cooldowns.retain(|_, cooldown| {
8378
cooldown.ticks_remaining -= 1;
8479
cooldown.ticks_remaining != 0
8580
});
8681

87-
#[cfg(feature = "dungeon_breaker")]
82+
#[cfg(feature = "dungeon-breaker")]
8883
{
8984
if player.ticks_existed.is_multiple_of(20) {
9085
if player.extension.pickaxe_charges != 20 {
91-
let min = min(20 - player.extension.pickaxe_charges, 2);
86+
let min = std::cmp::min(20 - player.extension.pickaxe_charges, 2);
9287
player.extension.pickaxe_charges += min;
9388
}
9489
}
@@ -107,7 +102,7 @@ impl PlayerExtension for DungeonPlayer {
107102

108103
fn dig(player: &mut Player<Self>, position: IVec3, action: &PlayerDiggingAction) {
109104

110-
#[cfg(not(feature = "dungeon_breaker"))]
105+
#[cfg(not(feature = "dungeon-breaker"))]
111106
{
112107
let mut restore_block = false;
113108
match action {
@@ -136,52 +131,26 @@ impl PlayerExtension for DungeonPlayer {
136131
}
137132
}
138133

139-
#[cfg(feature = "dungeon_breaker")]
134+
#[cfg(feature = "dungeon-breaker")]
140135
{
141-
let world = &mut player.world_mut();
142-
143-
let can_break = world.has_started() && player.extension.pickaxe_charges != 0;
144-
if matches!(action, PlayerDiggingAction::StartDestroyBlock) && can_break {
145-
146-
let opened_door = DungeonPlayer::try_open_door(player, world, &position);
147-
let held_slot = player.inventory.get_hotbar_slot(player.held_slot as usize);
148-
149-
if !opened_door && matches!(held_slot, Some(DungeonItem::Pickaxe)) {
150-
let chunk_grid = &mut world.chunk_grid;
151-
152-
let block_aabb = AABB::new(
153-
position.as_dvec3() + dvec3(-0.75, -0.75, -0.75),
154-
position.as_dvec3() + dvec3(1.5, 1.5, 1.5),
155-
);
156-
157-
if let Some((room_rc, _)) = &player.extension.current_room {
158-
let room = room_rc.borrow();
159-
160-
// check if room doesn't allow, check if overlaps with secrets
161-
162-
let mut volume_inside = 0.0;
136+
let world = player.world_mut();
163137

164-
for bounds in room.room_bounds.iter() {
165-
volume_inside += block_aabb.intersection_volume(&bounds.aabb);
166-
}
167-
// if volume doesn't match, that means the block is likely on the border
168-
if block_aabb.volume() == volume_inside {
169-
let previous = chunk_grid.get_block_at(position.x, position.y, position.z);
170-
player.extension.broken_blocks.push((position, previous, 200));
171-
172-
chunk_grid.set_block_at(Blocks::Air, position.x, position.y, position.z);
173-
player.extension.pickaxe_charges -= 1;
174-
return;
175-
}
176-
}
177-
}
138+
// try open doors with left click before continuing with dungeon breaker
139+
if DungeonPlayer::try_open_door(player, world, &position) {
140+
return;
178141
}
179142

180-
let block = world.chunk_grid.get_block_at(position.x, position.y, position.z);
181-
player.write_packet(&BlockChange {
182-
block_pos: position,
183-
block_state: block.get_block_state_id(),
184-
})
143+
if !dungeon_breaker_dig(player, world, position, action) {
144+
let block = world.chunk_grid.get_block_at(
145+
position.x,
146+
position.y,
147+
position.z
148+
);
149+
player.write_packet(&BlockChange {
150+
block_pos: position,
151+
block_state: block.get_block_state_id(),
152+
})
153+
}
185154
}
186155
}
187156

@@ -238,7 +207,7 @@ impl DungeonPlayer {
238207
}
239208

240209
pub fn ready(player: &mut Player<Self>) {
241-
player.extension.is_ready = !player.extension.is_ready;
210+
player.is_ready = !player.is_ready;
242211
Dungeon::update_ready_status(player.world_mut(), player);
243212
}
244213

@@ -360,15 +329,14 @@ impl DungeonPlayer {
360329
score = "0",
361330
});
362331

363-
// if cfg!(feature = "dungeon_breaker") {
364-
#[cfg(feature = "dungeon_breaker")]
365-
sidebar.push(&format!{r#"
332+
// temp
333+
#[cfg(feature = "dungeon-breaker")]
334+
sidebar.push(&formatdoc!{r#"
366335
charges {charges}
367336
368337
"#,
369338
charges = player.extension.pickaxe_charges,
370339
});
371-
// }
372340

373341
if world.players.len() == 1 {
374342
sidebar.push(indoc! {r#"
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use crate::dungeon::dungeon::Dungeon;
2+
use crate::dungeon::dungeon_player::DungeonPlayer;
3+
use crate::dungeon::items::dungeon_items::DungeonItem;
4+
use glam::{dvec3, IVec3};
5+
use server::block::blocks::Blocks;
6+
use server::network::protocol::play::serverbound::PlayerDiggingAction;
7+
use server::types::aabb::AABB;
8+
use server::{Player, World};
9+
10+
// if returns false should
11+
pub fn dungeon_breaker_dig(
12+
player: &mut Player<DungeonPlayer>,
13+
world: &mut World<Dungeon>,
14+
position: IVec3,
15+
action: &PlayerDiggingAction,
16+
) -> bool {
17+
18+
if !matches!(action, PlayerDiggingAction::StartDestroyBlock) {
19+
return false
20+
}
21+
22+
if !world.has_started() || player.pickaxe_charges == 0 {
23+
return false
24+
}
25+
26+
if matches!(player.get_held_item(), Some(DungeonItem::Pickaxe)) {
27+
let Some((room_rc, _)) = &player.extension.current_room else {
28+
// not in room
29+
return false
30+
};
31+
32+
let chunk_grid = &mut world.chunk_grid;
33+
let room = room_rc.borrow();
34+
35+
let block_aabb = AABB::new(
36+
position.as_dvec3() + dvec3(-0.75, -0.75, -0.75),
37+
position.as_dvec3() + dvec3(1.5, 1.5, 1.5),
38+
);
39+
40+
41+
// check if room doesn't allow, check if overlaps with secrets
42+
43+
let mut volume_inside = 0.0;
44+
45+
for bounds in room.room_bounds.iter() {
46+
volume_inside += block_aabb.intersection_volume(&bounds.aabb);
47+
}
48+
49+
if block_aabb.volume() == volume_inside {
50+
let previous = chunk_grid.get_block_at(position.x, position.y, position.z);
51+
player.extension.broken_blocks.push((position, previous, 200));
52+
53+
chunk_grid.set_block_at(Blocks::Air, position.x, position.y, position.z);
54+
player.extension.pickaxe_charges -= 1;
55+
return true;
56+
}
57+
}
58+
59+
false
60+
}

src/dungeon/items/dungeon_items.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ impl Item for DungeonItem {
128128
NBT::byte("HideFlags", 127),
129129
])),
130130
},
131-
DungeonItem::Pickaxe => if cfg!(feature = "dungeon_breaker") {
131+
DungeonItem::Pickaxe => if cfg!(feature = "dungeon-breaker") {
132132
ItemStack {
133133
item: 278,
134134
stack_size: 1,

src/dungeon/items/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
pub mod dungeon_items;
22
pub mod ability;
33
mod etherwarp;
4-
mod instant_transmission;
4+
mod instant_transmission;
5+
6+
#[cfg(feature = "dungeon-breaker")]
7+
pub mod dungeon_breaker;

0 commit comments

Comments
 (0)