aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/Squid.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/Squid.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/Squid.cpp')
-rw-r--r--Minecraft.World/Squid.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/Minecraft.World/Squid.cpp b/Minecraft.World/Squid.cpp
new file mode 100644
index 00000000..3e36777c
--- /dev/null
+++ b/Minecraft.World/Squid.cpp
@@ -0,0 +1,189 @@
+using namespace std;
+
+#include "stdafx.h"
+#include "com.mojang.nbt.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.world.phys.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.item.h"
+#include "SharedConstants.h"
+#include "Squid.h"
+#include "..\Minecraft.Client\Textures.h"
+
+
+
+void Squid::_init()
+{
+ xBodyRot = xBodyRotO = 0.0f;
+ zBodyRot = zBodyRotO = 0.0f;
+
+ tentacleMovement = oldTentacleMovement = 0.0f;
+ tentacleAngle = oldTentacleAngle = 0.0f;
+
+ speed = 0.0f;
+ tentacleSpeed = 0.0f;
+ rotateSpeed = 0.0f;
+
+ tx = ty = tz = 0.0f;
+}
+
+Squid::Squid(Level *level) : WaterAnimal( 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();
+
+ _init();
+ this->textureIdx = TN_MOB_SQUID; // 4J - was L"/mob/squid.png";
+ this->setSize(0.95f, 0.95f);
+ tentacleSpeed = 1 / (random->nextFloat() + 1) * 0.2f;
+}
+
+int Squid::getMaxHealth()
+{
+ return 10;
+}
+
+int Squid::getAmbientSound()
+{
+ return -1;
+}
+
+int Squid::getHurtSound()
+{
+ return -1;
+}
+
+int Squid::getDeathSound()
+{
+ return -1;
+}
+
+float Squid::getSoundVolume()
+{
+ return 0.4f;
+}
+
+int Squid::getDeathLoot()
+{
+ return 0;
+}
+
+void Squid::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel)
+{
+ int count = random->nextInt(3 + playerBonusLevel) + 1;
+ for (int i = 0; i < count; i++)
+ {
+ spawnAtLocation(shared_ptr<ItemInstance>( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLACK) ), 0.0f);
+ }
+}
+
+bool Squid::isInWater()
+{
+ return level->checkAndHandleWater(bb->grow(0, -0.6f, 0), Material::water, shared_from_this() );
+}
+
+void Squid::aiStep()
+{
+ WaterAnimal::aiStep();
+
+ xBodyRotO = xBodyRot;
+ zBodyRotO = zBodyRot;
+
+ oldTentacleMovement = tentacleMovement;
+ oldTentacleAngle = tentacleAngle;
+
+ tentacleMovement += tentacleSpeed;
+ if (tentacleMovement > (float) PI * 2.0f)
+ {
+ tentacleMovement -= (float) PI * 2.0f;
+ if (random->nextInt(10) == 0) tentacleSpeed = 1 / (random->nextFloat() + 1) * 0.2f;
+ }
+
+ if (isInWater())
+ {
+ if (tentacleMovement < PI)
+ {
+ float tentacleScale = tentacleMovement / PI;
+ tentacleAngle = Mth::sin(tentacleScale * tentacleScale * PI) * PI * 0.25f;
+
+ if (tentacleScale > .75)
+ {
+ speed = 1.0f;
+ rotateSpeed = 1.0f;
+ }
+ else
+ {
+ rotateSpeed = rotateSpeed * 0.8f;
+ }
+ }
+ else
+ {
+ tentacleAngle = 0.0f;
+ speed = speed * 0.9f;
+ rotateSpeed = rotateSpeed * 0.99f;
+ }
+
+ if (!level->isClientSide)
+ {
+ xd = tx * speed;
+ yd = ty * speed;
+ zd = tz * speed;
+ }
+
+ double horizontalMovement = sqrt(xd * xd + zd * zd);
+
+ yBodyRot += ((-(float) atan2(this->xd, this->zd) * 180 / PI) - yBodyRot) * 0.1f;
+ yRot = yBodyRot;
+ zBodyRot = zBodyRot + (float) PI * rotateSpeed * 1.5f;
+ xBodyRot += ((-(float) atan2(horizontalMovement, this->yd) * 180 / PI) - xBodyRot) * 0.1f;
+ }
+ else
+ {
+ tentacleAngle = Mth::abs(Mth::sin(tentacleMovement)) * PI * 0.25f;
+
+ if (!level->isClientSide)
+ {
+ // unable to move, apply gravity
+ xd = 0.0f;
+ yd -= 0.08;
+ yd *= 0.98f;
+ zd = 0.0f;
+ }
+
+ // fall over
+ xBodyRot += (-90 - xBodyRot) * 0.02f;
+ }
+}
+
+void Squid::travel(float xa, float ya)
+{
+ move(xd, yd, zd);
+}
+
+void Squid::serverAiStep()
+{
+ noActionTime++;
+
+ // ridiculous simple movement ai
+ if (noActionTime > SharedConstants::TICKS_PER_SECOND * 5)
+ {
+ tx = ty = tz = 0;
+ }
+ else if (random->nextInt(50) == 0 || !wasInWater || (tx == 0 && ty == 0 && tz == 0))
+ {
+ float angle = random->nextFloat() * PI * 2.0f;
+ tx = Mth::cos(angle) * 0.2f;
+ ty = -0.1f + random->nextFloat() * 0.2f;
+ tz = Mth::sin(angle) * 0.2f;
+ }
+ checkDespawn(); // 4J - 1.7.0 fix
+}
+
+bool Squid::canSpawn()
+{
+ return y > 45 && y < level->seaLevel && WaterAnimal::canSpawn();
+}