Files
minecraft-pe-0.6.1/src/world/entity/monster/Skeleton.cpp
2026-03-02 22:04:18 +03:00

108 lines
2.8 KiB
C++
Executable File

#include "Skeleton.h"
#include "../projectile/Arrow.h"
Skeleton::Skeleton( Level* level )
: super(level),
bow(Item::bow, 1),
fireCheckTick(0)
{
entityRendererId = ER_SKELETON_RENDERER;
this->textureName = "mob/skeleton.png";
}
int Skeleton::getMaxHealth() {
return 10; // 15
}
void Skeleton::aiStep() {
if ((++fireCheckTick & 1) && level->isDay() && !level->isClientSide) {
float br = getBrightness(1);
if (br > 0.5f) {
if (level->canSeeSky(Mth::floor(x), Mth::floor(y), Mth::floor(z)) && random.nextFloat() * 3.5f < (br - 0.4f)) {
hurt(NULL, 1);
for (int i = 0; i < 5; ++i) {
float xa = (2.0f * random.nextFloat() - 1.0f) * (2.0f * random.nextFloat() - 1.0f) * 0.02f;
float ya = (2.0f * random.nextFloat() - 1.0f) * (2.0f * random.nextFloat() - 1.0f) * 0.02f;
float za = (2.0f * random.nextFloat() - 1.0f) * (2.0f * random.nextFloat() - 1.0f) * 0.02f;
level->addParticle(PARTICLETYPE(explode), x + random.nextFloat() * bbWidth * 2 - bbWidth, y + random.nextFloat() * bbHeight, z + random.nextFloat() * bbWidth * 2 - bbWidth, xa, ya, za);
}
//setOnFire(8); //@todo
}
}
}
super::aiStep();
}
int Skeleton::getDeathLoot() {
return Item::arrow->id;
}
ItemInstance* Skeleton::getCarriedItem() {
return &bow;
}
int Skeleton::getEntityTypeId() const {
return MobTypes::Skeleton;
}
const char* Skeleton::getAmbientSound() {
return "mob.skeleton";
}
std::string Skeleton::getHurtSound() {
return "mob.skeletonhurt";
}
std::string Skeleton::getDeathSound() {
return "mob.skeletonhurt";
}
void Skeleton::checkHurtTarget( Entity* target, float d ) {
if (d < 10) {
float xd = target->x - x;
float zd = target->z - z;
if (attackTime == 0) {
Arrow* arrow = new Arrow(level, this, 1);
// arrow.y += 1.4f;
float yd = (target->y + target->getHeadHeight() - 0.7f) - arrow->y;
float yo = Mth::sqrt(xd * xd + zd * zd) * 0.2f;
level->playSound(this, "random.bow", 1.0f, 1 / (random.nextFloat() * 0.4f + 0.8f));
level->addEntity(arrow);
arrow->shoot(xd, yd + yo, zd, 1.60f, 32);
attackTime = SharedConstants::TicksPerSecond * 3;
}
yRot = (float) (std::atan2(zd, xd) * Mth::RADDEG) - 90;
holdGround = true;
}
}
void Skeleton::dropDeathLoot( /*bool wasKilledByPlayer, int playerBonusLevel*/ ) {
// drop some arrows
int count = random.nextInt(3 /*+ playerBonusLevel*/);
for (int i = 0; i < count; i++) {
spawnAtLocation(Item::arrow->id, 1);
}
// and some bones
count = random.nextInt(3 /*+ playerBonusLevel*/);
for (int i = 0; i < count; i++) {
spawnAtLocation(Item::bone->id, 1);
}
}
int Skeleton::getUseDuration() {
return attackTime;
}
/*@Override*/
// MobType getMobType() {
// return MobType.UNDEAD;
// }