From f5d24746d662f12b0446d82b0e49f7dec495c748 Mon Sep 17 00:00:00 2001 From: Mat Date: Mon, 23 Mar 2020 15:45:09 +0200 Subject: [PATCH] Jukebox improvements (#4537) * Add jukebox block handler Co-authored-by: peterbell10 --- src/BlockEntities/JukeboxEntity.cpp | 26 +++++++++++++++++---- src/BlockEntities/JukeboxEntity.h | 1 + src/Blocks/BlockHandler.cpp | 3 ++- src/Blocks/BlockJukebox.h | 36 +++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 src/Blocks/BlockJukebox.h diff --git a/src/BlockEntities/JukeboxEntity.cpp b/src/BlockEntities/JukeboxEntity.cpp index a4905cab2..9efd4f0ac 100644 --- a/src/BlockEntities/JukeboxEntity.cpp +++ b/src/BlockEntities/JukeboxEntity.cpp @@ -1,6 +1,9 @@ +// JukeboxEntity.cpp + +// Implements the cJukeboxEntity class representing a single jukebox in the world + #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules - #include "JukeboxEntity.h" #include "../World.h" #include "../EffectID.h" @@ -23,6 +26,21 @@ cJukeboxEntity::cJukeboxEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Ve cJukeboxEntity::~cJukeboxEntity() { + if (m_World && IsPlayingRecord()) + { + // Stop playing music when destroyed by any means + m_World->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_PLAY_MUSIC_DISC, GetPos(), 0); + } +} + + + + + +void cJukeboxEntity::Destroy(void) +{ + ASSERT(m_World != nullptr); + EjectRecord(); } @@ -50,7 +68,7 @@ bool cJukeboxEntity::UsedBy(cPlayer * a_Player) else { const cItem & HeldItem = a_Player->GetEquippedItem(); - if (PlayRecord(HeldItem.m_ItemType)) + if (PlayRecord(HeldItem.m_ItemType) && !a_Player->IsGameModeCreative()) { a_Player->GetInventory().RemoveOneEquippedItem(); return true; @@ -96,9 +114,9 @@ bool cJukeboxEntity::EjectRecord(void) cItems Drops; Drops.push_back(cItem(static_cast(m_Record), 1, 0)); m_Record = 0; - m_World->SpawnItemPickups(Drops, Vector3d(0.5, 1, 0.5) + m_Pos, 8); - m_World->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_PLAY_MUSIC_DISC, GetPos(), 0); + m_World->SpawnItemPickups(Drops, Vector3d(0.5, 0.5, 0.5) + m_Pos, 10); m_World->SetBlockMeta(m_Pos, E_META_JUKEBOX_OFF); + m_World->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_PLAY_MUSIC_DISC, GetPos(), 0); return true; } diff --git a/src/BlockEntities/JukeboxEntity.h b/src/BlockEntities/JukeboxEntity.h index 315d1ddda..2fbd916eb 100644 --- a/src/BlockEntities/JukeboxEntity.h +++ b/src/BlockEntities/JukeboxEntity.h @@ -46,6 +46,7 @@ public: // tolua_export // tolua_end // cBlockEntity overrides: + virtual void Destroy(void) override; virtual void CopyFrom(const cBlockEntity & a_Src) override; virtual bool UsedBy(cPlayer * a_Player) override; virtual void SendTo(cClientHandle &) override {} diff --git a/src/Blocks/BlockHandler.cpp b/src/Blocks/BlockHandler.cpp index a865bce63..60241b0ae 100644 --- a/src/Blocks/BlockHandler.cpp +++ b/src/Blocks/BlockHandler.cpp @@ -45,6 +45,7 @@ #include "BlockMobHead.h" #include "BlockHopper.h" #include "BlockIce.h" +#include "BlockJukebox.h" #include "BlockLadder.h" #include "BlockLeaves.h" #include "BlockLilypad.h" @@ -259,7 +260,7 @@ static cBlockHandler * CreateBlockHandler(BLOCKTYPE a_BlockType) case E_BLOCK_IRON_ORE: return new cBlockOreHandler (a_BlockType); case E_BLOCK_IRON_TRAPDOOR: return new cBlockTrapdoorHandler (a_BlockType); case E_BLOCK_JACK_O_LANTERN: return new cBlockPumpkinHandler (a_BlockType); - case E_BLOCK_JUKEBOX: return new cBlockEntityHandler (a_BlockType); + case E_BLOCK_JUKEBOX: return new cBlockJukeboxHandler (a_BlockType); case E_BLOCK_JUNGLE_DOOR: return new cBlockDoorHandler (a_BlockType); case E_BLOCK_JUNGLE_FENCE: return new cBlockFenceHandler (a_BlockType); case E_BLOCK_JUNGLE_FENCE_GATE: return new cBlockFenceGateHandler (a_BlockType); diff --git a/src/Blocks/BlockJukebox.h b/src/Blocks/BlockJukebox.h new file mode 100644 index 000000000..22b02a2c7 --- /dev/null +++ b/src/Blocks/BlockJukebox.h @@ -0,0 +1,36 @@ + +#pragma once + +#include "BlockEntity.h" +#include "Mixins.h" + + + + + +class cBlockJukeboxHandler : + public cClearMetaOnDrop +{ + using super = cClearMetaOnDrop; + +public: + + cBlockJukeboxHandler(BLOCKTYPE a_BlockType): + super(a_BlockType) + { + } + + + + + + virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) override + { + UNUSED(a_Meta); + return 6; + } +} ; + + + +