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);