Skip to content

Commit 24a8a24

Browse files
committed
added superboom TNT as an item
added proper names and lore's for TNT and ender pearls.
1 parent 641629e commit 24a8a24

File tree

8 files changed

+100
-6
lines changed

8 files changed

+100
-6
lines changed

src/dungeon/dungeon.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::dungeon::items::magical_map::MagicalMap;
88
use crate::dungeon::items::pickaxe::Pickaxe;
99
use crate::dungeon::items::skyblock_menu::SkyblockMenu;
1010
use crate::dungeon::items::spirit_sceptre::SpiritSceptre;
11+
use crate::dungeon::items::superboom::SuperboomTNT;
1112
use crate::dungeon::items::tactical_insertion::TacticalInsertion;
1213
use crate::dungeon::map::DungeonMap;
1314
use crate::dungeon::room::room::{Room, RoomNeighbour, RoomSegment, RoomStatus};
@@ -207,6 +208,7 @@ impl WorldExtension for Dungeon {
207208
player.inventory.set_slot(37, Some(AspectOfTheVoid.into()));
208209
player.inventory.set_slot(38, Some(EnderPearl.into()));
209210
player.inventory.set_slot(39, Some(Pickaxe.into()));
211+
player.inventory.set_slot(40, Some(SuperboomTNT.into()));
210212
player.inventory.set_slot(41, Some(SpiritSceptre.into()));
211213
player.inventory.set_slot(42, Some(TacticalInsertion.into()));
212214
player.inventory.set_slot(44, Some(SkyblockMenu.into()));

src/dungeon/dungeon_player.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,19 @@ impl PlayerExtension for DungeonPlayer {
7676
let mut restore_block = false;
7777
match action {
7878
PlayerDiggingAction::StartDestroyBlock => {
79-
if let Some(item) = *player.inventory.get_hotbar_slot(player.held_slot as usize) {
79+
let held_item = *player.inventory.get_hotbar_slot(player.held_slot as usize);
80+
81+
// todo: use block toughness/tool to figure out, since blocks like grass can be broken instantly without pickaxe etc
82+
if let Some(item) = held_item {
8083
if matches!(item, DungeonItems::Pickaxe(_)) {
8184
restore_block = true;
8285
}
86+
87+
DungeonItem::on_start_dig(&item, player, position)
8388
}
8489

8590
if let Some(room_rc) = player.get_current_room() && player.world().has_started() {
86-
Room::attack_block(&room_rc, player, position);
91+
Room::on_start_dig(&room_rc, player, position);
8792
}
8893
}
8994
PlayerDiggingAction::FinishDestroyBlock => {

src/dungeon/items/dungeon_items.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ use crate::dungeon::items::magical_map::MagicalMap;
66
use crate::dungeon::items::pickaxe::Pickaxe;
77
use crate::dungeon::items::skyblock_menu::SkyblockMenu;
88
use crate::dungeon::items::spirit_sceptre::SpiritSceptre;
9+
use crate::dungeon::items::superboom::SuperboomTNT;
910
use crate::dungeon::items::tactical_insertion::TacticalInsertion;
1011
use enum_dispatch::enum_dispatch;
12+
use glam::IVec3;
1113
use server::inventory::item::Item;
1214
use server::inventory::item_stack::ItemStack;
1315
use server::player::packet_processing::BlockInteractResult;
@@ -17,6 +19,8 @@ use server::Player;
1719
pub trait DungeonItem {
1820

1921
fn on_interact(&self, player: &mut Player<DungeonPlayer>, block: Option<BlockInteractResult>);
22+
23+
fn on_start_dig(&self, _player: &mut Player<DungeonPlayer>, _position: IVec3) {}
2024

2125
fn item_stack(&self) -> ItemStack;
2226

@@ -32,6 +36,7 @@ pub enum DungeonItems {
3236
AspectOfTheVoid,
3337
SpiritSceptre,
3438
SkyblockMenu,
39+
SuperboomTNT,
3540
MagicalMap,
3641
EnderPearl,
3742
Hyperion,

src/dungeon/items/ender_pearl.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ use crate::dungeon::dungeon_player::DungeonPlayer;
33
use crate::dungeon::items::dungeon_items::DungeonItem;
44
use bevy_ecs::prelude::Component;
55
use glam::dvec3;
6+
use indoc::indoc;
67
use server::block::block_collision::check_block_collisions;
78
use server::constants::{ObjectVariant, Sound};
89
use server::entity::components::{EntityAppearance, EntityBehaviour};
910
use server::entity::entity::MinecraftEntity;
1011
use server::inventory::item_stack::ItemStack;
12+
use server::network::binary::nbt::NBT;
1113
use server::network::binary::var_int::VarInt;
1214
use server::network::packets::packet_buffer::PacketBuffer;
1315
use server::network::protocol::play::clientbound::{DestroyEntites, EntityTeleport, EntityVelocity, PositionLook, Relative, SpawnObject};
@@ -49,7 +51,16 @@ impl DungeonItem for EnderPearl {
4951
item: 368,
5052
stack_size: 16,
5153
metadata: 0,
52-
tag_compound: None,
54+
tag_compound: Some(NBT::with_nodes(vec![
55+
NBT::compound("display", vec![
56+
NBT::list_from_string("Lore", indoc! {r#"
57+
§8Collection Item
58+
59+
§f§lCOMMON
60+
"#}),
61+
NBT::string("Name", "§fEnder Pearl"),
62+
]),
63+
])),
5364
}
5465
}
5566
}

src/dungeon/items/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ pub mod hyperion;
77
pub mod skyblock_menu;
88
pub mod magical_map;
99
pub mod spirit_sceptre;
10-
pub mod tactical_insertion;
10+
pub mod tactical_insertion;
11+
pub mod superboom;

src/dungeon/items/superboom.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use crate::dungeon::dungeon_player::DungeonPlayer;
2+
use crate::dungeon::items::ability::Cooldown;
3+
use crate::dungeon::items::dungeon_items::DungeonItem;
4+
use glam::IVec3;
5+
use indoc::indoc;
6+
use server::constants::Sound;
7+
use server::inventory::item_stack::ItemStack;
8+
use server::network::binary::nbt::NBT;
9+
use server::player::packet_processing::BlockInteractResult;
10+
use server::Player;
11+
12+
#[derive(Copy, Clone, Hash, Eq, PartialEq)]
13+
pub struct SuperboomTNT;
14+
15+
impl DungeonItem for SuperboomTNT {
16+
17+
fn on_interact(&self, player: &mut Player<DungeonPlayer>, block: Option<BlockInteractResult>) {
18+
if let Some(block) = block {
19+
if player.item_cooldown(&SuperboomTNT.into()).is_some() {
20+
return;
21+
}
22+
23+
player.sync_inventory();
24+
player.play_sound_at(
25+
Sound::RandomExplode,
26+
1.0,
27+
0.8,
28+
block.position.as_dvec3()
29+
);
30+
31+
player.add_item_cooldown(&SuperboomTNT.into(), Cooldown::from_ticks(10, true))
32+
// get current room, iterate over crypts and walls and explode
33+
}
34+
}
35+
36+
fn on_start_dig(&self, player: &mut Player<DungeonPlayer>, position: IVec3) {
37+
if player.item_cooldown(&SuperboomTNT.into()).is_some() {
38+
return;
39+
}
40+
41+
player.play_sound_at(
42+
Sound::RandomExplode,
43+
1.0,
44+
0.8,
45+
position.as_dvec3()
46+
);
47+
48+
player.add_item_cooldown(&SuperboomTNT.into(), Cooldown::from_ticks(7, true))
49+
}
50+
51+
fn item_stack(&self) -> ItemStack {
52+
ItemStack {
53+
item: 46,
54+
stack_size: 64,
55+
metadata: 0,
56+
tag_compound: Some(NBT::with_nodes(vec![
57+
NBT::compound("display", vec![
58+
NBT::list_from_string("Lore", indoc! {r#"
59+
§7Breaks weak walls. Can be used to
60+
§7blow up Crypts in §cThe Catacombs and
61+
§5Crystal Hollows§7.
62+
63+
§9§lRARE
64+
"#}),
65+
NBT::string("Name", "§9Superboom TNT"),
66+
]),
67+
])),
68+
}
69+
}
70+
}

src/dungeon/items/tactical_insertion.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl DungeonItem for TacticalInsertion {
2323
yaw: player.yaw,
2424
pitch: player.pitch,
2525
});
26-
player.extension.add_item_cooldown(&TacticalInsertion.into(), Cooldown::from_seconds(20, false))
26+
player.add_item_cooldown(&TacticalInsertion.into(), Cooldown::from_seconds(20, false))
2727
}
2828

2929
fn item_stack(&self) -> ItemStack {

src/dungeon/room/room.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ impl Room {
242242
})
243243
}
244244

245-
pub fn attack_block(room_rc: &Rc<RefCell<Room>>, player: &mut Player<DungeonPlayer>, position: IVec3) {
245+
pub fn on_start_dig(room_rc: &Rc<RefCell<Room>>, player: &mut Player<DungeonPlayer>, position: IVec3) {
246246
if Self::try_open_door(room_rc, player, position) {
247247
return;
248248
}

0 commit comments

Comments
 (0)