ComputePoints

Reached

Geliştirici
Geliştirici
Usta Üye
Editör
Mesaj
810
Çözümler
28
Beğeni
737
Puan
839
Herkese merhabalar, geçen bir arkadaş konu açmıştı ve konu altında aynı sıkıntıyı çeken birçok arkadaş yazmıştı. Bununla ilgili çözümü TurkMMO adlı forumdan "Tunga" adlı yöneticinin filesinden alınmıştır.

ComputePoints değerinden farkı nedir ?

- ComputePoints değerinin sonunda Update() fonksiyonu çalıştırılır. Update fonksiyonu yeniden hesaplanılan değerleri eskisiyle karşılaştırıp yenilerini güncelleme paketidir. Bu yapılanda ise update fonksiyonu yoktur.

service.h
C:
#define ENABLE_COMPUTE_POINTS_WITHOUT_UPDATE_PACKET

char.h
C:
//Ara

ComputePoints

// Altına ekle

#ifdef ENABLE_COMPUTE_POINTS_WITHOUT_UPDATE_PACKET
    void            ComputePointsWithoutUpdatePacket();
#endif

char.cpp
C:
#ifdef ENABLE_COMPUTE_POINTS_WITHOUT_UPDATE_PACKET
void CHARACTER::ComputePointsWithoutUpdatePacket()
{
    long lStat = GetPoint(POINT_STAT);
    long lStatResetCount = GetPoint(POINT_STAT_RESET_COUNT);
    long lSkillActive = GetPoint(POINT_SKILL);
    long lSkillSub = GetPoint(POINT_SUB_SKILL);
    long lSkillHorse = GetPoint(POINT_HORSE_SKILL);
    long lLevelStep = GetPoint(POINT_LEVEL_STEP);

    long lAttackerBonus = GetPoint(POINT_PARTY_ATTACKER_BONUS);
    long lTankerBonus = GetPoint(POINT_PARTY_TANKER_BONUS);
    long lBufferBonus = GetPoint(POINT_PARTY_BUFFER_BONUS);
    long lSkillMasterBonus = GetPoint(POINT_PARTY_SKILL_MASTER_BONUS);
    long lHasteBonus = GetPoint(POINT_PARTY_HASTE_BONUS);
    long lDefenderBonus = GetPoint(POINT_PARTY_DEFENDER_BONUS);

    long lHPRecovery = GetPoint(POINT_HP_RECOVERY);
    long lSPRecovery = GetPoint(POINT_SP_RECOVERY);

    memset(m_pointsInstant.points, 0, sizeof(m_pointsInstant.points));
    BuffOnAttr_ClearAll();
    m_SkillDamageBonus.clear();

    SetPoint(POINT_STAT, lStat);
    SetPoint(POINT_SKILL, lSkillActive);
    SetPoint(POINT_SUB_SKILL, lSkillSub);
    SetPoint(POINT_HORSE_SKILL, lSkillHorse);
    SetPoint(POINT_LEVEL_STEP, lLevelStep);
    SetPoint(POINT_STAT_RESET_COUNT, lStatResetCount);

    SetPoint(POINT_ST, GetRealPoint(POINT_ST));
    SetPoint(POINT_HT, GetRealPoint(POINT_HT));
    SetPoint(POINT_DX, GetRealPoint(POINT_DX));
    SetPoint(POINT_IQ, GetRealPoint(POINT_IQ));

    SetPart(PART_MAIN, GetOriginalPart(PART_MAIN));
    SetPart(PART_WEAPON, GetOriginalPart(PART_WEAPON));
    SetPart(PART_HEAD, GetOriginalPart(PART_HEAD));
    SetPart(PART_HAIR, GetOriginalPart(PART_HAIR));
#ifdef ENABLE_ACCE_SYSTEM
    SetPart(PART_SASH, GetOriginalPart(PART_SASH));
#endif
#ifdef ENABLE_AURA_SYSTEM
    SetPart(PART_AURA, GetOriginalPart(PART_AURA));
#endif

    SetPoint(POINT_PARTY_ATTACKER_BONUS, lAttackerBonus);
    SetPoint(POINT_PARTY_TANKER_BONUS, lTankerBonus);
    SetPoint(POINT_PARTY_BUFFER_BONUS, lBufferBonus);
    SetPoint(POINT_PARTY_SKILL_MASTER_BONUS, lSkillMasterBonus);
    SetPoint(POINT_PARTY_HASTE_BONUS, lHasteBonus);
    SetPoint(POINT_PARTY_DEFENDER_BONUS, lDefenderBonus);

    SetPoint(POINT_HP_RECOVERY, lHPRecovery);
    SetPoint(POINT_SP_RECOVERY, lSPRecovery);

    int iMaxHP, iMaxSP;
    int iMaxStamina;

    if (IsPC())
    {
        // 최대 생명력/정신력
        iMaxHP = JobInitialPoints[GetJob()].max_hp + m_points.iRandomHP + GetPoint(POINT_HT) * JobInitialPoints[GetJob()].hp_per_ht;
        iMaxSP = JobInitialPoints[GetJob()].max_sp + m_points.iRandomSP + GetPoint(POINT_IQ) * JobInitialPoints[GetJob()].sp_per_iq;
        iMaxStamina = JobInitialPoints[GetJob()].max_stamina + GetPoint(POINT_HT) * JobInitialPoints[GetJob()].stamina_per_con;

        {
            CSkillProto* pkSk = CSkillManager::instance().Get(SKILL_ADD_HP);

            if (nullptr != pkSk)
            {
                pkSk->SetPointVar("k", 1.0f * GetSkillPower(SKILL_ADD_HP) / 100.0f);

                iMaxHP += static_cast<int>(pkSk->kPointPoly.Eval());
            }
        }

        SetPoint(POINT_MOV_SPEED, 111);
        SetPoint(POINT_ATT_SPEED, 112);
        PointChange(POINT_ATT_SPEED, GetPoint(POINT_PARTY_HASTE_BONUS));
        SetPoint(POINT_CASTING_SPEED, 100);
    }
    else
    {
        iMaxHP = m_pkMobData->m_table.dwMaxHP;
        iMaxSP = 0;
        iMaxStamina = 0;

        SetPoint(POINT_ATT_SPEED, m_pkMobData->m_table.sAttackSpeed);
        SetPoint(POINT_MOV_SPEED, m_pkMobData->m_table.sMovingSpeed);
        SetPoint(POINT_CASTING_SPEED, m_pkMobData->m_table.sAttackSpeed);
    }

    if (IsPC())
    {
        // 말 타고 있을 때는 기본 스탯이 말의 기준 스탯보다 낮으면 높게 만든다.
        // 따라서 말의 기준 스탯이 무사 기준이므로, 수라/무당은 전체 스탯 합이
        // 대채적으로 더 올라가게 될 것이다.
#ifdef ENABLE_MOUNT_COSTUME_SYSTEM
        if (GetMountVnum() && !GetWear(WEAR_COSTUME_MOUNT))
#else
        if (GetMountVnum())
#endif
        {
            if (GetHorseST() > GetPoint(POINT_ST))
                PointChange(POINT_ST, GetHorseST() - GetPoint(POINT_ST));

            if (GetHorseDX() > GetPoint(POINT_DX))
                PointChange(POINT_DX, GetHorseDX() - GetPoint(POINT_DX));

            if (GetHorseHT() > GetPoint(POINT_HT))
                PointChange(POINT_HT, GetHorseHT() - GetPoint(POINT_HT));

            if (GetHorseIQ() > GetPoint(POINT_IQ))
                PointChange(POINT_IQ, GetHorseIQ() - GetPoint(POINT_IQ));
        }
    }

    ComputeBattlePoints();

    if (iMaxHP != GetMaxHP())
    {
        SetRealPoint(POINT_MAX_HP, iMaxHP); // 기본HP를 RealPoint에 저장해 놓는다.
    }

    PointChange(POINT_MAX_HP, 0);

    if (iMaxSP != GetMaxSP())
    {
        SetRealPoint(POINT_MAX_SP, iMaxSP); // 기본SP를 RealPoint에 저장해 놓는다.
    }

    PointChange(POINT_MAX_SP, 0);

    SetMaxStamina(iMaxStamina);
    // @fixme118 part1
    int iCurHP = this->GetHP();
    int iCurSP = this->GetSP();

    m_pointsInstant.dwImmuneFlag = 0;

    for (int i = 0; i < WEAR_MAX_NUM; i++)
    {
        LPITEM pItem = GetWear(i);
        if (pItem)
        {
            pItem->ModifyPoints(true);
            SET_BIT(m_pointsInstant.dwImmuneFlag, GetWear(i)->GetImmuneFlag());
        }
    }

    // 용혼석 시스템
    // ComputePoints에서는 케릭터의 모든 속성값을 초기화하고,
    // 아이템, 버프 등에 관련된 모든 속성값을 재계산하기 때문에,
    // 용혼석 시스템도 ActiveDeck에 있는 모든 용혼석의 속성값을 다시 적용시켜야 한다.
    if (DragonSoul_IsDeckActivated())
    {
        for (int i = WEAR_MAX_NUM + DS_SLOT_MAX * DragonSoul_GetActiveDeck();
            i < WEAR_MAX_NUM + DS_SLOT_MAX * (DragonSoul_GetActiveDeck() + 1); i++)
        {
            LPITEM pItem = GetWear(i);
            if (pItem)
            {
                if (DSManager::instance().IsTimeLeftDragonSoul(pItem))
                    pItem->ModifyPoints(true);
            }
        }
    }

    if (GetHP() > GetMaxHP())
        PointChange(POINT_HP, GetMaxHP() - GetHP());

    if (GetSP() > GetMaxSP())
        PointChange(POINT_SP, GetMaxSP() - GetSP());

    ComputeSkillPoints();

    RefreshAffect();
    // @fixme118 part2 (before petsystem stuff)
    if (IsPC())
    {
        if (this->GetHP() != iCurHP)
            this->PointChange(POINT_HP, iCurHP - this->GetHP());
        if (this->GetSP() != iCurSP)
            this->PointChange(POINT_SP, iCurSP - this->GetSP());
    }

    CPetSystem * pPetSystem = GetPetSystem();
    if (nullptr != pPetSystem)
    {
        pPetSystem->RefreshBuff();
    }
    for (TMapBuffOnAttrs::iterator it = m_map_buff_on_attrs.begin(); it != m_map_buff_on_attrs.end(); it++)
    {
        it->second->GiveAllAttributes();
    }
}
#endif

Peki bu kod nerelerde kullanılmalı ?

char_skill.cpp
C:
// Aratın
void CHARACTER::SkillLevelUp

// Fonkisyonun sonundaki     ComputePoints(); bulun

// Değiştirin

#ifdef ENABLE_COMPUTE_POINTS_WITHOUT_UPDATE_PACKET
    ComputePointsWithoutUpdatePacket();
#else
    ComputePoints();
#endif

Her compute gördüğünüz yere kullanmayın ve bilmeyen arkadaşların kullanmasını tavsiye etmiyorum.
 
çok saol fakat güncelleme yaptırmazsak ne gibi sıkıntılar doğal onu bilemiyoruz ama yinede teşekkürediyoruz bizleri unutmadığınız için :) :)
 
çok saol fakat güncelleme yaptırmazsak ne gibi sıkıntılar doğal onu bilemiyoruz ama yinede teşekkürediyoruz bizleri unutmadığınız için :) :)
Örnek kullanımını verdim onun gibi update gerektirmeyen fonksiyonlarda mesela skill'inize 1 puan verdiğinizde vb. şeylerde update fonksiyonunu çalıştırmanıza gerek yok
 
Emeğine sağlık çok teşekkür ederim :)
Özetle şunu sormak istiyorum, konudaki anlatımı birebir uyguladığımda hamle / hp düşmesi sorunu fixlenmiş olur mu ?
Diğer HP/SP hesaplama faktörleri önemli değil benim için, statü verirken falan vs. Sadece hamle sorununu halletmek niyetindeyim. Ve son olarak anlatım çok üstü kapalı olmuş :(
 
Son düzenleme:
ben şimdi uygulamaya geçtim ama bu char.cpp için verdiğiniz kodu neyi aratıp neyin altına ekleyeceğiz onu göremedim ben

birde char_skill.cpp için verdiğiniz kodu örnek olarak yazmışsınız ama onuda kullanacaz mı hamle atarken ki hp düşme sorununu fixlemek için?
 
source kodlarından anlayan iyiliksever koderlerimiz yardım edebilir mi biz bunun yapımını anlayamadık konu biraz garip olmuş
 
Konudaki kodlar hiç bir ise yaramıyor.
 
Bana marty filesten alınmış gibi geldi fix değil de sanki oyunun performansı için yapılmış bir şey gibi bilen arkadaşlar belirtirse netleşir sanıyorum. Zaten oluşturulan ifdef de güncellemeye gerek olmayan noktalar denilmiş. :)
 
Bana marty filesten alınmış gibi geldi fix değil de sanki oyunun performansı için yapılmış bir şey gibi bilen arkadaşlar belirtirse netleşir sanıyorum. Zaten oluşturulan ifdef de güncellemeye gerek olmayan noktalar denilmiş. :)
evet kodlarla okuma yapabilen yardımsever koderlerimizin konuya el atmalarını rica ediyoruz :)
 
Geri
Üst