diff --git a/platforms/windows/projects/Client/Client.vcxproj b/platforms/windows/projects/Client/Client.vcxproj
index a5fbca3..16475ba 100644
--- a/platforms/windows/projects/Client/Client.vcxproj
+++ b/platforms/windows/projects/Client/Client.vcxproj
@@ -320,6 +320,8 @@
+
+
@@ -420,6 +422,8 @@
+
+
diff --git a/platforms/windows/projects/Client/Client.vcxproj.filters b/platforms/windows/projects/Client/Client.vcxproj.filters
index 7abf4df..6ffa616 100644
--- a/platforms/windows/projects/Client/Client.vcxproj.filters
+++ b/platforms/windows/projects/Client/Client.vcxproj.filters
@@ -380,6 +380,12 @@
Header Files\Model
+
+ Header Files\Model
+
+
+ Header Files\Renderer\Entity
+
@@ -676,5 +682,11 @@
Source Files\Model
+
+ Source Files\Model
+
+
+ Source Files\Renderer\Entity
+
\ No newline at end of file
diff --git a/source/client/model/ChickenModel.cpp b/source/client/model/ChickenModel.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/ChickenModel.hpp b/source/client/model/ChickenModel.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/CowModel.cpp b/source/client/model/CowModel.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/CowModel.hpp b/source/client/model/CowModel.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/CreeperModel.cpp b/source/client/model/CreeperModel.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/CreeperModel.hpp b/source/client/model/CreeperModel.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/Model.cpp b/source/client/model/Model.cpp
index cd63183..03dbcd5 100644
--- a/source/client/model/Model.cpp
+++ b/source/client/model/Model.cpp
@@ -12,6 +12,7 @@ Model::Model(int width, int height)
{
field_4 = 0.0f;
field_8 = false;
+ m_bIsBaby = true; // @HUH: Why is this true?
m_textureWidth = width;
m_textureHeight = height;
}
diff --git a/source/client/model/Model.hpp b/source/client/model/Model.hpp
index 0c173d0..d902eb2 100644
--- a/source/client/model/Model.hpp
+++ b/source/client/model/Model.hpp
@@ -30,4 +30,5 @@ public:
int m_textureWidth;
int m_textureHeight;
std::vector m_parts;
+ bool m_bIsBaby;
};
diff --git a/source/client/model/PigModel.cpp b/source/client/model/PigModel.cpp
new file mode 100644
index 0000000..3d6699d
--- /dev/null
+++ b/source/client/model/PigModel.cpp
@@ -0,0 +1,20 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+#include "PigModel.hpp"
+
+PigModel::PigModel(float f) :
+ QuadrupedModel(6, f)
+{
+ m_head.texOffs(16, 16);
+ m_head.addBox(-2, 0, -9, 4, 3, 1, f);
+ field_28C = 4.0f;
+}
+
+PigModel::~PigModel()
+{
+}
diff --git a/source/client/model/PigModel.hpp b/source/client/model/PigModel.hpp
new file mode 100644
index 0000000..97a0e75
--- /dev/null
+++ b/source/client/model/PigModel.hpp
@@ -0,0 +1,17 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+#pragma once
+
+#include "QuadrupedModel.hpp"
+
+class PigModel : public QuadrupedModel
+{
+public:
+ PigModel(float);
+ ~PigModel();
+};
diff --git a/source/client/model/QuadrupedModel.cpp b/source/client/model/QuadrupedModel.cpp
index 09c3c39..1d127c4 100644
--- a/source/client/model/QuadrupedModel.cpp
+++ b/source/client/model/QuadrupedModel.cpp
@@ -10,7 +10,6 @@
QuadrupedModel::QuadrupedModel(int i, float f) :
Model(64, 32),
- m_bIsBaby(true), // @HUH: Why is this true?
m_head(0, 0),
m_unknown(0, 0),
m_body(28, 8),
diff --git a/source/client/model/QuadrupedModel.hpp b/source/client/model/QuadrupedModel.hpp
index daf8421..ab76446 100644
--- a/source/client/model/QuadrupedModel.hpp
+++ b/source/client/model/QuadrupedModel.hpp
@@ -5,7 +5,7 @@
The following code is licensed under the BSD 1 clause license.
SPDX-License-Identifier: BSD-1-Clause
********************************************************************/
-#pragma off
+#pragma once
#include "Model.hpp"
@@ -18,8 +18,8 @@ public:
void render(float, float, float, float, float, float) override;
void setupAnim(float, float, float, float, float, float) override;
-private:
- bool m_bIsBaby;
+protected:
+ friend class PigModel;
ModelPart m_head;
ModelPart m_unknown;
ModelPart m_body;
diff --git a/source/client/model/SheepFurModel.cpp b/source/client/model/SheepFurModel.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/SheepFurModel.hpp b/source/client/model/SheepFurModel.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/SheepModel.cpp b/source/client/model/SheepModel.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/SheepModel.hpp b/source/client/model/SheepModel.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/SkeletonModel.cpp b/source/client/model/SkeletonModel.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/SkeletonModel.hpp b/source/client/model/SkeletonModel.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/ZombieModel.cpp b/source/client/model/ZombieModel.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/model/ZombieModel.hpp b/source/client/model/ZombieModel.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/ChickenRenderer.cpp b/source/client/renderer/entity/ChickenRenderer.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/ChickenRenderer.hpp b/source/client/renderer/entity/ChickenRenderer.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/CowRenderer.cpp b/source/client/renderer/entity/CowRenderer.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/CowRenderer.hpp b/source/client/renderer/entity/CowRenderer.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/CreeperRenderer.cpp b/source/client/renderer/entity/CreeperRenderer.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/CreeperRenderer.hpp b/source/client/renderer/entity/CreeperRenderer.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/EntityRenderDispatcher.cpp b/source/client/renderer/entity/EntityRenderDispatcher.cpp
index d3e4c84..9da8cb9 100644
--- a/source/client/renderer/entity/EntityRenderDispatcher.cpp
+++ b/source/client/renderer/entity/EntityRenderDispatcher.cpp
@@ -10,11 +10,14 @@
#include "client/app/Minecraft.hpp"
#include "../ItemInHandRenderer.hpp"
+#include "client/model/PigModel.hpp"
+
EntityRenderDispatcher* EntityRenderDispatcher::instance;
float EntityRenderDispatcher::xOff, EntityRenderDispatcher::yOff, EntityRenderDispatcher::zOff;
EntityRenderDispatcher::EntityRenderDispatcher() :
- m_HumanoidMobRenderer(new HumanoidModel(0.0f, 0.0f), 0.0f)
+ m_HumanoidMobRenderer(new HumanoidModel(0.0f, 0.0f), 0.0f),
+ m_PigRenderer(new PigModel(0.0f), 0.0f)
{
m_pItemInHandRenderer = nullptr;
m_pTextures = nullptr;
@@ -27,14 +30,13 @@ EntityRenderDispatcher::EntityRenderDispatcher() :
m_pFont = nullptr;
m_HumanoidMobRenderer.init(this);
+ m_PigRenderer.init(this);
+
+ // TODO
+
m_TntRenderer.init(this);
m_CameraRenderer.init(this);
-
-#ifndef ORIGINAL_CODE
- // @BUG: Not initializing the item renderer would cause crashes if item7
- // entities exist, because it references the dispatcher
m_ItemRenderer.init(this);
-#endif
#ifdef ENH_ALLOW_SAND_GRAVITY
m_FallingTileRenderer.init(this);
@@ -63,9 +65,9 @@ EntityRenderDispatcher* EntityRenderDispatcher::getInstance()
return instance;
}
-EntityRenderer* EntityRenderDispatcher::getRenderer(Entity* pEnt)
+EntityRenderer* EntityRenderDispatcher::getRenderer(int renderType)
{
- switch (pEnt->field_C8)
+ switch (renderType)
{
case RENDER_TNT:
return &m_TntRenderer;
@@ -75,6 +77,9 @@ EntityRenderer* EntityRenderDispatcher::getRenderer(Entity* pEnt)
return &m_CameraRenderer;
case RENDER_HUMANOID:
return &m_HumanoidMobRenderer;
+ case RENDER_PIG:
+ return &m_PigRenderer;
+ // TODO
#ifdef ENH_ALLOW_SAND_GRAVITY
case RENDER_FALLING_TILE:
return &m_FallingTileRenderer;
@@ -84,6 +89,15 @@ EntityRenderer* EntityRenderDispatcher::getRenderer(Entity* pEnt)
return nullptr;
}
+EntityRenderer* EntityRenderDispatcher::getRenderer(Entity* pEnt)
+{
+ int renderType = pEnt->field_C8;
+ if (renderType == RENDER_DYNAMIC)
+ renderType = pEnt->queryEntityRenderer();
+
+ return getRenderer(renderType);
+}
+
void EntityRenderDispatcher::onGraphicsReset()
{
m_HumanoidMobRenderer.onGraphicsReset();
diff --git a/source/client/renderer/entity/EntityRenderDispatcher.hpp b/source/client/renderer/entity/EntityRenderDispatcher.hpp
index fe78610..bd6ce21 100644
--- a/source/client/renderer/entity/EntityRenderDispatcher.hpp
+++ b/source/client/renderer/entity/EntityRenderDispatcher.hpp
@@ -14,6 +14,7 @@
#include "TntRenderer.hpp"
#include "ItemRenderer.hpp"
#include "FallingTileRenderer.hpp"
+#include "PigRenderer.hpp"
class Minecraft;
class Font;
@@ -29,6 +30,7 @@ public:
float distanceToSqr(float x, float y, float z);
Font* getFont();
EntityRenderer* getRenderer(Entity* pEnt);
+ EntityRenderer* getRenderer(int renderType);
void onGraphicsReset();
void prepare(Level*, Textures*, Font*, Mob*, Options*, float);
void render(Entity*, float);
@@ -41,8 +43,18 @@ public:
public:
ItemInHandRenderer* m_pItemInHandRenderer;
HumanoidMobRenderer m_HumanoidMobRenderer;
+ PigRenderer m_PigRenderer;
+ //CowRenderer m_CowRenderer;
+ //ChickenRenderer m_ChickenRenderer;
TntRenderer m_TntRenderer;
+ //padding??
ItemRenderer m_ItemRenderer;
+ //CreeperRenderer m_CreeperRenderer;
+ //SpiderRenderer m_SpiderRenderer;
+ //SkeletonRenderer m_SkeletonRenderer;
+ //ZombieRenderer m_ZombieRenderer;
+ //SheepRenderer m_SheepRenderer;
+ //SheepFurRenderer m_SheepFurRenderer;
TripodCameraRenderer m_CameraRenderer;
Textures* m_pTextures;
Level* m_pLevel;
diff --git a/source/client/renderer/entity/MobRenderer.cpp b/source/client/renderer/entity/MobRenderer.cpp
index d334d44..4591e5c 100644
--- a/source/client/renderer/entity/MobRenderer.cpp
+++ b/source/client/renderer/entity/MobRenderer.cpp
@@ -83,9 +83,13 @@ void MobRenderer::render(Entity* entity, float x, float y, float z, float unused
glDisable(GL_CULL_FACE);
m_pModel->field_4 = getAttackAnim(pMob, f);
m_pModel->field_8 = false;
+ m_pModel->m_bIsBaby = pMob->isBaby();
if (m_pArmorModel)
+ {
m_pArmorModel->field_8 = m_pModel->field_8;
+ m_pArmorModel->m_bIsBaby = m_pModel->m_bIsBaby;
+ }
float aYaw = pMob->field_5C + (pMob->m_yaw - pMob->field_5C) * f;
float aPitch = pMob->field_60 + (pMob->m_pitch - pMob->field_60) * f;
@@ -104,7 +108,7 @@ void MobRenderer::render(Entity* entity, float x, float y, float z, float unused
x1 = 1.0f;
float x2 = pMob->field_130 - pMob->field_12C * (1.0f - f);
- bindTexture("mob/char.png");
+ bindTexture(pMob->getTexture());
glEnable(GL_ALPHA_TEST);
m_pModel->setBrightness(entity->getBrightness(1.0f));
diff --git a/source/client/renderer/entity/PigRenderer.cpp b/source/client/renderer/entity/PigRenderer.cpp
new file mode 100644
index 0000000..5a3e51c
--- /dev/null
+++ b/source/client/renderer/entity/PigRenderer.cpp
@@ -0,0 +1,16 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+#include "PigRenderer.hpp"
+
+PigRenderer::PigRenderer(Model* pModel, float f) : MobRenderer(pModel, f)
+{
+}
+
+PigRenderer::~PigRenderer()
+{
+}
diff --git a/source/client/renderer/entity/PigRenderer.hpp b/source/client/renderer/entity/PigRenderer.hpp
new file mode 100644
index 0000000..425c8c7
--- /dev/null
+++ b/source/client/renderer/entity/PigRenderer.hpp
@@ -0,0 +1,17 @@
+/********************************************************************
+ Minecraft: Pocket Edition - Decompilation Project
+ Copyright (C) 2023 iProgramInCpp
+
+ The following code is licensed under the BSD 1 clause license.
+ SPDX-License-Identifier: BSD-1-Clause
+ ********************************************************************/
+#pragma once
+
+#include "MobRenderer.hpp"
+
+class PigRenderer : public MobRenderer
+{
+public:
+ PigRenderer(Model*, float);
+ ~PigRenderer();
+};
diff --git a/source/client/renderer/entity/SheepFurRenderer.cpp b/source/client/renderer/entity/SheepFurRenderer.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/SheepFurRenderer.hpp b/source/client/renderer/entity/SheepFurRenderer.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/SheepRenderer.cpp b/source/client/renderer/entity/SheepRenderer.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/SheepRenderer.hpp b/source/client/renderer/entity/SheepRenderer.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/SkeletonRenderer.cpp b/source/client/renderer/entity/SkeletonRenderer.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/SkeletonRenderer.hpp b/source/client/renderer/entity/SkeletonRenderer.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/SpiderRenderer.cpp b/source/client/renderer/entity/SpiderRenderer.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/SpiderRenderer.hpp b/source/client/renderer/entity/SpiderRenderer.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/ZombieRenderer.cpp b/source/client/renderer/entity/ZombieRenderer.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/client/renderer/entity/ZombieRenderer.hpp b/source/client/renderer/entity/ZombieRenderer.hpp
new file mode 100644
index 0000000..e69de29
diff --git a/source/world/entity/Entity.cpp b/source/world/entity/Entity.cpp
index 8350e2f..04e7311 100644
--- a/source/world/entity/Entity.cpp
+++ b/source/world/entity/Entity.cpp
@@ -1068,6 +1068,13 @@ void Entity::lavaHurt()
}
}
+int Entity::queryEntityRenderer()
+{
+ // If field_C8 is equal to RENDER_DYNAMIC, EntityRenderDispatcher
+ // calls here. Used for sheared sheep.
+ return 0;
+}
+
int Entity::hashCode()
{
return m_EntityID;
diff --git a/source/world/entity/Entity.hpp b/source/world/entity/Entity.hpp
index a012730..ccebc42 100644
--- a/source/world/entity/Entity.hpp
+++ b/source/world/entity/Entity.hpp
@@ -22,10 +22,20 @@ class ItemInstance;
enum eEntityRenderType
{
RENDER_NONE,
+ RENDER_DYNAMIC,
RENDER_TNT,
RENDER_HUMANOID,
RENDER_ITEM,
RENDER_CAMERA,
+ RENDER_CHICKEN,
+ RENDER_COW,
+ RENDER_PIG,
+ RENDER_SHEEP,
+ RENDER_SHEEP_FUR,
+ RENDER_ZOMBIE,
+ RENDER_SKELETON,
+ RENDER_SPIDER,
+ RENDER_CREEPER,
// custom
RENDER_FALLING_TILE = 50,
@@ -139,6 +149,7 @@ public:
virtual void markHurt();
virtual void burn(int);
virtual void lavaHurt();
+ virtual int queryEntityRenderer();
virtual bool isLocalPlayer();
diff --git a/source/world/entity/Mob.cpp b/source/world/entity/Mob.cpp
index eae7193..ffdeb53 100644
--- a/source/world/entity/Mob.cpp
+++ b/source/world/entity/Mob.cpp
@@ -57,7 +57,7 @@ Mob::Mob(Level* pLevel) : Entity(pLevel)
field_B84 = 0;
m_pEntLookedAt = nullptr;
- m_texture = "/mob/char.png";
+ m_texture = "/mob/pig.png";
m_class = "";
field_34 = 1;
@@ -744,6 +744,11 @@ int Mob::getMaxSpawnClusterSize()
return 4;
}
+bool Mob::isBaby()
+{
+ return false;
+}
+
void Mob::actuallyHurt(int damage)
{
#ifdef TEST_SURVIVAL_MODE
diff --git a/source/world/entity/Mob.hpp b/source/world/entity/Mob.hpp
index 8fb77fe..653b90d 100644
--- a/source/world/entity/Mob.hpp
+++ b/source/world/entity/Mob.hpp
@@ -62,6 +62,7 @@ public:
virtual Vec3 getLookAngle(float f);
virtual Vec3 getViewVector(float f);
virtual int getMaxSpawnClusterSize();
+ virtual bool isBaby();
virtual void actuallyHurt(int damage);
virtual bool removeWhenFarAway();
virtual int getDeathLoot();
diff --git a/source/world/entity/Player.cpp b/source/world/entity/Player.cpp
index 0b3c200..58e50c9 100644
--- a/source/world/entity/Player.cpp
+++ b/source/world/entity/Player.cpp
@@ -22,7 +22,7 @@ Player::Player(Level* pLevel) : Mob(pLevel)
field_BC4 = 0;
m_bHaveRespawnPos = false;
- field_C8 = 2;
+ field_C8 = RENDER_HUMANOID;
m_pInventory = new Inventory(this);