4jcraft/Minecraft.World/Blocks/MusicTile.cpp
2026-03-13 17:06:56 -05:00

86 lines
2.9 KiB
C++

#include "../Platform/stdafx.h"
#include "../Headers/net.minecraft.world.level.h"
#include "../Headers/net.minecraft.world.level.tile.entity.h"
#include "MusicTile.h"
#include "../Util/SoundTypes.h"
MusicTile::MusicTile(int id) : EntityTile(id, Material::wood) {}
void MusicTile::neighborChanged(Level* level, int x, int y, int z, int type) {
app.DebugPrintf("-------- Neighbour changed type %d\n", type);
bool signal = level->hasNeighborSignal(x, y, z);
std::shared_ptr<MusicTileEntity> mte =
std::dynamic_pointer_cast<MusicTileEntity>(
level->getTileEntity(x, y, z));
app.DebugPrintf("-------- Signal is %s, tile is currently %s\n",
signal ? "TRUE" : "FALSE", mte->on ? "ON" : "OFF");
if (mte != NULL && mte->on != signal) {
if (signal) {
mte->playNote(level, x, y, z);
}
mte->on = signal;
}
}
// 4J-PB - Adding a TestUse for tooltip display
bool MusicTile::TestUse() { return true; }
bool MusicTile::use(Level* level, int x, int y, int z,
std::shared_ptr<Player> player, int clickedFace,
float clickX, float clickY, float clickZ,
bool soundOnly /*=false*/) // 4J added soundOnly param
{
if (soundOnly) return false;
if (level->isClientSide) return true;
std::shared_ptr<MusicTileEntity> mte =
std::dynamic_pointer_cast<MusicTileEntity>(
level->getTileEntity(x, y, z));
if (mte != NULL) {
mte->tune();
mte->playNote(level, x, y, z);
}
return true;
}
void MusicTile::attack(Level* level, int x, int y, int z,
std::shared_ptr<Player> player) {
if (level->isClientSide) return;
std::shared_ptr<MusicTileEntity> mte =
std::dynamic_pointer_cast<MusicTileEntity>(
level->getTileEntity(x, y, z));
if (mte != NULL) mte->playNote(level, x, y, z);
}
std::shared_ptr<TileEntity> MusicTile::newTileEntity(Level* level) {
return std::shared_ptr<MusicTileEntity>(new MusicTileEntity());
}
void MusicTile::triggerEvent(Level* level, int x, int y, int z, int i,
int note) {
float pitch = (float)pow(2, (note - 12) / 12.0);
int iSound;
switch (i) {
case 1:
iSound = eSoundType_NOTE_BD;
break;
case 2:
iSound = eSoundType_NOTE_SNARE;
break;
case 3:
iSound = eSoundType_NOTE_HAT;
break;
case 4:
iSound = eSoundType_NOTE_BASSATTACK;
break;
default:
iSound = eSoundType_NOTE_HARP;
break;
}
app.DebugPrintf("MusicTile::triggerEvent - playSound - pitch = %f\n",
pitch);
level->playSound(x + 0.5, y + 0.5, z + 0.5, iSound, 3, pitch);
level->addParticle(eParticleType_note, x + 0.5, y + 1.2, z + 0.5,
note / 24.0, 0, 0);
}