aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/ClockTexture.cpp
blob: 837532fb7c04583e19f7877b7dcd902527af1ec6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#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 "ClockTexture.h"

ClockTexture::ClockTexture() : StitchedTexture(L"clock", L"clock")
{
	rot = rota = 0.0;
	m_dataTexture = NULL;
	m_iPad = XUSER_INDEX_ANY;
}

ClockTexture::ClockTexture(int iPad, ClockTexture *dataTexture) : StitchedTexture(L"clock", L"clock")
{
	rot = rota = 0.0;
	m_dataTexture = dataTexture;
	m_iPad = iPad;
}

void ClockTexture::cycleFrames()
{

	Minecraft *mc = Minecraft::GetInstance();

	double rott = 0;
	if (m_iPad >= 0 && m_iPad < XUSER_MAX_COUNT && mc->level != NULL && mc->localplayers[m_iPad] != NULL)
	{
		float time = mc->localplayers[m_iPad]->level->getTimeOfDay(1);
		rott = time;
		if (!mc->localplayers[m_iPad]->level->dimension->isNaturalDimension())
		{
			rott = Math::random();
		}
	}
	else
	{
		// 4J Stu - For the static version, pretend we are already on a frame other than 0
		frame = 1;
	}

	double rotd = rott - rot;
	while (rotd < -.5)
		rotd += 1.0;
	while (rotd >= .5)
		rotd -= 1.0;
	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 + 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(x, y, m_dataTexture->frames->at(this->frame), rotated);
		}
	}
	else
	{
		int newFrame = (int) ((rot + 1.0) * frames->size()) % frames->size();
		while (newFrame < 0)
		{
			newFrame = (newFrame + frames->size()) % frames->size();
		}
		if (newFrame != frame)
		{
			frame = newFrame;
			source->blit(x, y, frames->at(this->frame), rotated);
		}
	}
}

int ClockTexture::getSourceWidth() const
{
	return source->getWidth();
}

int ClockTexture::getSourceHeight() const
{
	return source->getHeight();
}

int ClockTexture::getFrames()
{
	if(m_dataTexture == NULL)
	{
		return StitchedTexture::getFrames();
	}
	else
	{
		return m_dataTexture->getFrames();
	}
}

void ClockTexture::freeFrameTextures()
{
	if(m_dataTexture == NULL)
	{
		StitchedTexture::freeFrameTextures();
	}
}

bool ClockTexture::hasOwnData()
{
	return m_dataTexture == NULL;
}