Files
neoStudiosLCE-neoLegacy/Minecraft.Client/MobAppearanceParticle.cpp
2026-05-03 17:59:57 +03:00

151 lines
4.0 KiB
C++

#include "stdafx.h"
#include "MobAppearanceParticle.h"
#include "EntityRenderDispatcher.h"
#include "../Minecraft.World/Guardian.h"
#include "../Minecraft.World/Level.h"
MobAppearanceParticle::MobAppearanceParticle(Level* level, double x, double y, double z)
: Particle(level, x, y, z, 0.0, 0.0, 0.0)
{
this->rCol = 1.0f;
this->gCol = 1.0f;
this->bCol = 1.0f;
this->xd = 0.0;
this->yd = 0.0;
this->zd = 0.0;
this->gravity = 0.0f;
this->lifetime = 30;
this->alpha = 0.5;
}
MobAppearanceParticle::~MobAppearanceParticle() {}
int MobAppearanceParticle::getParticleTexture()
{
return 3;
}
eINSTANCEOF MobAppearanceParticle::GetType()
{
return (eINSTANCEOF)eTYPE_ELDER_GUARDIAN;
}
void MobAppearanceParticle::tick()
{
if (guardianEntity == nullptr)
{
auto g = std::make_shared<Guardian>(level);
g->setElderClient();
guardianEntity = g;
}
Particle::tick();
}
void MobAppearanceParticle::render(
Tesselator* /*t*/,
float partialTicks,
float /*xa*/,
float /*ya*/,
float /*za*/,
float /*xa2*/,
float /*za2*/)
{
if (guardianEntity == nullptr)
return;
shared_ptr<LivingEntity> cameraEntity = EntityRenderDispatcher::instance->cameraEntity;
if (cameraEntity == nullptr)
return;
{
double dx = cameraEntity->x - x;
double dy = cameraEntity->y - y;
double dz = cameraEntity->z - z;
if (dx*dx + dy*dy + dz*dz > 4.0 * 4.0)
return;
}
float progress = ((float)age + partialTicks) / (float)lifetime;
float alpha = 0.05f + 0.5f * sinf(progress * (float)PI);
const float scale = 1.0f / 2.35f;
const float fullBright = 240.0f;
double camX = cameraEntity->xOld + (cameraEntity->x - cameraEntity->xOld) * partialTicks;
double camY = cameraEntity->yOld + (cameraEntity->y - cameraEntity->yOld) * partialTicks;
double camZ = cameraEntity->zOld + (cameraEntity->z - cameraEntity->zOld) * partialTicks;
float camYaw = cameraEntity->yRotO + (cameraEntity->yRot - cameraEntity->yRotO) * partialTicks;
float camPitch = cameraEntity->xRotO + (cameraEntity->xRot - cameraEntity->xRotO) * partialTicks;
double savedXOff = EntityRenderDispatcher::xOff;
double savedYOff = EntityRenderDispatcher::yOff;
double savedZOff = EntityRenderDispatcher::zOff;
EntityRenderDispatcher::xOff = camX;
EntityRenderDispatcher::yOff = camY;
EntityRenderDispatcher::zOff = camZ;
glMultiTexCoord2f(GL_TEXTURE1, fullBright, fullBright);
glDepthMask(true);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPushMatrix();
float px = (float)(camX - Particle::xOff);
float py = (float)(camY - Particle::yOff);
float pz = (float)(camZ - Particle::zOff);
glTranslatef(px, py, pz);
glColor4f(1.0f, 1.0f, 1.0f, alpha);
glTranslatef(0.0f, 0.0f, 0.0f);
glRotatef(180.0f - camYaw, 0.0f, 1.0f, 0.0f);
glRotatef(60.0f - 150.0f * progress - camPitch, 1.0f, 0.0f, 0.0f);
glTranslatef(0.0f, -0.4f, -1.5f);
glScalef(scale, scale, scale);
guardianEntity->yRot = guardianEntity->yRotO = 0.0f;
guardianEntity->xRot = guardianEntity->xRotO = 0.0f;
EntityRenderDispatcher::instance->render(
guardianEntity,
0.0, 0.0, 0.0,
0.0f,
partialTicks);
glPopMatrix();
EntityRenderDispatcher::xOff = savedXOff;
EntityRenderDispatcher::yOff = savedYOff;
EntityRenderDispatcher::zOff = savedZOff;
glEnable(GL_DEPTH_TEST);
glDepthMask(true);
}
shared_ptr<Particle> MobAppearanceParticle::Provider::createParticle(
ePARTICLE_TYPE /*type*/,
Level* level,
double x,
double y,
double z,
arrayWithLength<int> /*params*/)
{
return std::make_shared<MobAppearanceParticle>(level, x, y, z);
}