Skip to content

Commit 3e601e0

Browse files
committed
Creeper and CreeperRenderer
1 parent 918b87c commit 3e601e0

5 files changed

Lines changed: 149 additions & 3 deletions

File tree

source/client/renderer/entity/CreeperRenderer.cpp

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,50 @@ CreeperRenderer::~CreeperRenderer()
1717

1818
int CreeperRenderer::getOverlayColor(Mob* pMob, float a, float b)
1919
{
20-
// TODO
21-
return 0;
20+
Creeper* pCreeper = (Creeper*)pMob;
21+
22+
float step = pCreeper->getSwelling(b);
23+
24+
if (static_cast<int>(step * 10.0f) % 2 == 0)
25+
{
26+
return 0;
27+
}
28+
29+
int _a = step * 0.2f * 255.0f;
30+
31+
if (_a < 0) { _a = 0; }
32+
33+
if (_a > 255) { _a = 255; }
34+
35+
int red = 255;
36+
int green = 255;
37+
int blue = 255;
38+
39+
return _a << 24 | red << 16 | green << 8 | blue;
2240
}
2341

2442
void CreeperRenderer::scale(Mob* pMob, float f)
2543
{
26-
// TODO
44+
Creeper* pCreeper = (Creeper*)pMob;
45+
46+
float g = pCreeper->getSwelling(f);
47+
float wobble = 1.0f + Mth::sin(g * 100.0f) * g * 0.01f;
48+
49+
if (g < 0.0f)
50+
{
51+
g = 0.0f;
52+
}
53+
54+
if (g > 1.0f)
55+
{
56+
g = 1.0f;
57+
}
58+
59+
g *= g;
60+
g *= g;
61+
62+
float s = (1.0f + g * 0.4f) * wobble;
63+
float hs = (1.0f + g * 0.1f) / wobble;
64+
65+
glScalef(s, hs, s);
2766
}

source/client/renderer/entity/CreeperRenderer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#pragma once
99

1010
#include "MobRenderer.hpp"
11+
#include "world/entity/Creeper.hpp"
1112

1213
class CreeperRenderer : public MobRenderer
1314
{

source/world/entity/Creeper.cpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include "world/entity/Creeper.hpp"
2+
3+
Creeper::Creeper(Level* pLevel) : Monster(pLevel)
4+
{
5+
m_texture = "mob/creeper.png";
6+
m_swell = 0;
7+
m_oldSwell = 0;
8+
m_swellDir = -1;
9+
m_maxSwell = 0;
10+
}
11+
12+
void Creeper::tick()
13+
{
14+
m_oldSwell = m_swell;
15+
if (m_pLevel->m_bIsMultiplayer)
16+
{
17+
int swellDir = getSwellDir();
18+
if (swellDir > 0 && m_swell == 0)
19+
{
20+
m_pLevel->playSound(this, "random.fuse", 1.0f, 0.5f);
21+
}
22+
23+
m_swell += swellDir;
24+
25+
if (m_swell < 0) {
26+
m_swell = 0;
27+
}
28+
29+
if (m_swell >= 30)
30+
{
31+
m_swell = 30;
32+
}
33+
}
34+
35+
Monster::tick();
36+
}
37+
38+
void Creeper::die(Entity* pCulprit)
39+
{
40+
Monster::die(pCulprit);
41+
42+
// @NOTE: Disc dropping not implemented yet
43+
}
44+
45+
void Creeper::checkHurtTarget(Entity* pEnt, float f)
46+
{
47+
int swellDir = getSwellDir();
48+
if (swellDir <= 0 && f < 3.0f || swellDir > 0 && f < 7.0f)
49+
{
50+
if (m_swell == 0)
51+
{
52+
m_pLevel->playSound(this, "random.fuse", 1.0f, 0.5f);
53+
}
54+
55+
setSwellDir(1);
56+
m_swell++;
57+
if (m_swell >= 30)
58+
{
59+
m_pLevel->explode(this, m_pos, 3.0f);
60+
remove();
61+
}
62+
63+
m_bHoldGround = true;
64+
}
65+
else
66+
{
67+
setSwellDir(-1);
68+
m_swell--;
69+
if (m_swell < 0) {
70+
m_swell = 0;
71+
}
72+
}
73+
}
74+
75+
float Creeper::getSwelling(float f)
76+
{
77+
return (m_oldSwell + (m_swell - m_oldSwell) * f) / 28.0f;
78+
}

source/world/entity/Creeper.hpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include "world/entity/Monster.hpp"
4+
5+
class Creeper : public Monster
6+
{
7+
public:
8+
Creeper(Level* pLevel);
9+
10+
void tick() override;
11+
std::string getHurtSound() const override { return "mob.creeper"; }
12+
std::string getDeathSound() const override { return "mob.creeperdeath"; }
13+
float getSwelling(float f);
14+
int getSwellDir() { return m_swellDir; }
15+
void setSwellDir(int value) { m_swellDir = value; }
16+
int getDeathLoot() const override { return ITEM_SULPHUR; }
17+
18+
virtual void die(Entity* pCulprit) override;
19+
virtual void checkHurtTarget(Entity*, float) override;
20+
21+
public:
22+
int m_swell;
23+
int m_oldSwell;
24+
int m_swellDir;
25+
int m_maxSwell;
26+
};

source/world/entity/Monster.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#pragma once
2+
13
#include "world/entity/PathfinderMob.hpp"
24
#include "world/level/Level.hpp"
35

0 commit comments

Comments
 (0)