aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/Silverfish.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/Silverfish.cpp')
-rw-r--r--Minecraft.World/Silverfish.cpp211
1 files changed, 211 insertions, 0 deletions
diff --git a/Minecraft.World/Silverfish.cpp b/Minecraft.World/Silverfish.cpp
new file mode 100644
index 00000000..117dc41b
--- /dev/null
+++ b/Minecraft.World/Silverfish.cpp
@@ -0,0 +1,211 @@
+#include "stdafx.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.world.phys.h"
+#include "net.minecraft.world.damagesource.h"
+#include "net.minecraft.h"
+#include "..\Minecraft.Client\Textures.h"
+#include "Silverfish.h"
+#include "SoundTypes.h"
+
+
+
+Silverfish::Silverfish(Level *level) : Monster( 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();
+
+ // 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
+ health = getMaxHealth();
+
+ this->textureIdx = TN_MOB_SILVERFISH;// 4J was "/mob/silverfish.png";
+ this->setSize(0.3f, 0.7f);
+ runSpeed = 0.6f;
+
+ // 4J - Brought forward damage from 1.2.3
+ attackDamage = 1;
+}
+
+int Silverfish::getMaxHealth()
+{
+ return 8;
+}
+
+bool Silverfish::makeStepSound()
+{
+ return false;
+}
+
+shared_ptr<Entity> Silverfish::findAttackTarget()
+{
+#ifndef _FINAL_BUILD
+ if(app.GetMobsDontAttackEnabled())
+ {
+ return shared_ptr<Player>();
+ }
+#endif
+
+ double maxDist = 8;
+ return level->getNearestAttackablePlayer(shared_from_this(), maxDist);
+}
+
+int Silverfish::getAmbientSound()
+{
+ // 4J - brought sound change forward from 1.2.3
+ return eSoundType_MOB_SILVERFISH_AMBIENT;
+}
+
+int Silverfish::getHurtSound()
+{
+ // 4J - brought sound change forward from 1.2.3
+ return eSoundType_MOB_SILVERFISH_HURT;
+}
+
+int Silverfish::getDeathSound()
+{
+ // 4J - brought sound change forward from 1.2.3
+ return eSoundType_MOB_SILVERFISH_DEATH;
+}
+
+
+bool Silverfish::hurt(DamageSource *source, int dmg)
+{
+ if (lookForFriends <= 0 && (dynamic_cast<EntityDamageSource *>(source) != NULL || source == DamageSource::magic))
+ {
+ // look for friends
+ lookForFriends = 20;
+ }
+ return Monster::hurt(source, dmg);
+}
+
+void Silverfish::checkHurtTarget(shared_ptr<Entity> target, float d)
+{
+
+ // super.checkHurtTarget(target, d);
+ if (attackTime <= 0 && d < 1.2f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1)
+ {
+ attackTime = 20;
+ DamageSource *damageSource = DamageSource::mobAttack( dynamic_pointer_cast<Mob>( shared_from_this() ) );
+ target->hurt(damageSource, attackDamage);
+ delete damageSource;
+ }
+
+}
+
+void Silverfish::playStepSound(int xt, int yt, int zt, int t)
+{
+ level->playSound(shared_from_this(), eSoundType_MOB_SILVERFISH_STEP, 1, 1);
+}
+
+int Silverfish::getDeathLoot()
+{
+ return 0;
+}
+
+void Silverfish::tick()
+{
+ // rotate the whole body to the same angle as the head
+ yBodyRot = yRot;
+
+ Monster::tick();
+}
+
+void Silverfish::serverAiStep()
+{
+ Monster::serverAiStep();
+
+ if (level->isClientSide)
+ {
+ return;
+ }
+
+ if (lookForFriends > 0)
+ {
+ lookForFriends--;
+ if (lookForFriends == 0)
+ {
+ // see if there are any friendly monster eggs nearby
+ int baseX = Mth::floor(x);
+ int baseY = Mth::floor(y);
+ int baseZ = Mth::floor(z);
+ bool doBreak = false;
+
+ for (int yOff = 0; !doBreak && yOff <= 5 && yOff >= -5; yOff = (yOff <= 0) ? 1 - yOff : 0 - yOff)
+ {
+ for (int xOff = 0; !doBreak && xOff <= 10 && xOff >= -10; xOff = (xOff <= 0) ? 1 - xOff : 0 - xOff)
+ {
+ for (int zOff = 0; !doBreak && zOff <= 10 && zOff >= -10; zOff = (zOff <= 0) ? 1 - zOff : 0 - zOff)
+ {
+ int tile = level->getTile(baseX + xOff, baseY + yOff, baseZ + zOff);
+ if (tile == Tile::monsterStoneEgg_Id)
+ {
+ level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, baseX + xOff, baseY + yOff, baseZ + zOff,
+ Tile::monsterStoneEgg_Id + (level->getData(baseX + xOff, baseY + yOff, baseZ + zOff) << Tile::TILE_NUM_SHIFT));
+ level->setTile(baseX + xOff, baseY + yOff, baseZ + zOff, 0);
+ Tile::monsterStoneEgg->destroy(level, baseX + xOff, baseY + yOff, baseZ + zOff, 0);
+
+ if (random->nextBoolean())
+ {
+ doBreak = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (attackTarget == NULL && !isPathFinding())
+ {
+ // if the silverfish isn't doing anything special, it will merge
+ // with any rock tile it is nearby
+ int tileX = Mth::floor(x), tileY = Mth::floor(y + .5f), tileZ = Mth::floor(z);
+ int facing = random->nextInt(6);
+
+ int tile = level->getTile(tileX + Facing::STEP_X[facing], tileY + Facing::STEP_Y[facing], tileZ + Facing::STEP_Z[facing]);
+ if (StoneMonsterTile::isCompatibleHostBlock(tile))
+ {
+ level->setTileAndData(tileX + Facing::STEP_X[facing], tileY + Facing::STEP_Y[facing], tileZ + Facing::STEP_Z[facing], Tile::monsterStoneEgg_Id, StoneMonsterTile::getDataForHostBlock(tile));
+ spawnAnim();
+ remove();
+ }
+ else
+ {
+ findRandomStrollLocation();
+ }
+
+ }
+ else if (attackTarget != NULL && !isPathFinding())
+ {
+ attackTarget = nullptr;
+ }
+}
+
+float Silverfish::getWalkTargetValue(int x, int y, int z)
+{
+ // silverfish LOVES stone =)
+ if (level->getTile(x, y - 1, z) == Tile::rock_Id) return 10;
+ return Monster::getWalkTargetValue(x, y, z);
+}
+
+bool Silverfish::isDarkEnoughToSpawn()
+{
+ return true;
+}
+
+bool Silverfish::canSpawn()
+{
+ if (Monster::canSpawn())
+ {
+ shared_ptr<Player> nearestPlayer = level->getNearestPlayer(shared_from_this(), 5.0);
+ return nearestPlayer == NULL;
+ }
+ return false;
+}
+
+MobType Silverfish::getMobType()
+{
+ return ARTHROPOD;
+} \ No newline at end of file