Yardım Anlık hp düşüşü

Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

Kuqsal

Üye
Üye
Sebebini anlayamadım fakat yardımcı olursanız sevinirim.



Eski hali oto hp yenileme:
bool CHARACTER::UpdateAffect()
{
    // affect_event 에서 처리할 일은 아니지만, 1초짜리 이벤트에서 처리하는 것이
    // 이것 뿐이라 여기서 물약 처리를 한다.
    if (GetPoint(POINT_HP_RECOVERY) > 0)
    {
        if (GetMaxHP() <= GetHP())
        {
            PointChange(POINT_HP_RECOVERY, -GetPoint(POINT_HP_RECOVERY));
        }
        else
        {
            int iVal = 0;

            if (LC_IsYMIR())
            {
                iVal = MIN(GetPoint(POINT_HP_RECOVERY), GetMaxHP() * 9 / 100);
            }
            else
            {
                iVal = MIN(GetPoint(POINT_HP_RECOVERY), GetMaxHP() * 7 / 100);
            }

            PointChange(POINT_HP, iVal);
            PointChange(POINT_HP_RECOVERY, -iVal);
        }
    }

    if (GetPoint(POINT_SP_RECOVERY) > 0)
    {
        if (GetMaxSP() <= GetSP())
            PointChange(POINT_SP_RECOVERY, -GetPoint(POINT_SP_RECOVERY));
        else
        {
            int iVal;

            if (!g_iUseLocale)
                iVal = MIN(GetPoint(POINT_SP_RECOVERY), GetMaxSP() * 7 / 100);
            else
                iVal = MIN(GetPoint(POINT_SP_RECOVERY), GetMaxSP() * 7 / 100);

            PointChange(POINT_SP, iVal);
            PointChange(POINT_SP_RECOVERY, -iVal);
        }
    }

    if (GetPoint(POINT_HP_RECOVER_CONTINUE) > 0)
    {
        PointChange(POINT_HP, GetPoint(POINT_HP_RECOVER_CONTINUE));
    }

    if (GetPoint(POINT_SP_RECOVER_CONTINUE) > 0)
    {
        PointChange(POINT_SP, GetPoint(POINT_SP_RECOVER_CONTINUE));
    }

    AutoRecoveryItemProcess( AFFECT_AUTO_HP_RECOVERY );
    AutoRecoveryItemProcess( AFFECT_AUTO_SP_RECOVERY );

Yeni hali oto hp yenileme:
bool CHARACTER::UpdateAffect()
{
    if (GetPoint(POINT_HP_RECOVERY) > 0)
    {
        if (GetMaxHP() <= GetHP())
        {
            PointChange(POINT_HP_RECOVERY, -GetPoint(POINT_HP_RECOVERY));
        }
        else
        {
            int iVal = MIN(GetPoint(POINT_HP_RECOVERY), GetMaxHP() * 7 / 100);
            PointChange(POINT_HP, iVal);
            PointChange(POINT_HP_RECOVERY, -iVal);
        }
    }

    if (GetPoint(POINT_SP_RECOVERY) > 0)
    {
        if (GetMaxSP() <= GetSP())
            PointChange(POINT_SP_RECOVERY, -GetPoint(POINT_SP_RECOVERY));
        else
        {
            int iVal = MIN(GetPoint(POINT_SP_RECOVERY), GetMaxSP() * 7 / 100);
            PointChange(POINT_SP, iVal);
            PointChange(POINT_SP_RECOVERY, -iVal);
        }
    }

    if (GetPoint(POINT_HP_RECOVER_CONTINUE) > 0)
        PointChange(POINT_HP, GetPoint(POINT_HP_RECOVER_CONTINUE));

    if (GetPoint(POINT_SP_RECOVER_CONTINUE) > 0)
        PointChange(POINT_SP, GetPoint(POINT_SP_RECOVER_CONTINUE));

    AutoRecoveryItemProcess( AFFECT_AUTO_HP_RECOVERY );
    AutoRecoveryItemProcess( AFFECT_AUTO_SP_RECOVERY );

Effect yükleme:
void CHARACTER::LoadAffect(DWORD dwCount, TPacketAffectElement * pElements)
{
    m_bIsLoadedAffect = false;

    if (!GetDesc()->IsPhase(PHASE_GAME))
    {
        if (test_server)
            sys_log(0, "LOAD_AFFECT: Creating Event", GetName(), dwCount);

        load_affect_login_event_info* info = AllocEventInfo<load_affect_login_event_info>();

        info->pid = GetPlayerID();
        info->count = dwCount;
        info->data = M2_NEW char[sizeof(TPacketAffectElement) * dwCount];
        thecore_memcpy(info->data, pElements, sizeof(TPacketAffectElement) * dwCount);

        event_create(load_affect_login_event, info, PASSES_PER_SEC(1));

        return;
    }

    ClearAffect(true);

    if (test_server)
        sys_log(0, "LOAD_AFFECT: %s count %d", GetName(), dwCount);

    TAffectFlag afOld = m_afAffectFlag;

    long lMovSpd = GetPoint(POINT_MOV_SPEED);
    long lAttSpd = GetPoint(POINT_ATT_SPEED);

    for (DWORD i = 0; i < dwCount; ++i, ++pElements)
    {
        // 무영진은 로드하지않는다.
        if (pElements->dwType == SKILL_MUYEONG)
            continue;

        if (AFFECT_AUTO_HP_RECOVERY == pElements->dwType || AFFECT_AUTO_SP_RECOVERY == pElements->dwType)
        {
            LPITEM item = FindItemByID( pElements->dwFlag );

            if (NULL == item)
                continue;

            item->Lock(true);
        }

        if (pElements->bApplyOn >= POINT_MAX_NUM)
        {
            sys_err("invalid affect data %s ApplyOn %u ApplyValue %d",
                    GetName(), pElements->bApplyOn, pElements->lApplyValue);
            continue;
        }

        if (test_server)
        {
            sys_log(0, "Load Affect : Affect %s %d %d", GetName(), pElements->dwType, pElements->bApplyOn );
        }

        CAffect* pkAff = CAffect::Acquire();
        m_list_pkAffect.push_back(pkAff);

        pkAff->dwType        = pElements->dwType;
        pkAff->bApplyOn        = pElements->bApplyOn;
        pkAff->lApplyValue    = pElements->lApplyValue;
        pkAff->dwFlag        = pElements->dwFlag;
        pkAff->lDuration    = pElements->lDuration;
        pkAff->lSPCost        = pElements->lSPCost;

        SendAffectAddPacket(GetDesc(), pkAff);

        ComputeAffect(pkAff, true);
    
    
    }

    if ( CArenaManager::instance().IsArenaMap(GetMapIndex()) == true )
    {
        RemoveGoodAffect();
    }
    
    if (afOld != m_afAffectFlag || lMovSpd != GetPoint(POINT_MOV_SPEED) || lAttSpd != GetPoint(POINT_ATT_SPEED))
    {
        UpdatePacket();
    }

    StartAffectEvent();

    m_bIsLoadedAffect = true;

    // 용혼석 셋팅 로드 및 초기화
    DragonSoul_Initialize();
#ifdef FIXME118
    // @fixme118 BEGIN (regain affect hp/mp)
    if (!IsDead())
    {
        PointChange(POINT_HP, GetMaxHP() - GetHP());
        PointChange(POINT_SP, GetMaxSP() - GetSP());
    }
    // @fixme118 END
#endif
}
Biraz oynama yaptım üzerinde FIXME118 kullandım fakat değişen sadece biraz tam olarak düzelmedi
 
Geri