forked from Kolyah35/minecraft-pe-0.6.1
108 lines
2.8 KiB
C++
Executable File
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;
|
|
// }
|