• Unfortunately, we have experienced significant hard drive damage that requires urgent maintenance and rebuilding. The forum will be a state of read only until we install our new drives and rebuild all the configurations needed. Please follow our Facebook page for updates, we will be back up shortly! (The forum could go offline at any given time due to the nature of the failed drives whilst awaiting the upgrades.) When you see an Incapsula error, you know we are in the process of migration.

[Release]Damage Floating (Edit_April 19, 2024)

Newbie Spellweaver
Joined
Dec 21, 2014
Messages
11
Reaction score
14
Code:
Credit : Desperate (There have been some improvements based on the code provided by Desperate.)
https://forum.ragezone.com/threads/damage-floting.1227246/post-9253385
--
I was asked to upload it on the board, and also got permission from Desperate.

Of course, if use text, it will be much easier to implement, but if use elu, you will be able to use more diverse designs and animations.

I made a little improvement on this. (dmg floating using elu and ani)
but the problem regarding the horizontal movement of the elu's w2s has not yet been resolved.
Instead, I changed the position data of the elu itself. (It's a little trick. lol)

First of all, please use the attached file's elu.
(To prevent numbers from overlapping)
- We need to figure out how we can do horizontal control to optimize this.


-> Finally solved the horizontal control. :)😄

We need your contribution to developing more upgraded codes.



----------------------------------------------------------------------------

Gunz -> ZEffectManager.h

Find
C++:
class ZEffectManager

-> Add inside (protected)
C++:
RMeshMgr* m_pEffectMeshDmg; 
RMesh* m_pDamageFloatx[10];

-> Add inside too (public)
C++:
void AddDamageEffect(int Dmg, ZObject* pObj, ZObject* pOwner);

----------------------------------------------------------------------------

Gunz -> ZeffectManager.cpp

Add
C++:
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, fPosX;

    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_pDamageFloatx[buffer[i] - '0'], pObj);
                DeleteSameType((ZEffectAniMesh*)pNew);
                fPosX = -25; // You can adjust the Horizontal of the elu by changing the fPosX.
            }                         // The default width of the elu provided is 24.
            if (i == 1) {
                pNew = new ZEffectDmgfloating(m_pDamageFloatx[buffer[i] - '0'], pObj);
                fPosX = 0;
            }
            if (i == 2) {
                pNew = new ZEffectDmgfloating(m_pDamageFloatx[buffer[i] - '0'], pObj);
                fPosX = 25;
            }
        }
        if (nCount == 2)
        {
            if (i == 0) {
                pNew = new ZEffectDmgfloating(m_pDamageFloatx[buffer[i] - '0'], pObj);
                DeleteSameType((ZEffectAniMesh*)pNew);
                fPosX = 0;
            }
            if (i == 1) {
                pNew = new ZEffectDmgfloating(m_pDamageFloatx[buffer[i] - '0'], pObj);
                fPosX = 25;
            }
        }
        if (nCount == 1)
        {
            if (i == 0) {
                pNew = new ZEffectDmgfloating(m_pDamageFloatx[buffer[i] - '0'], pObj);
                DeleteSameType((ZEffectAniMesh*)pNew);
                fPosX = 0;
            }
        }

        fScale = 1.0f + 0.001f * dist; //Adjusting the size by distance
        fPosX = fPosX + 0.001f * dist * fPosX; //Adjusting the Letter-spacing by distance
        ((ZEffectDmgfloating*)pNew)->SetScale(rvector(fScale, fScale, fScale));
        ((ZEffectDmgfloating*)pNew)->SetwPos(fPosX);
        ((ZEffectDmgfloating*)pNew)->SetwPosS(true);
        Add(pNew);
    }
}

Find
C++:
bool ZEffectManager::Create(void)

-> Add inside
C++:
    m_pEffectMeshDmg = new RMeshMgr;
    if (m_pEffectMeshDmg->LoadXmlList("SFX/dmg/float_damage.xml") == -1) {
        mlog("float damage sfx loding error\n");
    }

    for (int i = 0; i < 10; i++)
    {
        char meshnamex[256];
        sprintf(meshnamex, "dmgx%d", i);
        m_pDamageFloatx[i] = m_pEffectMeshDmg->Get(meshnamex);
    }
----------------------------------------------------------------------------

Gunz -> ZCharacter.h

Find
C++:
struct ZCharacterStatus

-> Add inside And on top of 'nScore;'
C++:
float        nRoundGivenDamage;
----
nRoundGivenDamage(0),

----------------------------------------------------------------------------

Gunz -> ZGame.h

Find
C++:
void OnPeerShotgun_Damaged(~~);

-> Change (Add `int Repeatcount` at the far end of the factor)
C++:
void OnPeerShotgun_Damaged(ZObject* pOwner, float fShotTime, const rvector& pos, rvector& dir, ZPICKINFO pickinfo, DWORD dwPickPassFlag, rvector& v1, rvector& v2, ZItem* pItem, rvector& BulletMarkNormal, bool& bBulletMark, ZTargetType& nTargetType, bool& bHitEnemy, int Repeatcount);

----------------------------------------------------------------------------

Gunz -> ZGame.cpp

Find
C++:
void ZGame::OnPeerShot_Range_Damaged

-> Add inside (In the part where you calculate the damage)
C++:
ZGetGame()->m_pMyCharacter->GetStatus().CheckCrc();
ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage = fActualDamage;
 ZGetGame()->m_pMyCharacter->GetStatus().MakeCrc();

-> Add inside too (OnPeerShot_Range_Damaged's end)
C++:
    if ((pObject->GetUID() != ZGetMyUID()) && (pOwner->GetUID() == ZGetMyUID()))
    {
        int nCurrDamage = ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage;
        ZGetEffectManager()->AddDamageEffect(nCurrDamage, pObject, pOwner);
    }

Find
C++:
in the 'void ZGame::OnPeerShot_Shotgun'
OnPeerShotgun_Damaged( pOwnerCharacter, fShotTime, pos, dir, pickinfo, dwPickPassFlag, v1, v2, pItem, BulletMarkNormal, bBulletMark, nTargetType, bHitEnemy);

Change (Add `i` at the far end of the factor)
C++:
OnPeerShotgun_Damaged( pOwnerCharacter, fShotTime, pos, dir, pickinfo, dwPickPassFlag, v1, v2, pItem, BulletMarkNormal, bBulletMark, nTargetType, bHitEnemy, i);

Find
C++:
void ZGame::OnPeerShotgun_Damaged

-> Change (Add `int Repeatcount` at the far end of the factor)
C++:
void ZGame::OnPeerShotgun_Damaged(ZObject* pOwner, float fShotTime, const rvector& pos, rvector& dir, ZPICKINFO pickinfo, DWORD dwPickPassFlag, rvector& v1, rvector& v2, ZItem *pItem, rvector& BulletMarkNormal, bool& bBulletMark, ZTargetType& nTargetType, bool& bHitEnemy, int Repeatcount)

-> Add inside
C++:
//Initialize the variable at the first of the iterations of this function
    if (Repeatcount == 0) {
        ZGetGame()->m_pMyCharacter->GetStatus().CheckCrc();
        ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage = 0;
        ZGetGame()->m_pMyCharacter->GetStatus().MakeCrc();
    }

-> Add inside too (In the part where you calculate the SG damage)
C++:
ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage += fActualDamage;

-> Add inside too
C++:
if ((pObject->GetUID() != ZGetMyUID()) && (pOwner->GetUID() == ZGetMyUID()))
{
     int nCurrDamage = ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage;
     ZGetEffectManager()->AddDamageEffect(nCurrDamage, pObject, pOwner);
}

-> Melee
C++:
void ZGame::OnPeerShot_Melee

-> Explosion(rocket, granade)
C++:
void ZGame::OnExplosionGrenade

If you don't want to output when you attack mob, add this to the condition of calling AddDamageEffect.
Verify that the target is npc(mobs).
C++:
!pObject->IsNPC()

----------------------------------------------------------------------------

Gunz -> ZEffectAniMesh.h

Find
C++:
class ZEffectAniMesh : public ZEffect

-> Add inside (protected)
C++:
    float    m_wPosX;
    bool    m_wPosS;

-> Add inside too(public)
C++:
    void SetwPos(float a);
    void SetwPosS(bool b);

----------------------------------------------------------------------------

Gunz -> ZEffectAniMesh.cpp

Find
C++:
void ZEffectAniMesh::SetScale(rvector s)

-> Add Under
C++:
void ZEffectAniMesh::SetwPos(float a)
{
    m_wPosX = a;
}

void ZEffectAniMesh::SetwPosS(bool b)
{
    m_wPosS = b;
}

Find
C++:
ZEffectAniMesh::ZEffectAniMesh(RMesh* pMesh, const rvector& Pos, rvector& dir)

-> Add inside
C++:
    m_wPosS        = false;
    m_wPosX        = 0;

Find
C++:
bool ZEffectAniMesh::Draw(unsigned long int nTime)

-> Find inside
C++:
MakeWorldMatrix(&World, m_Pos, Dir, Up);

-> Add under 'MakeWorldMatrix'
C++:
    if (m_wPosS == true)
    {
        rmatrix _tPosWorld;

        D3DXMatrixTranslation(&_tPosWorld, m_wPosX, 0, 0);
        World = _tPosWorld * World;
    }
----------------------------------------------------------------------------

SFX.mrs/dmg/float_damage.xml
XML:
<!-- Dmg Floating -->
    <AddEffectElu name="dmgx0">
        <AddBaseModel name="dmgx0" filename="dmg/ef_exp_num_x0.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x0.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
    <AddEffectElu name="dmgx1">
        <AddBaseModel name="dmgx1" filename="dmg/ef_exp_num_x1.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x1.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
    <AddEffectElu name="dmgx2">
        <AddBaseModel name="dmgx2" filename="dmg/ef_exp_num_x2.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x2.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
    <AddEffectElu name="dmgx3">
        <AddBaseModel name="dmgx3" filename="dmg/ef_exp_num_x3.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x3.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
    <AddEffectElu name="dmgx4">
        <AddBaseModel name="dmgx4" filename="dmg/ef_exp_num_x4.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x4.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
    <AddEffectElu name="dmgx5">
        <AddBaseModel name="dmgx5" filename="dmg/ef_exp_num_x5.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x5.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
    <AddEffectElu name="dmgx6">
        <AddBaseModel name="dmgx6" filename="dmg/ef_exp_num_x6.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x6.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
    <AddEffectElu name="dmgx7">
        <AddBaseModel name="dmgx7" filename="dmg/ef_exp_num_x7.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x7.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
    <AddEffectElu name="dmgx8">
        <AddBaseModel name="dmgx8" filename="dmg/ef_exp_num_x8.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x8.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
    <AddEffectElu name="dmgx9">
        <AddBaseModel name="dmgx9" filename="dmg/ef_exp_num_x9.elu" />
        <AddAnimation name="play" filename="dmg/ef_exp_num_x9.elu.ani" motion_type="0" motion_loop_type="lastframe" />
    </AddEffectElu>
 

Attachments

You must be registered for see attachments list
Last edited:

Yue

Newbie Spellweaver
Joined
Oct 27, 2017
Messages
11
Reaction score
3
thank you very much, there's a guy try to sell dmg floating for 400$ lmao
 
Experienced Elementalist
Joined
Oct 14, 2015
Messages
293
Reaction score
86
This is a super function xD, but it will be of great help if you were looking for this.
 
Newbie Spellweaver
Joined
Dec 21, 2014
Messages
11
Reaction score
14
It succeeded in outputting using only one type of elu.

There was a problem that the number overlapped as the distance increased.
I applied the distance value to solve it so that it does not overlap.

Can now move the Horizontal a little more freely.

I edit the post.
 
Last edited:
Newbie Spellweaver
Joined
Jan 12, 2022
Messages
26
Reaction score
2
They should put the complete code with all the exact lines where to place it, some of us cannot compile it, it gives many errors because it is missing lines that are not declared :cry::cry::cry::cry::cry::cry::cry::cry:
 
Newbie Spellweaver
Joined
Dec 21, 2014
Messages
11
Reaction score
14
They should put the complete code with all the exact lines where to place it, some of us cannot compile it, it gives many errors because it is missing lines that are not declared :cry::cry::cry::cry::cry::cry::cry::cry:
Based on jetman's 1.5 source code.
Perhaps for most people who use the 1.5 code, there is nothing else to add other than the declaration of the additional variables I mentioned.

Can you tell me what kind of error it is? :)
 
Newbie Spellweaver
Joined
Apr 5, 2024
Messages
10
Reaction score
1
I'm new to Visual Studio and I'm having trouble, where exactly do I add it?

C++:
ZGetGame()->m_pMyCharacter->GetStatus().CheckCrc();
ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage = fActualDamage;
 ZGetGame()->m_pMyCharacter->GetStatus().MakeCrc();


ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage += fActualDamage;

ZGame.cpp
C++:
void ZGame::OnPeerShot_Range_Damaged(ZObject* pOwner, float fShotTime, const rvector& pos, const rvector& to, ZPICKINFO pickinfo, DWORD dwPickPassFlag, rvector& v1, rvector& v2, ZItem *pItem, rvector& BulletMarkNormal, bool& bBulletMark, ZTargetType& nTargetType)
{
    MMatchItemDesc *pDesc = pItem->GetDesc();
    bool bReturnValue = !pDesc;
    if (!pDesc) PROTECT_DEBUG_REGISTER(bReturnValue){ return; }

    rvector dir = to - pos;

    bReturnValue = !(ZGetGame()->PickHistory(pOwner, fShotTime, pos, to, &pickinfo, dwPickPassFlag));
    if (!(ZGetGame()->PickHistory(pOwner, fShotTime, pos, to, &pickinfo, dwPickPassFlag)))
    {
        PROTECT_DEBUG_REGISTER(bReturnValue)
        {
            v1 = pos;
            v2 = pos + dir*10000.f;
            nTargetType = ZTT_NOTHING;
            return;
        }
    }

    // ¶«»§ -bird
    //jintriple3 µð¹ö±× ·¹Áö½ºÅÍ ÇØÅ· ¹æÁö ÄÚµå
    bReturnValue = (!pickinfo.pObject) && (!pickinfo.bBspPicked);
    if (pickinfo.bBspPicked)
    {
        PROTECT_DEBUG_REGISTER(pickinfo.nBspPicked_DebugRegister == FOR_DEBUG_REGISTER)
        {
            nTargetType = ZTT_OBJECT;

            v1 = pos;
            v2 = pickinfo.bpi.PickPos;

            // ÃÑź ÈçÀû
            BulletMarkNormal.x = pickinfo.bpi.pInfo->plane.a;
            BulletMarkNormal.y = pickinfo.bpi.pInfo->plane.b;
            BulletMarkNormal.z = pickinfo.bpi.pInfo->plane.c;
            Normalize(BulletMarkNormal);
            bBulletMark = true;
            return;
        }
    }
    else if ((!pickinfo.pObject) && (!pickinfo.bBspPicked))
    {
        PROTECT_DEBUG_REGISTER(bReturnValue)
        {
            //_ASSERT(false);
            return;
        }
    }
    //À§¿¡±îÁö´Â °Ë»ç ´Ü°è...

    ZObject *pObject = pickinfo.pObject;
    bool bGuard = pObject->IsGuard() && (pickinfo.info.parts != eq_parts_legs) &&        // ´Ù¸®´Â ¸·À»¼ö¾ø´Ù
        DotProduct(dir, pObject->GetDirection())<0;

    if (pObject->IsGuard() && (pickinfo.info.parts != eq_parts_legs) &&        // ´Ù¸®´Â ¸·À»¼ö¾ø´Ù
        DotProduct(dir, pObject->GetDirection())<0) //¿©±âµµ..
    {
        PROTECT_DEBUG_REGISTER(bGuard)
        {
            nTargetType = ZTT_CHARACTER_GUARD;
            // ¸·¾Ò´Ù
            rvector t_pos = pObject->GetPosition();
            t_pos.z += 100.f;
            ZGetEffectManager()->AddSwordDefenceEffect(t_pos + (-dir*50.f), -dir);
            pObject->OnGuardSuccess();
            v1 = pos;
            v2 = pickinfo.info.vOut;
            return;
        }
    }

    nTargetType = ZTT_CHARACTER;

    ZActor* pATarget = MDynamicCast(ZActor, pickinfo.pObject);

    bool bPushSkip = false;

    if (pATarget)
    {
        bPushSkip = pATarget->GetNPCInfo()->bNeverPushed;
    }

    float fKnockbackForce = pItem->GetKnockbackForce();

    if (bPushSkip)
    {
        //                    ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met");
        rvector vPos = pOwner->GetPosition() + (pickinfo.pObject->GetPosition() - pOwner->GetPosition()) * 0.1f;
        ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met", vPos);
        fKnockbackForce = 1.0f;
    }

    pickinfo.pObject->OnKnockback(pOwner->m_Direction, fKnockbackForce);

    float fActualDamage = CalcActualDamage(pOwner, pickinfo.pObject, (float)pDesc->m_nDamage.Ref());
    float fRatio = pItem->GetPiercingRatio(pDesc->m_nWeaponType.Ref(), pickinfo.info.parts);
    ZDAMAGETYPE dt = (pickinfo.info.parts == eq_parts_head) ? ZD_BULLET_HEADSHOT : ZD_BULLET;

    if (ZGetGameClient()->GetChannelType() == MCHANNEL_TYPE_CLAN)
    {

        if (ZGetGameClient()->GetMatchStageSetting()->GetAntiLead() == false) {
            pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
        else {
            ((ZCharacter*)(pickinfo.pObject))->OnDamagedAPlayer(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }

    }
    else if (ZGetGameClient()->GetChannelType() == MCHANNEL_TYPE_DUELTOURNAMENT)
    {
        if (strstr(ZGetGameClient()->GetChannelName(), "Lead"))
        {
            pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
        else {
            ((ZCharacter*)(pickinfo.pObject))->OnDamagedAPlayer(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
    }
    else
    {
        if (pickinfo.pObject->IsNPC() == true || strstr(ZGetGameClient()->GetChannelName(), "Lead") || (ZGetGame() && !ZGetGame()->m_likeBoss)) //Pause Command
        {
            pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
        else
        {
            ((ZCharacter*)(pickinfo.pObject))->OnDamagedAPlayer(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }

    }


    if (pOwner == m_pMyCharacter)
    {
        CheckCombo(m_pMyCharacter, pickinfo.pObject, !bPushSkip);
        CheckStylishAction(m_pMyCharacter);
    }

    v1 = pos;
    v2 = pickinfo.info.vOut;

    if ((pObject->GetUID() != ZGetMyUID()) && (pOwner->GetUID() == ZGetMyUID()))
    {
        int nCurrDamage = ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage;
        ZGetEffectManager()->AddDamageEffect(nCurrDamage, pObject, pOwner);
    }
}
 
Newbie Spellweaver
Joined
Dec 21, 2014
Messages
11
Reaction score
14
I'm new to Visual Studio and I'm having trouble, where exactly do I add it?

C++:
ZGetGame()->m_pMyCharacter->GetStatus().CheckCrc();
ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage = fActualDamage;
 ZGetGame()->m_pMyCharacter->GetStatus().MakeCrc();


ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage += fActualDamage;

ZGame.cpp
C++:
void ZGame::OnPeerShot_Range_Damaged(ZObject* pOwner, float fShotTime, const rvector& pos, const rvector& to, ZPICKINFO pickinfo, DWORD dwPickPassFlag, rvector& v1, rvector& v2, ZItem *pItem, rvector& BulletMarkNormal, bool& bBulletMark, ZTargetType& nTargetType)
{
    MMatchItemDesc *pDesc = pItem->GetDesc();
    bool bReturnValue = !pDesc;
    if (!pDesc) PROTECT_DEBUG_REGISTER(bReturnValue){ return; }

    rvector dir = to - pos;

    bReturnValue = !(ZGetGame()->PickHistory(pOwner, fShotTime, pos, to, &pickinfo, dwPickPassFlag));
    if (!(ZGetGame()->PickHistory(pOwner, fShotTime, pos, to, &pickinfo, dwPickPassFlag)))
    {
        PROTECT_DEBUG_REGISTER(bReturnValue)
        {
            v1 = pos;
            v2 = pos + dir*10000.f;
            nTargetType = ZTT_NOTHING;
            return;
        }
    }

    // ¶«»§ -bird
    //jintriple3 µð¹ö±× ·¹Áö½ºÅÍ ÇØÅ· ¹æÁö ÄÚµå
    bReturnValue = (!pickinfo.pObject) && (!pickinfo.bBspPicked);
    if (pickinfo.bBspPicked)
    {
        PROTECT_DEBUG_REGISTER(pickinfo.nBspPicked_DebugRegister == FOR_DEBUG_REGISTER)
        {
            nTargetType = ZTT_OBJECT;

            v1 = pos;
            v2 = pickinfo.bpi.PickPos;

            // ÃÑź ÈçÀû
            BulletMarkNormal.x = pickinfo.bpi.pInfo->plane.a;
            BulletMarkNormal.y = pickinfo.bpi.pInfo->plane.b;
            BulletMarkNormal.z = pickinfo.bpi.pInfo->plane.c;
            Normalize(BulletMarkNormal);
            bBulletMark = true;
            return;
        }
    }
    else if ((!pickinfo.pObject) && (!pickinfo.bBspPicked))
    {
        PROTECT_DEBUG_REGISTER(bReturnValue)
        {
            //_ASSERT(false);
            return;
        }
    }
    //À§¿¡±îÁö´Â °Ë»ç ´Ü°è...

    ZObject *pObject = pickinfo.pObject;
    bool bGuard = pObject->IsGuard() && (pickinfo.info.parts != eq_parts_legs) &&        // ´Ù¸®´Â ¸·À»¼ö¾ø´Ù
        DotProduct(dir, pObject->GetDirection())<0;

    if (pObject->IsGuard() && (pickinfo.info.parts != eq_parts_legs) &&        // ´Ù¸®´Â ¸·À»¼ö¾ø´Ù
        DotProduct(dir, pObject->GetDirection())<0) //¿©±âµµ..
    {
        PROTECT_DEBUG_REGISTER(bGuard)
        {
            nTargetType = ZTT_CHARACTER_GUARD;
            // ¸·¾Ò´Ù
            rvector t_pos = pObject->GetPosition();
            t_pos.z += 100.f;
            ZGetEffectManager()->AddSwordDefenceEffect(t_pos + (-dir*50.f), -dir);
            pObject->OnGuardSuccess();
            v1 = pos;
            v2 = pickinfo.info.vOut;
            return;
        }
    }

    nTargetType = ZTT_CHARACTER;

    ZActor* pATarget = MDynamicCast(ZActor, pickinfo.pObject);

    bool bPushSkip = false;

    if (pATarget)
    {
        bPushSkip = pATarget->GetNPCInfo()->bNeverPushed;
    }

    float fKnockbackForce = pItem->GetKnockbackForce();

    if (bPushSkip)
    {
        //                    ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met");
        rvector vPos = pOwner->GetPosition() + (pickinfo.pObject->GetPosition() - pOwner->GetPosition()) * 0.1f;
        ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met", vPos);
        fKnockbackForce = 1.0f;
    }

    pickinfo.pObject->OnKnockback(pOwner->m_Direction, fKnockbackForce);

    float fActualDamage = CalcActualDamage(pOwner, pickinfo.pObject, (float)pDesc->m_nDamage.Ref());
    float fRatio = pItem->GetPiercingRatio(pDesc->m_nWeaponType.Ref(), pickinfo.info.parts);
    ZDAMAGETYPE dt = (pickinfo.info.parts == eq_parts_head) ? ZD_BULLET_HEADSHOT : ZD_BULLET;

    if (ZGetGameClient()->GetChannelType() == MCHANNEL_TYPE_CLAN)
    {

        if (ZGetGameClient()->GetMatchStageSetting()->GetAntiLead() == false) {
            pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
        else {
            ((ZCharacter*)(pickinfo.pObject))->OnDamagedAPlayer(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }

    }
    else if (ZGetGameClient()->GetChannelType() == MCHANNEL_TYPE_DUELTOURNAMENT)
    {
        if (strstr(ZGetGameClient()->GetChannelName(), "Lead"))
        {
            pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
        else {
            ((ZCharacter*)(pickinfo.pObject))->OnDamagedAPlayer(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
    }
    else
    {
        if (pickinfo.pObject->IsNPC() == true || strstr(ZGetGameClient()->GetChannelName(), "Lead") || (ZGetGame() && !ZGetGame()->m_likeBoss)) //Pause Command
        {
            pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
        else
        {
            ((ZCharacter*)(pickinfo.pObject))->OnDamagedAPlayer(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }

    }


    if (pOwner == m_pMyCharacter)
    {
        CheckCombo(m_pMyCharacter, pickinfo.pObject, !bPushSkip);
        CheckStylishAction(m_pMyCharacter);
    }

    v1 = pos;
    v2 = pickinfo.info.vOut;

    if ((pObject->GetUID() != ZGetMyUID()) && (pOwner->GetUID() == ZGetMyUID()))
    {
        int nCurrDamage = ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage;
        ZGetEffectManager()->AddDamageEffect(nCurrDamage, pObject, pOwner);
    }
}

C++:
float fActualDamage = CalcActualDamage(pOwner, pickinfo.pObject, (float)pDesc->m_nDamage.Ref());

Place it in between after this code and before 'AddDamage Effect' is called.
ex)above 'if (pOwner == m_pMyCharacter)'
 
Newbie Spellweaver
Joined
Apr 5, 2024
Messages
10
Reaction score
1
C++:
float fActualDamage = CalcActualDamage(pOwner, pickinfo.pObject, (float)pDesc->m_nDamage.Ref());

Place it in between after this code and before 'AddDamage Effect' is called.
ex)above 'if (pOwner == m_pMyCharacter)'
It didn't work, I probably added something in the wrong place... take a look please.
 

Attachments

You must be registered for see attachments list
Newbie Spellweaver
Joined
Apr 5, 2024
Messages
10
Reaction score
1
in loadXmlList I put the xml file directly in SFX

can it be share you cpp/h before and add ? thanks
I put //damage floating above in all the added codes to make the search easier, I probably added something in the wrong place and thank you very much for your attention.
 

Attachments

You must be registered for see attachments list
Last edited:
Newbie Spellweaver
Joined
Dec 21, 2014
Messages
11
Reaction score
14
in loadXmlList I put the xml file directly in SFX


I put //damage floating above in all the added codes to make the search easier, I probably added something in the wrong place and thank you very much for your attention.
Zgame.cpp -> onpeershotgun_damaged wrong :)
I revised the attached your cpp referring to your screenshot.

edit to
C++:
MTD_ShotInfo* ZGame::OnPeerShotgun_Damaged(ZObject* pOwner, float fShotTime, const rvector& pos, rvector& dir, ZPICKINFO pickinfo, DWORD dwPickPassFlag, rvector& v1, rvector& v2, ZItem* pItem, rvector& BulletMarkNormal, bool& bBulletMark, ZTargetType& nTargetType, bool& bHitEnemy, int Repeatcount) // damage floating
{
    // ZGame::OnPeerShotgun_Damaged(ZObject* pOwner, float fShotTime.....
    //////////////////////////////////// ADD OK ? ///////////////////// // damage floating
    if (Repeatcount == 0) {
        ZGetGame()->m_pMyCharacter->GetStatus().CheckCrc();
        ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage = 0;
        ZGetGame()->m_pMyCharacter->GetStatus().MakeCrc();
    }

    ZCharacter* pTargetCharacter = ZGetGameInterface()->GetCombatInterface()->GetTargetCharacter();
    bool bReturnValue = !pTargetCharacter;
    if (!pTargetCharacter)PROTECT_DEBUG_REGISTER(bReturnValue) return NULL;

    MMatchItemDesc* pDesc = pItem->GetDesc();
    bReturnValue = !pDesc;
    if (!pDesc)PROTECT_DEBUG_REGISTER(bReturnValue) { _ASSERT(FALSE); return NULL; }

    //rvector dir = to - pos;

    bool waterSound = false;
    //¿©±â¿¡ ¹æ¾îÄڵ尡 µé¾î°¡¾ßµÅ~
    bReturnValue = !(ZGetGame()->PickHistory(pOwner, fShotTime, pos, pos + 10000.f * dir, &pickinfo, dwPickPassFlag));
    if (!(ZGetGame()->PickHistory(pOwner, fShotTime, pos, pos + 10000.f * dir, &pickinfo, dwPickPassFlag)))
    {
        PROTECT_DEBUG_REGISTER(bReturnValue)
        {
            v1 = pos;
            v2 = pos + dir * 10000.f;
            nTargetType = ZTT_NOTHING;
            waterSound = GetWorld()->GetWaters()->CheckSpearing(v1, v2, 250, 0.3, !waterSound);
            return NULL;
        }
    }
    //¿©±âµµ..
    bReturnValue = (!pickinfo.pObject) && (!pickinfo.bBspPicked);
    if (pickinfo.bBspPicked)
    {
        PROTECT_DEBUG_REGISTER(pickinfo.nBspPicked_DebugRegister == FOR_DEBUG_REGISTER)
        {
            nTargetType = ZTT_OBJECT;

            v1 = pos;
            v2 = pickinfo.bpi.PickPos;

            // ÃÑź ÈçÀû
            BulletMarkNormal.x = pickinfo.bpi.pInfo->plane.a;
            BulletMarkNormal.y = pickinfo.bpi.pInfo->plane.b;
            BulletMarkNormal.z = pickinfo.bpi.pInfo->plane.c;
            Normalize(BulletMarkNormal);
            bBulletMark = true;

            // ¸Â´Â°÷ ¹Ý°æ 20cm °¡ ȸ鿡 µé¾î¿À¸é ±×¸°´Ù
            bool bDrawTargetEffects = isInViewFrustum(v2, 20.f, RGetViewFrustum());
            if (bDrawTargetEffects)
            {
                rvector pdir = v2 - v1;
                Normalize(pdir);

                int size = 3;
                bool bDrawFireEffects = isInViewFrustum(v1, 100.f, RGetViewFrustum());
                rvector v[6];

                //        size = GetWeapondummyPos(pOwnerCharacter,v);
                ZCharacterObject* pCOwnerObject = MDynamicCast(ZCharacterObject, pOwner);
                if (pCOwnerObject->IsRendered())
                    size = pCOwnerObject->GetWeapondummyPos(v);
                else
                {
                    size = 6;
                    v[0] = v[1] = v[2] = v1;
                    v[3] = v[4] = v[5] = v[0];
                }


                MMatchWeaponType wtype = pDesc->m_nWeaponType.Ref();
                bool bSlugOutput = pDesc->m_bSlugOutput;
                ZGetEffectManager()->AddBulletMark(v2, BulletMarkNormal);
                //                if(ZGetConfiguration()->GetExtra()->bShotgunSmoke == true) {
                //                ZGetEffectManager()->AddShotEffect(&v1, size , v2, BulletMarkNormal, nTargetType, wtype, bSlugOutput, pCOwnerObject,bDrawFireEffects,bDrawTargetEffects);
                //                }

            }
            waterSound = GetWorld()->GetWaters()->CheckSpearing(v1, v2, 250, 0.3, !waterSound);
            return NULL;
        }
    }
    else if ((!pickinfo.pObject) && (!pickinfo.bBspPicked))
    {
        PROTECT_DEBUG_REGISTER(bReturnValue)
        {
            //_ASSERT(false);
            return NULL;
        }
    }

    //À§¿¡±îÁö´Â °Ë»ç ´Ü°è...

    ZObject* pObject = pickinfo.pObject;
    bool bGuard = pObject->IsGuard() && (pickinfo.info.parts != eq_parts_legs) &&        // ´Ù¸®´Â ¸·À»¼ö¾ø´Ù
        DotProduct(dir, pObject->GetDirection()) < 0;

    if (pObject->IsGuard() && (pickinfo.info.parts != eq_parts_legs) &&
        DotProduct(dir, pObject->GetDirection()) < 0)
    {
        PROTECT_DEBUG_REGISTER(bGuard)
        {
            nTargetType = ZTT_CHARACTER_GUARD;
            // ¸·¾Ò´Ù
            rvector t_pos = pObject->GetPosition();
            t_pos.z += 100.f;
            ZGetEffectManager()->AddSwordDefenceEffect(t_pos + (-dir * 50.f), -dir);
            pObject->OnGuardSuccess();
            v1 = pos;
            v2 = pickinfo.info.vOut;
            return NULL;
        }
    }

    ZActor* pATarget = MDynamicCast(ZActor, pObject);
    nTargetType = ZTT_CHARACTER;

    bool bPushSkip = false;

    if (pATarget)
    {
        bPushSkip = pATarget->GetNPCInfo()->bNeverPushed;
    }

    float fKnockbackForce = pItem->GetKnockbackForce() / (.5f * float(SHOTGUN_BULLET_COUNT));

    if (bPushSkip)
    {
        //                    ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met");
        rvector vPos = pOwner->GetPosition() + (pickinfo.pObject->GetPosition() - pOwner->GetPosition()) * 0.1f;
        ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met", vPos);
        fKnockbackForce = 1.0f;
    }

    pObject->OnKnockback(dir, fKnockbackForce);

    float fActualDamage = CalcActualDamage(pOwner, pObject, (float)pDesc->m_nDamage.Ref());
    float fRatio = pItem->GetPiercingRatio(pDesc->m_nWeaponType.Ref(), pickinfo.info.parts);
    ZDAMAGETYPE dt = (pickinfo.info.parts == eq_parts_head) ? ZD_BULLET_HEADSHOT : ZD_BULLET;

    MTD_ShotInfo* pShotInfo = NULL;

    if (ZGetGameClient()->GetChannelType() == MCHANNEL_TYPE_CLAN) {

        if (ZGetGameClient()->GetMatchStageSetting()->GetAntiLead() == false) {
            pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
        else {
            pShotInfo = new MTD_ShotInfo;
            pShotInfo->nLowId = pickinfo.pObject->GetUID().Low;
            pShotInfo->fDamage = fActualDamage;
            pShotInfo->fPosX = pOwner->GetPosition().x;
            pShotInfo->fPosY = pOwner->GetPosition().y;
            pShotInfo->fPosZ = pOwner->GetPosition().z;
            pShotInfo->fRatio = fRatio;
            pShotInfo->nDamageType = dt;
            pShotInfo->nWeaponType = pDesc->m_nWeaponType.Ref();
        }

    }
    else if (ZGetGameClient()->GetChannelType() == MCHANNEL_TYPE_DUELTOURNAMENT) {

        if (strstr(ZGetGameClient()->GetChannelName(), "Lead")) {
            pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
        else {
            pShotInfo = new MTD_ShotInfo;
            pShotInfo->nLowId = pickinfo.pObject->GetUID().Low;
            pShotInfo->fDamage = fActualDamage;
            pShotInfo->fPosX = pOwner->GetPosition().x;
            pShotInfo->fPosY = pOwner->GetPosition().y;
            pShotInfo->fPosZ = pOwner->GetPosition().z;
            pShotInfo->fRatio = fRatio;
            pShotInfo->nDamageType = dt;
            pShotInfo->nWeaponType = pDesc->m_nWeaponType.Ref();
        }

    }
    else {

        if (pickinfo.pObject->IsNPC() == true || strstr(ZGetGameClient()->GetChannelName(), "Lead"))
        {
            pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio);
        }
        else
        {
            pShotInfo = new MTD_ShotInfo;
            pShotInfo->nLowId = pickinfo.pObject->GetUID().Low;
            pShotInfo->fDamage = fActualDamage;
            pShotInfo->fPosX = pOwner->GetPosition().x;
            pShotInfo->fPosY = pOwner->GetPosition().y;
            pShotInfo->fPosZ = pOwner->GetPosition().z;
            pShotInfo->fRatio = fRatio;
            pShotInfo->nDamageType = dt;
            pShotInfo->nWeaponType = pDesc->m_nWeaponType.Ref();
        }
    }

    //////////////////////// ADD OK ?????  /////////////////////////// // damage floating
    ZGetGame()->m_pMyCharacter->GetStatus().CheckCrc();
    ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage += fActualDamage;
    ZGetGame()->m_pMyCharacter->GetStatus().MakeCrc();

    if (!m_Match.IsTeamPlay() || (pTargetCharacter->GetTeamID() != pObject->GetTeamID()))
    {
        bHitEnemy = true;
    }

    v1 = pos;
    v2 = pickinfo.info.vOut;

    waterSound = GetWorld()->GetWaters()->CheckSpearing(v1, v2, 250, 0.3, !waterSound);

    // ZGame::OnPeerShotgun_Damaged(ZObject* pOwner, float fShotTime... END
    /////////////////////// ADD OK ? ///////////////////////////// // damage floating
    if ((pObject->GetUID() != ZGetMyUID()) && (pOwner->GetUID() == ZGetMyUID()))
    {
        int nCurrDamage = ZGetGame()->m_pMyCharacter->GetStatus().Ref().nRoundGivenDamage;
        ZGetEffectManager()->AddDamageEffect(nCurrDamage, pObject, pOwner);
    }

    return pShotInfo;

}
 
Last edited:
Newbie Spellweaver
Joined
Jan 12, 2022
Messages
26
Reaction score
2
kwh2009 Could you upload only the .cpp and .h files where the damage floating code has been added to guide us, the truth is it does not compile, I think we are putting it on different lines please ;)
 
Back
Top