aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/CompassTexture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/CompassTexture.cpp')
-rw-r--r--Minecraft.Client/CompassTexture.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/Minecraft.Client/CompassTexture.cpp b/Minecraft.Client/CompassTexture.cpp
new file mode 100644
index 00000000..93d6a62c
--- /dev/null
+++ b/Minecraft.Client/CompassTexture.cpp
@@ -0,0 +1,142 @@
+#include "stdafx.h"
+#include "Minecraft.h"
+#include "..\Minecraft.World\net.minecraft.world.level.h"
+#include "..\Minecraft.World\net.minecraft.world.level.dimension.h"
+#include "MultiplayerLocalPlayer.h"
+#include "..\Minecraft.World\JavaMath.h"
+#include "Texture.h"
+#include "CompassTexture.h"
+
+CompassTexture *CompassTexture::instance = NULL;
+
+CompassTexture::CompassTexture() : StitchedTexture(L"compass")
+{
+ instance = this;
+
+ m_dataTexture = NULL;
+ m_iPad = XUSER_INDEX_ANY;
+
+ rot = rota = 0.0;
+}
+
+CompassTexture::CompassTexture(int iPad, CompassTexture *dataTexture) : StitchedTexture(L"compass")
+{
+ m_dataTexture = dataTexture;
+ m_iPad = iPad;
+
+ rot = rota = 0.0;
+}
+
+void CompassTexture::cycleFrames()
+{
+ Minecraft *mc = Minecraft::GetInstance();
+
+ if (m_iPad >= 0 && m_iPad < XUSER_MAX_COUNT && mc->level != NULL && mc->localplayers[m_iPad] != NULL)
+ {
+ updateFromPosition(mc->localplayers[m_iPad]->level, mc->localplayers[m_iPad]->x, mc->localplayers[m_iPad]->z, mc->localplayers[m_iPad]->yRot, false, false);
+ }
+ else
+ {
+ frame = 1;
+ updateFromPosition(NULL, 0, 0, 0, false, true);
+ }
+}
+
+void CompassTexture::updateFromPosition(Level *level, double x, double z, double yRot, bool noNeedle, bool instant)
+{
+ double rott = 0;
+ if (level != NULL && !noNeedle)
+ {
+ Pos *spawnPos = level->getSharedSpawnPos();
+ double xa = spawnPos->x - x;
+ double za = spawnPos->z - z;
+ delete spawnPos;
+ yRot = (int)yRot % 360;
+ rott = -((yRot - 90) * PI / 180 - atan2(za, xa));
+ if (!level->dimension->isNaturalDimension())
+ {
+ rott = Math::random() * PI * 2;
+ }
+ }
+
+ if (instant)
+ {
+ rot = rott;
+ }
+ else
+ {
+ double rotd = rott - rot;
+ while (rotd < -PI)
+ rotd += PI * 2;
+ while (rotd >= PI)
+ rotd -= PI * 2;
+ if (rotd < -1) rotd = -1;
+ if (rotd > 1) rotd = 1;
+ rota += rotd * 0.1;
+ rota *= 0.8;
+ rot += rota;
+ }
+
+ // 4J Stu - We share data with another texture
+ if(m_dataTexture != NULL)
+ {
+ int newFrame = (int) (((rot / (PI * 2)) + 1.0) * m_dataTexture->frames->size()) % m_dataTexture->frames->size();
+ while (newFrame < 0)
+ {
+ newFrame = (newFrame + m_dataTexture->frames->size()) % m_dataTexture->frames->size();
+ }
+ if (newFrame != frame)
+ {
+ frame = newFrame;
+ m_dataTexture->source->blit(this->x, this->y, m_dataTexture->frames->at(this->frame), rotated);
+ }
+ }
+ else
+ {
+ int newFrame = (int) (((rot / (PI * 2)) + 1.0) * frames->size()) % frames->size();
+ while (newFrame < 0)
+ {
+ newFrame = (newFrame + frames->size()) % frames->size();
+ }
+ if (newFrame != frame)
+ {
+ frame = newFrame;
+ source->blit(this->x, this->y, frames->at(this->frame), rotated);
+ }
+ }
+}
+
+int CompassTexture::getSourceWidth() const
+{
+ return source->getWidth();
+}
+
+int CompassTexture::getSourceHeight() const
+{
+ return source->getHeight();
+}
+
+int CompassTexture::getFrames()
+{
+ if(m_dataTexture == NULL)
+ {
+ return StitchedTexture::getFrames();
+ }
+ else
+ {
+ return m_dataTexture->getFrames();
+ }
+}
+
+void CompassTexture::freeFrameTextures()
+{
+ if(m_dataTexture == NULL)
+ {
+ StitchedTexture::freeFrameTextures();
+ }
+}
+
+bool CompassTexture::hasOwnData()
+{
+ return m_dataTexture == NULL;
+} \ No newline at end of file