first commit
This commit is contained in:
142
Minecraft.Client/CompassTexture.cpp
Normal file
142
Minecraft.Client/CompassTexture.cpp
Normal file
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user