4jcraft/Minecraft.World/Entities/Mobs/PrimedTnt.cpp
2026-03-13 17:06:56 -05:00

88 lines
1.8 KiB
C++

#include "../../Platform/stdafx.h"
#include "../../Util/JavaMath.h"
#include "../../Headers/com.mojang.nbt.h"
#include "../../Headers/net.minecraft.world.level.h"
#include "PrimedTnt.h"
void PrimedTnt::_init() {
life = 0;
// Original Java Ctor
blocksBuilding = true;
setSize(0.98f, 0.98f);
heightOffset = bbHeight / 2.0f;
}
PrimedTnt::PrimedTnt(Level* level) : Entity(level) {
// 4J Stu - This function call had to be moved here from the Entity ctor to
// ensure that the derived version of the function is called
this->defineSynchedData();
_init();
}
PrimedTnt::PrimedTnt(Level* level, double x, double y, double z)
: Entity(level) {
_init();
setPos(x, y, z);
float rot = (float)(Math::random() * PI * 2);
xd = -sin(rot) * 0.02f;
yd = +0.2f;
zd = -cos(rot) * 0.02f;
life = 80;
xo = x;
yo = y;
zo = z;
}
void PrimedTnt::defineSynchedData() {}
bool PrimedTnt::makeStepSound() { return false; }
bool PrimedTnt::isPickable() { return !removed; }
void PrimedTnt::tick() {
xo = x;
yo = y;
zo = z;
yd -= 0.04f;
move(xd, yd, zd);
xd *= 0.98f;
yd *= 0.98f;
zd *= 0.98f;
if (onGround) {
xd *= 0.7f;
zd *= 0.7f;
yd *= -0.5f;
}
if (life-- <= 0) {
remove();
if (!level->isClientSide) {
explode();
}
} else {
level->addParticle(eParticleType_smoke, x, y + 0.5f, z, 0, 0, 0);
}
}
void PrimedTnt::explode() {
float r = 4.0f;
level->explode(nullptr, x, y, z, r, true);
}
void PrimedTnt::addAdditonalSaveData(CompoundTag* entityTag) {
entityTag->putByte(L"Fuse", (uint8_t)life);
}
void PrimedTnt::readAdditionalSaveData(CompoundTag* tag) {
life = tag->getByte(L"Fuse");
}
float PrimedTnt::getShadowHeightOffs() { return 0; }