void ZEffectManager::AddDamageEffect(int Dmg, ZObject* pObj, ZObject* pOwner)
{
if (Dmg == 0) return;
class ZEffectDmgfloating : public ZEffectIcon {
public:
ZEffectDmgfloating(RMesh* pMesh, ZObject* pObj)
: ZEffectIcon(pMesh, pObj) {
}
virtual bool Draw(unsigned long int nTime)
{
ZObject* pObj = ZGetObjectManager()->GetObject(m_uid);
ZCharacter* pChar = MDynamicCast(ZCharacter, pObj);
if (pChar) {
if (!pChar->m_bRendered) return true;
if (!pChar->IsVisible()) return true;
if (pObj->m_pVMesh) {
m_Pos = pObj->GetVisualMesh()->GetHeadPosition() + rvector(0, 0, 50); // + rvector(0, 0, height)
RGetDevice()->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
ZEffectAniMesh::Draw(nTime);
RGetDevice()->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
return true;
}
}
return false;
}
};
ZEffect* pNew = NULL;
char buffer[32];
sprintf(buffer, "%d", abs(Dmg));
int nCount = (int)strlen(buffer);
float fScale, dist;
float dx = pObj->GetPosition().x - pOwner->GetPosition().x;
float dy = pObj->GetPosition().y - pOwner->GetPosition().y;
float dz = pObj->GetPosition().z - pOwner->GetPosition().z;
dist = sqrt(dx * dx + dy * dy + dz * dz);
for (int i = 0; i < nCount; i++)
{
if (nCount == 3)
{
if (i == 0) {
pNew = new ZEffectDmgfloating(m_pDamageFloat[buffer[i] - '0'], pObj);
DeleteSameType((ZEffectAniMesh*)pNew);
}
if (i == 1)
pNew = new ZEffectDmgfloating(m_pDamageFloatx[buffer[i] - '0'], pObj);
if (i == 2)
pNew = new ZEffectDmgfloating(m_pDamageFloatxx[buffer[i] - '0'], pObj);
}
if (nCount == 2)
{
if (i == 0) {
pNew = new ZEffectDmgfloating(m_pDamageFloatx[buffer[i] - '0'], pObj);
DeleteSameType((ZEffectAniMesh*)pNew);
}
if (i == 1)
pNew = new ZEffectDmgfloating(m_pDamageFloatxx[buffer[i] - '0'], pObj);
}
if (nCount == 1)
{
if (i == 0) {
pNew = new ZEffectDmgfloating(m_pDamageFloatx[buffer[i] - '0'], pObj);
DeleteSameType((ZEffectAniMesh*)pNew);
}
}
fScale = 1.0f + 0.001f * dist; //Size adjustment according to distance
((ZEffectDmgfloating*)pNew)->SetScale(rvector(fScale, fScale, fScale));
Add(pNew);
}
}