From 41b734ebdb793825d66799eefe9add842c5da322 Mon Sep 17 00:00:00 2001 From: starseed12345 <99209515+starseed12345@users.noreply.github.com> Date: Mon, 9 Mar 2026 17:42:49 +0100 Subject: [PATCH] CPU Overhead Optimization,Pathfinding and Entity Optimizations - Cache shared_from_this() in serverAiStep - Reduce shared_ptr overhead in entities - Add shadow tile cache to optimize entity shadow rendering --- Minecraft.Client/ArrowRenderer.h | 2 +- Minecraft.Client/BatRenderer.h | 2 +- Minecraft.Client/BlazeRenderer.h | 2 +- Minecraft.Client/BoatRenderer.h | 2 +- Minecraft.Client/ChickenRenderer.h | 2 +- Minecraft.Client/CowRenderer.h | 2 +- Minecraft.Client/DefaultRenderer.h | 2 +- Minecraft.Client/EnderCrystalRenderer.h | 2 +- Minecraft.Client/EnderDragonRenderer.h | 2 +- Minecraft.Client/EndermanRenderer.h | 2 +- Minecraft.Client/EntityRenderDispatcher.cpp | 5 ++++ Minecraft.Client/EntityRenderDispatcher.h | 29 +++++++++++++++++++-- Minecraft.Client/EntityRenderer.cpp | 20 +++++++++----- Minecraft.Client/EntityRenderer.h | 4 +-- Minecraft.Client/ExperienceOrbRenderer.h | 2 +- Minecraft.Client/FallingTileRenderer.h | 2 +- Minecraft.Client/FireballRenderer.h | 2 +- Minecraft.Client/FishingHookRenderer.h | 2 +- Minecraft.Client/HumanoidMobRenderer.h | 2 +- Minecraft.Client/ItemFrameRenderer.h | 2 +- Minecraft.Client/ItemSpriteRenderer.h | 2 +- Minecraft.Client/LeashKnotRenderer.h | 2 +- Minecraft.Client/LevelRenderer.cpp | 1 + Minecraft.Client/LightningBoltRenderer.h | 2 +- Minecraft.Client/LivingEntityRenderer.h | 2 +- Minecraft.Client/MinecartRenderer.h | 2 +- Minecraft.Client/MobRenderer.h | 2 +- Minecraft.Client/MushroomCowRenderer.h | 2 +- Minecraft.Client/OcelotRenderer.h | 2 +- Minecraft.Client/PaintingRenderer.h | 2 +- Minecraft.Client/PigRenderer.h | 2 +- Minecraft.Client/PlayerRenderer.h | 2 +- Minecraft.Client/SheepRenderer.h | 2 +- Minecraft.Client/SilverfishRenderer.h | 2 +- Minecraft.Client/SquidRenderer.h | 2 +- Minecraft.Client/TntRenderer.h | 2 +- Minecraft.Client/VillagerGolemRenderer.h | 2 +- Minecraft.Client/VillagerRenderer.h | 2 +- Minecraft.Client/WitchRenderer.h | 2 +- Minecraft.Client/WitherBossRenderer.h | 2 +- Minecraft.Client/WitherSkullRenderer.h | 2 +- Minecraft.Client/ZombieRenderer.h | 2 +- Minecraft.World/PathfinderMob.cpp | 28 ++++++++++---------- 43 files changed, 100 insertions(+), 61 deletions(-) diff --git a/Minecraft.Client/ArrowRenderer.h b/Minecraft.Client/ArrowRenderer.h index 95867f5e5..2331a9469 100644 --- a/Minecraft.Client/ArrowRenderer.h +++ b/Minecraft.Client/ArrowRenderer.h @@ -7,6 +7,6 @@ private: static ResourceLocation ARROW_LOCATION; public: - virtual void render(shared_ptr _arrow, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _arrow, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; diff --git a/Minecraft.Client/BatRenderer.h b/Minecraft.Client/BatRenderer.h index 882050468..e347bd5c4 100644 --- a/Minecraft.Client/BatRenderer.h +++ b/Minecraft.Client/BatRenderer.h @@ -10,7 +10,7 @@ class BatRenderer : public MobRenderer public: BatRenderer(); - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); protected: virtual ResourceLocation *getTextureLocation(shared_ptr mob); diff --git a/Minecraft.Client/BlazeRenderer.h b/Minecraft.Client/BlazeRenderer.h index 5a009b741..cc7687360 100644 --- a/Minecraft.Client/BlazeRenderer.h +++ b/Minecraft.Client/BlazeRenderer.h @@ -10,6 +10,6 @@ private: public: BlazeRenderer(); - virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/BoatRenderer.h b/Minecraft.Client/BoatRenderer.h index 9396b477a..ee1712759 100644 --- a/Minecraft.Client/BoatRenderer.h +++ b/Minecraft.Client/BoatRenderer.h @@ -11,6 +11,6 @@ protected: public: BoatRenderer(); - virtual void render(shared_ptr boat, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr boat, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/ChickenRenderer.h b/Minecraft.Client/ChickenRenderer.h index 7e0a5d9a6..463c05918 100644 --- a/Minecraft.Client/ChickenRenderer.h +++ b/Minecraft.Client/ChickenRenderer.h @@ -8,7 +8,7 @@ private: public: ChickenRenderer(Model *model, float shadow); - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: diff --git a/Minecraft.Client/CowRenderer.h b/Minecraft.Client/CowRenderer.h index 3e4e9a0c6..74a8089a7 100644 --- a/Minecraft.Client/CowRenderer.h +++ b/Minecraft.Client/CowRenderer.h @@ -9,6 +9,6 @@ private: public: CowRenderer(Model *model, float shadow); - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/DefaultRenderer.h b/Minecraft.Client/DefaultRenderer.h index 28630de29..f151dc97c 100644 --- a/Minecraft.Client/DefaultRenderer.h +++ b/Minecraft.Client/DefaultRenderer.h @@ -4,6 +4,6 @@ class DefaultRenderer : public EntityRenderer { public: - virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr entity, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob) { return nullptr; }; }; \ No newline at end of file diff --git a/Minecraft.Client/EnderCrystalRenderer.h b/Minecraft.Client/EnderCrystalRenderer.h index 76e3b1718..ba43ebf21 100644 --- a/Minecraft.Client/EnderCrystalRenderer.h +++ b/Minecraft.Client/EnderCrystalRenderer.h @@ -13,6 +13,6 @@ private: public: EnderCrystalRenderer(); - virtual void render(shared_ptr _crystal, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _crystal, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/EnderDragonRenderer.h b/Minecraft.Client/EnderDragonRenderer.h index 19209a454..1df60c2a1 100644 --- a/Minecraft.Client/EnderDragonRenderer.h +++ b/Minecraft.Client/EnderDragonRenderer.h @@ -25,7 +25,7 @@ protected: virtual void renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); public: - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: diff --git a/Minecraft.Client/EndermanRenderer.h b/Minecraft.Client/EndermanRenderer.h index a65464c06..6fd210c6f 100644 --- a/Minecraft.Client/EndermanRenderer.h +++ b/Minecraft.Client/EndermanRenderer.h @@ -15,7 +15,7 @@ private: public: EndermanRenderer(); - void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); ResourceLocation *getTextureLocation(shared_ptr mob); void additionalRendering(shared_ptr _mob, float a); diff --git a/Minecraft.Client/EntityRenderDispatcher.cpp b/Minecraft.Client/EntityRenderDispatcher.cpp index 01972e568..35b202447 100644 --- a/Minecraft.Client/EntityRenderDispatcher.cpp +++ b/Minecraft.Client/EntityRenderDispatcher.cpp @@ -295,6 +295,11 @@ void EntityRenderDispatcher::render(shared_ptr entity, double x, double } } +void EntityRenderDispatcher::beginFrame() +{ + shadowTileCache.clear(); +} + double EntityRenderDispatcher::distanceToSqr(double x, double y, double z) { double xd = x - xPlayer; diff --git a/Minecraft.Client/EntityRenderDispatcher.h b/Minecraft.Client/EntityRenderDispatcher.h index 07ab7c4d0..41bd9d4d5 100644 --- a/Minecraft.Client/EntityRenderDispatcher.h +++ b/Minecraft.Client/EntityRenderDispatcher.h @@ -17,6 +17,29 @@ private: public: static EntityRenderDispatcher *instance; + struct ShadowTileKey + { + int x, y, z; + bool operator==(const ShadowTileKey &o) const + { + return x == o.x && y == o.y && z == o.z; + } + }; + + struct ShadowTileKeyHash + { + size_t operator()(const ShadowTileKey &k) const + { + return ((size_t)k.x * 73856093) ^ ((size_t)k.y * 19349663) ^ ((size_t)k.z * 83492791); + } + }; + + struct ShadowTileValue + { + int tileid; + int brightness; + }; + private: Font *font; @@ -39,11 +62,13 @@ private: EntityRenderDispatcher(); public: + unordered_map shadowTileCache; + void beginFrame(); EntityRenderer *getRenderer(eINSTANCEOF e); EntityRenderer *getRenderer(shared_ptr e); void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, shared_ptr crosshairPickMob, Options *options, float a); - void render(shared_ptr entity, float a); - void render(shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame = false, bool bRenderPlayerShadow = true); + void render(const shared_ptr entity, float a); + void render(const shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame = false, bool bRenderPlayerShadow = true); void setLevel(Level *level); double distanceToSqr(double x, double y, double z); Font *getFont(); diff --git a/Minecraft.Client/EntityRenderer.cpp b/Minecraft.Client/EntityRenderer.cpp index fa41dfa60..28fb05a76 100644 --- a/Minecraft.Client/EntityRenderer.cpp +++ b/Minecraft.Client/EntityRenderer.cpp @@ -202,18 +202,26 @@ void EntityRenderer::renderShadow(shared_ptr e, double x, double y, doub double xo = x - ex; double yo = y - ey; double zo = z - ez; - + auto &cache = entityRenderDispatcher->shadowTileCache; Tesselator *tt = Tesselator::getInstance(); tt->begin(); for (int xt = x0; xt <= x1; xt++) for (int yt = y0; yt <= y1; yt++) for (int zt = z0; zt <= z1; zt++) - { - int t = level->getTile(xt, yt - 1, zt); - if (t > 0 && level->getRawBrightness(xt, yt, zt) > 3) + { + EntityRenderDispatcher::ShadowTileKey key = { xt, yt, zt }; + auto it = cache.find(key); + if (it == cache.end()) { - renderTileShadow(Tile::tiles[t], x, y + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, z, xt, yt , zt, pow, r, xo, yo + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, zo); - } + EntityRenderDispatcher::ShadowTileValue val; + val.tileid = level->getTile(xt, yt - 1, zt); + val.brightness = (val.tileid > 0) ? level->getRawBrightness(xt, yt, zt) : 0; + it = cache.emplace(key, val).first; + } + if (it->second.tileid > 0 && it->second.brightness > 3) + { + renderTileShadow(Tile::tiles[it->second.tileid], x, y + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, z, xt, yt, zt, pow, r, xo, yo + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, zo); + } } tt->end(); diff --git a/Minecraft.Client/EntityRenderer.h b/Minecraft.Client/EntityRenderer.h index ef3b63bdc..9d3f20890 100644 --- a/Minecraft.Client/EntityRenderer.h +++ b/Minecraft.Client/EntityRenderer.h @@ -42,7 +42,7 @@ public: EntityRenderer(); // 4J - added virtual ~EntityRenderer(); public: - virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a) = 0; + virtual void render(const shared_ptr entity, double x, double y, double z, float rot, float a) = 0; protected: virtual void bindTexture(shared_ptr entity); virtual void bindTexture(ResourceLocation *location); @@ -61,7 +61,7 @@ public: static void renderFlat(AABB *bb); static void renderFlat(float x0, float y0, float z0, float x1, float y1, float z1); virtual void init(EntityRenderDispatcher *entityRenderDispatcher); - virtual void postRender(shared_ptr entity, double x, double y, double z, float rot, float a, bool bRenderPlayerShadow); + virtual void postRender(const shared_ptr entity, double x, double y, double z, float rot, float a, bool bRenderPlayerShadow); virtual Font *getFont(); virtual void registerTerrainTextures(IconRegister *iconRegister); diff --git a/Minecraft.Client/ExperienceOrbRenderer.h b/Minecraft.Client/ExperienceOrbRenderer.h index 68047b803..97c02ce82 100644 --- a/Minecraft.Client/ExperienceOrbRenderer.h +++ b/Minecraft.Client/ExperienceOrbRenderer.h @@ -9,7 +9,7 @@ private: public: ExperienceOrbRenderer(); - virtual void render(shared_ptr _orb, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _orb, double x, double y, double z, float rot, float a); void blit(int x, int y, int sx, int sy, int w, int h); virtual ResourceLocation *getTextureLocation(shared_ptr mob); diff --git a/Minecraft.Client/FallingTileRenderer.h b/Minecraft.Client/FallingTileRenderer.h index de4c5bfc3..bdf879ab1 100644 --- a/Minecraft.Client/FallingTileRenderer.h +++ b/Minecraft.Client/FallingTileRenderer.h @@ -9,6 +9,6 @@ private: public: FallingTileRenderer(); - virtual void render(shared_ptr _tile, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _tile, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/FireballRenderer.h b/Minecraft.Client/FireballRenderer.h index 44b8b4c4f..cdd242b23 100644 --- a/Minecraft.Client/FireballRenderer.h +++ b/Minecraft.Client/FireballRenderer.h @@ -9,7 +9,7 @@ private: public: FireballRenderer(float scale); - virtual void render(shared_ptr _fireball, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _fireball, double x, double y, double z, float rot, float a); private: // 4J Added override diff --git a/Minecraft.Client/FishingHookRenderer.h b/Minecraft.Client/FishingHookRenderer.h index 8c58ea9b7..d0ec8755c 100644 --- a/Minecraft.Client/FishingHookRenderer.h +++ b/Minecraft.Client/FishingHookRenderer.h @@ -7,6 +7,6 @@ private: static ResourceLocation PARTICLE_LOCATION; public: - virtual void render(shared_ptr _hook, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _hook, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/HumanoidMobRenderer.h b/Minecraft.Client/HumanoidMobRenderer.h index 98d8b8dbd..a9a60ddc2 100644 --- a/Minecraft.Client/HumanoidMobRenderer.h +++ b/Minecraft.Client/HumanoidMobRenderer.h @@ -30,7 +30,7 @@ public: protected: virtual void createArmorParts(); virtual int prepareArmor(shared_ptr _mob, int layer, float a); - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); virtual void prepareCarriedItem(shared_ptr mob, shared_ptr item); virtual void additionalRendering(shared_ptr mob, float a); diff --git a/Minecraft.Client/ItemFrameRenderer.h b/Minecraft.Client/ItemFrameRenderer.h index a6eea8f44..88385e596 100644 --- a/Minecraft.Client/ItemFrameRenderer.h +++ b/Minecraft.Client/ItemFrameRenderer.h @@ -9,7 +9,7 @@ private: public: void registerTerrainTextures(IconRegister *iconRegister); - virtual void render(shared_ptr _itemframe, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _itemframe, double x, double y, double z, float rot, float a); private: void drawFrame(shared_ptr itemFrame); diff --git a/Minecraft.Client/ItemSpriteRenderer.h b/Minecraft.Client/ItemSpriteRenderer.h index 79499e940..a632dd951 100644 --- a/Minecraft.Client/ItemSpriteRenderer.h +++ b/Minecraft.Client/ItemSpriteRenderer.h @@ -11,7 +11,7 @@ private: public: ItemSpriteRenderer(Item *sourceItem, int sourceItemAuxValue = 0); //ItemSpriteRenderer(Item *icon); - virtual void render(shared_ptr e, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr e, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); private: diff --git a/Minecraft.Client/LeashKnotRenderer.h b/Minecraft.Client/LeashKnotRenderer.h index 6eeca5744..f54f55a8f 100644 --- a/Minecraft.Client/LeashKnotRenderer.h +++ b/Minecraft.Client/LeashKnotRenderer.h @@ -12,7 +12,7 @@ private: public: LeashKnotRenderer(); ~LeashKnotRenderer(); - virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr entity, double x, double y, double z, float rot, float a); protected: virtual ResourceLocation *getTextureLocation(shared_ptr entity); diff --git a/Minecraft.Client/LevelRenderer.cpp b/Minecraft.Client/LevelRenderer.cpp index cf2937f4f..5987ddab4 100644 --- a/Minecraft.Client/LevelRenderer.cpp +++ b/Minecraft.Client/LevelRenderer.cpp @@ -540,6 +540,7 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) TileEntityRenderDispatcher::xOff = (player->xOld + (player->x - player->xOld) * a); TileEntityRenderDispatcher::yOff = (player->yOld + (player->y - player->yOld) * a); TileEntityRenderDispatcher::zOff = (player->zOld + (player->z - player->zOld) * a); + EntityRenderDispatcher::instance->beginFrame(); mc->gameRenderer->turnOnLightLayer(a); // 4J - brought forward from 1.8.2 diff --git a/Minecraft.Client/LightningBoltRenderer.h b/Minecraft.Client/LightningBoltRenderer.h index 5a2b33a3e..fc2983949 100644 --- a/Minecraft.Client/LightningBoltRenderer.h +++ b/Minecraft.Client/LightningBoltRenderer.h @@ -4,5 +4,5 @@ class LightningBoltRenderer : public EntityRenderer { public: - virtual void render(shared_ptr bolt, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr bolt, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/LivingEntityRenderer.h b/Minecraft.Client/LivingEntityRenderer.h index 2f77e1b54..f5c4e6b4f 100644 --- a/Minecraft.Client/LivingEntityRenderer.h +++ b/Minecraft.Client/LivingEntityRenderer.h @@ -20,7 +20,7 @@ protected: public: LivingEntityRenderer(Model *model, float shadow); - virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr mob, double x, double y, double z, float rot, float a); virtual void setArmor(Model *armor); private: diff --git a/Minecraft.Client/MinecartRenderer.h b/Minecraft.Client/MinecartRenderer.h index f35092a1c..8bf508772 100644 --- a/Minecraft.Client/MinecartRenderer.h +++ b/Minecraft.Client/MinecartRenderer.h @@ -14,7 +14,7 @@ protected: public: MinecartRenderer(); - virtual void render(shared_ptr _cart, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _cart, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: diff --git a/Minecraft.Client/MobRenderer.h b/Minecraft.Client/MobRenderer.h index 6ab4af0cc..b3d7ffbcf 100644 --- a/Minecraft.Client/MobRenderer.h +++ b/Minecraft.Client/MobRenderer.h @@ -13,7 +13,7 @@ class MobRenderer : public LivingEntityRenderer { public: MobRenderer(Model *model, float shadow); - virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr mob, double x, double y, double z, float rot, float a); protected: virtual bool shouldShowName(shared_ptr mob); diff --git a/Minecraft.Client/MushroomCowRenderer.h b/Minecraft.Client/MushroomCowRenderer.h index 69dc1dd70..88e75cec4 100644 --- a/Minecraft.Client/MushroomCowRenderer.h +++ b/Minecraft.Client/MushroomCowRenderer.h @@ -9,7 +9,7 @@ private: public: MushroomCowRenderer(Model *model, float shadow); - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); protected: virtual void additionalRendering(shared_ptr _mob, float a); diff --git a/Minecraft.Client/OcelotRenderer.h b/Minecraft.Client/OcelotRenderer.h index b059a7997..20c4cb601 100644 --- a/Minecraft.Client/OcelotRenderer.h +++ b/Minecraft.Client/OcelotRenderer.h @@ -11,7 +11,7 @@ private: public: OcelotRenderer(Model *model, float shadow); - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); protected: virtual ResourceLocation *getTextureLocation(shared_ptr entity); diff --git a/Minecraft.Client/PaintingRenderer.h b/Minecraft.Client/PaintingRenderer.h index 42dacd012..9903472d4 100644 --- a/Minecraft.Client/PaintingRenderer.h +++ b/Minecraft.Client/PaintingRenderer.h @@ -12,7 +12,7 @@ private: public: PaintingRenderer(); // 4J -added - virtual void render(shared_ptr _painting, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _painting, double x, double y, double z, float rot, float a); private: void renderPainting(shared_ptr painting, int w, int h, int uo, int vo); diff --git a/Minecraft.Client/PigRenderer.h b/Minecraft.Client/PigRenderer.h index b089b6bd9..277e26e35 100644 --- a/Minecraft.Client/PigRenderer.h +++ b/Minecraft.Client/PigRenderer.h @@ -14,6 +14,6 @@ protected: virtual int prepareArmor(shared_ptr _pig, int layer, float a); public: - virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/PlayerRenderer.h b/Minecraft.Client/PlayerRenderer.h index 494ff795f..a674263b5 100644 --- a/Minecraft.Client/PlayerRenderer.h +++ b/Minecraft.Client/PlayerRenderer.h @@ -30,7 +30,7 @@ protected: virtual void prepareSecondPassArmor(shared_ptr mob, int layer, float a); public: - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); protected: virtual void additionalRendering(shared_ptr _mob, float a); diff --git a/Minecraft.Client/SheepRenderer.h b/Minecraft.Client/SheepRenderer.h index 14fe2c02f..5005b679c 100644 --- a/Minecraft.Client/SheepRenderer.h +++ b/Minecraft.Client/SheepRenderer.h @@ -14,6 +14,6 @@ protected: virtual int prepareArmor(shared_ptr _sheep, int layer, float a); public: - virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/SilverfishRenderer.h b/Minecraft.Client/SilverfishRenderer.h index 23c899bb5..96ac12d62 100644 --- a/Minecraft.Client/SilverfishRenderer.h +++ b/Minecraft.Client/SilverfishRenderer.h @@ -16,7 +16,7 @@ protected: float getFlipDegrees(shared_ptr spider); public: - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: diff --git a/Minecraft.Client/SquidRenderer.h b/Minecraft.Client/SquidRenderer.h index 876784437..d0c301ca7 100644 --- a/Minecraft.Client/SquidRenderer.h +++ b/Minecraft.Client/SquidRenderer.h @@ -8,7 +8,7 @@ private: public: SquidRenderer(Model *model, float shadow); - virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr mob, double x, double y, double z, float rot, float a); protected: virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); diff --git a/Minecraft.Client/TntRenderer.h b/Minecraft.Client/TntRenderer.h index 7aa3fa9e6..4a07cf035 100644 --- a/Minecraft.Client/TntRenderer.h +++ b/Minecraft.Client/TntRenderer.h @@ -8,6 +8,6 @@ private: public: TntRenderer(); - virtual void render(shared_ptr _tnt, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _tnt, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/VillagerGolemRenderer.h b/Minecraft.Client/VillagerGolemRenderer.h index e20fb81cd..a65d4e162 100644 --- a/Minecraft.Client/VillagerGolemRenderer.h +++ b/Minecraft.Client/VillagerGolemRenderer.h @@ -12,7 +12,7 @@ private: public: VillagerGolemRenderer(); - virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: diff --git a/Minecraft.Client/VillagerRenderer.h b/Minecraft.Client/VillagerRenderer.h index 0114bb03d..be73d7114 100644 --- a/Minecraft.Client/VillagerRenderer.h +++ b/Minecraft.Client/VillagerRenderer.h @@ -18,7 +18,7 @@ protected: public: VillagerRenderer(); - virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr _mob); protected: diff --git a/Minecraft.Client/WitchRenderer.h b/Minecraft.Client/WitchRenderer.h index c221ab344..e4c86f16a 100644 --- a/Minecraft.Client/WitchRenderer.h +++ b/Minecraft.Client/WitchRenderer.h @@ -11,7 +11,7 @@ private: public: WitchRenderer(); - virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr entity, double x, double y, double z, float rot, float a); protected: virtual ResourceLocation *getTextureLocation(shared_ptr entity); diff --git a/Minecraft.Client/WitherBossRenderer.h b/Minecraft.Client/WitherBossRenderer.h index 5e567d11e..2c0ca7871 100644 --- a/Minecraft.Client/WitherBossRenderer.h +++ b/Minecraft.Client/WitherBossRenderer.h @@ -14,7 +14,7 @@ private: public: WitherBossRenderer(); - virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr entity, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr entity); protected: diff --git a/Minecraft.Client/WitherSkullRenderer.h b/Minecraft.Client/WitherSkullRenderer.h index eaf0f005c..58793ae23 100644 --- a/Minecraft.Client/WitherSkullRenderer.h +++ b/Minecraft.Client/WitherSkullRenderer.h @@ -13,7 +13,7 @@ private: public: WitherSkullRenderer(); - void render(shared_ptr entity, double x, double y, double z, float rot, float a); + void render(const shared_ptr entity, double x, double y, double z, float rot, float a); ResourceLocation *getTextureLocation(shared_ptr entity); private: diff --git a/Minecraft.Client/ZombieRenderer.h b/Minecraft.Client/ZombieRenderer.h index c8f110b18..99f7a182a 100644 --- a/Minecraft.Client/ZombieRenderer.h +++ b/Minecraft.Client/ZombieRenderer.h @@ -31,7 +31,7 @@ protected: virtual int prepareArmor(shared_ptr _mob, int layer, float a); public: - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(const shared_ptr _mob, double x, double y, double z, float rot, float a); virtual ResourceLocation *getTextureLocation(shared_ptr entity); protected: diff --git a/Minecraft.World/PathfinderMob.cpp b/Minecraft.World/PathfinderMob.cpp index 840a60208..983494bee 100644 --- a/Minecraft.World/PathfinderMob.cpp +++ b/Minecraft.World/PathfinderMob.cpp @@ -40,6 +40,7 @@ PathfinderMob::~PathfinderMob() void PathfinderMob::serverAiStep() { + auto self = shared_from_this(); if (fleeTime > 0) { if (--fleeTime == 0) @@ -56,14 +57,14 @@ void PathfinderMob::serverAiStep() attackTarget = findAttackTarget(); if (attackTarget != nullptr) { - setPath(level->findPath(shared_from_this(), attackTarget, maxDist, true, false, false, true)); // 4J - changed to setPath from path = + setPath(level->findPath(self, attackTarget, maxDist, true, false, false, true)); // 4J - changed to setPath from path = } } else { if (attackTarget->isAlive()) { - float d = attackTarget->distanceTo(shared_from_this()); + float d = attackTarget->distanceTo(self); if (canSee(attackTarget)) { checkHurtTarget(attackTarget, d); @@ -86,7 +87,7 @@ void PathfinderMob::serverAiStep() if (!holdGround && (attackTarget != nullptr && (path == nullptr || random->nextInt(20) == 0))) { - setPath(level->findPath(shared_from_this(), attackTarget, maxDist, true, false, false, true));// 4J - changed to setPath from path = + setPath(level->findPath(self, attackTarget, maxDist, true, false, false, true));// 4J - changed to setPath from path = } else if (!holdGround && ((path == nullptr && (random->nextInt(180) == 0) || fleeTime > 0) || (random->nextInt(120) == 0 || fleeTime > 0))) { @@ -111,18 +112,17 @@ void PathfinderMob::serverAiStep() considerForExtraWandering( isDespawnProtected() ); int yFloor = Mth::floor(bb->y0 + 0.5f); - + xRot = 0; + if (path == nullptr || random->nextInt(100) == 0) + { + this->Mob::serverAiStep(); + setPath(nullptr); // 4J - changed to setPath from path = + return; + } bool inWater = isInWater(); bool inLava = isInLava(); - xRot = 0; - if (path == nullptr || random->nextInt(100) == 0) - { - this->Mob::serverAiStep(); - setPath(nullptr);// 4J - changed to setPath from path = - return; - } - Vec3 *target = path->currentPos(shared_from_this()); + Vec3 *target = path->currentPos(self); double r = bbWidth * 2; while (target != nullptr && target->distanceToSqr(x, target->y, z) < r * r) { @@ -132,7 +132,7 @@ void PathfinderMob::serverAiStep() target = nullptr; setPath(nullptr); // 4J - changed to setPath from path = } - else target = path->currentPos(shared_from_this()); + else target = path->currentPos(self); } jumping = false; @@ -221,7 +221,7 @@ void PathfinderMob::findRandomStrollLocation(int quadrant/*=-1*/) // 4J - added } if (hasBest) { - setPath(level->findPath(shared_from_this(), xBest, yBest, zBest, 10, true, false, false, true)); // 4J - changed to setPath from path = + setPath(level->findPath(shared_from_this(), xBest, yBest, zBest, 10, true, false, false, true)); // 4J - changed to setPath from path = } }