aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/WitchRenderer.cpp
blob: 5e0f2b103568cf3edd2c0371a2fa9a4975e1aa08 (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
#include "stdafx.h"
#include "EntityRenderDispatcher.h"
#include "WitchRenderer.h"
#include "WitchModel.h"
#include "ModelPart.h"
#include "..\Minecraft.World\net.minecraft.world.item.h"

ResourceLocation WitchRenderer::WITCH_LOCATION = ResourceLocation(TN_MOB_WITCH);

WitchRenderer::WitchRenderer() : MobRenderer(new WitchModel(0), 0.5f)
{
	witchModel = dynamic_cast<WitchModel*>(model);
}

void WitchRenderer::render(shared_ptr<Entity> entity, double x, double y, double z, float rot, float a)
{
	shared_ptr<Mob> mob = dynamic_pointer_cast<Mob>(entity);

	shared_ptr<ItemInstance> item = mob->getCarriedItem();

	witchModel->holdingItem = item != NULL;
	MobRenderer::render(mob, x, y, z, rot, a);
}

ResourceLocation *WitchRenderer::getTextureLocation(shared_ptr<Entity> entity)
{
	return &WITCH_LOCATION;
}

void WitchRenderer::additionalRendering(shared_ptr<LivingEntity> entity, float a)
{
	shared_ptr<Mob> mob = dynamic_pointer_cast<Mob>(entity);

	float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a);
	glColor3f(brightness, brightness, brightness);

	MobRenderer::additionalRendering(mob, a);

	shared_ptr<ItemInstance> item = mob->getCarriedItem();

	if (item != NULL)
	{
		glPushMatrix();

		if (model->young)
		{
			float s = 0.5f;
			glTranslatef(0 / 16.0f, 10 / 16.0f, 0 / 16.0f);
			glRotatef(-20, -1, 0, 0);
			glScalef(s, s, s);
		}

		witchModel->nose->translateTo(1 / 16.0f);
		glTranslatef(-1 / 16.0f, 8.5f / 16.0f, 3.5f / 16.0f);

		if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape()))
		{
			float s = 8 / 16.0f;
			glTranslatef(-0 / 16.0f, 3 / 16.0f, -5 / 16.0f);
			s *= 0.75f;
			glRotatef(20, 1, 0, 0);
			glRotatef(45, 0, 1, 0);
			glScalef(s, -s, s);
		}
		else if (item->id == Item::bow->id)
		{
			float s = 10 / 16.0f;
			glTranslatef(0 / 16.0f, 2 / 16.0f, 5 / 16.0f);
			glRotatef(-20, 0, 1, 0);
			glScalef(s, -s, s);
			glRotatef(-100, 1, 0, 0);
			glRotatef(45, 0, 1, 0);
		}
		else if (Item::items[item->id]->isHandEquipped())
		{
			float s = 10 / 16.0f;
			if (Item::items[item->id]->isMirroredArt())
			{
				glRotatef(180, 0, 0, 1);
				glTranslatef(0, -2 / 16.0f, 0);
			}
			translateWeaponItem();
			glScalef(s, -s, s);
			glRotatef(-100, 1, 0, 0);
			glRotatef(45, 0, 1, 0);
		}
		else
		{
			float s = 6 / 16.0f;
			glTranslatef(+4 / 16.0f, +3 / 16.0f, -3 / 16.0f);
			glScalef(s, s, s);
			glRotatef(60, 0, 0, 1);
			glRotatef(-90, 1, 0, 0);
			glRotatef(20, 0, 0, 1);
		}

		glRotatef(-15, 1, 0, 0);
		glRotatef(40, 0, 0, 1);

		entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0);
		if (item->getItem()->hasMultipleSpriteLayers())
		{
			entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 1);
		}
		glPopMatrix();
	}
}

void WitchRenderer::translateWeaponItem()
{
	glTranslatef(0, 3 / 16.0f, 0);
}

void WitchRenderer::scale(shared_ptr<LivingEntity> mob, float a)
{
	float s = 15 / 16.0f;
	glScalef(s, s, s);
}