Geçici Grand Master beceri sistemi

Denizeri24

Gentleman
Geliştirici
Usta Üye
Mesaj
532
Çözümler
14
Beğeni
498
Puan
829
Ticaret Puanı
0
Sistem basittir, belirli eşyayı giyince grandmaster olmayan aktif karakter becerilerini grandmaster yapar. Grandmaster veya daha üstü becerileri etkilemez.





char.h içinde aratılır:
C++:
void SkillLevelPacket();

değiştirilir:
C++:
void SkillLevelPacket(bool temporary = false) const;

tekrar aratılır:
C++:
int GetSkillLevel(DWORD dwVnum) const;

ve değiştirilir:
C++:
int GetSkillLevel(DWORD dwVnum, bool skilltraining = false) const;
----------------------

char_skill.cpp içinde aratılır:
C++:
void CHARACTER::SkillLevelPacket()

fonksiyon ve içeriği değiştirilir:
C++:
void CHARACTER::SkillLevelPacket(const bool temporary)
{
    if (!GetDesc())
        return;

    TPacketGCSkillLevel pack;

    pack.bHeader = HEADER_GC_SKILL_LEVEL;
    thecore_memcpy(&pack.skills, m_pSkillLevels, sizeof(TPlayerSkill) * SKILL_MAX_NUM);
 
    if (temporary)
    {
        UpgradeSkillsTemporary(pack, GetJob(), GetSkillGroup());
    }
 
    GetDesc()->Packet(&pack, sizeof(TPacketGCSkillLevel));
}

Değişiklik yapılan fonksiyonun hemen üstüne eklenir;

C++:
constexpr void UpgradeSkillsTemporary(TPacketGCSkillLevel & packet, BYTE job, BYTE skillgroup) noexcept
{
    switch (job)
    {
        case JOB_WARRIOR:
        {
            if (skillgroup == 1)
            {
                for (BYTE i = 1; i <= 5; i++)
                {
                    if (30 > packet.skills[i].bLevel)
                    {
                        packet.skills[i].bLevel = 30;
                        packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
                    }
                }
            }
            else if (skillgroup == 2)
            {
                for (BYTE i = 16; i <= 20; i++)
                {
                    if (30 > packet.skills[i].bLevel)
                    {
                        packet.skills[i].bLevel = 30;
                        packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
                    }
                }
            }
        }

        case JOB_ASSASSIN:
        {
            if (skillgroup == 1)
            {
                for (BYTE i = 31; i <= 35; i++)
                {
                    if (30 > packet.skills[i].bLevel)
                    {
                        packet.skills[i].bLevel = 30;
                        packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
                    }
                }
            }
            else if (skillgroup == 2)
            {
                for (BYTE i = 46; i <= 50; i++)
                {
                    if (30 > packet.skills[i].bLevel)
                    {
                        packet.skills[i].bLevel = 30;
                        packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
                    }
                }
            }
        }

        case JOB_SURA:
        {
            if (skillgroup == 1)
            {
                for (BYTE i = 61; i <= 66; i++)
                {
                    if (30 > packet.skills[i].bLevel)
                    {
                        packet.skills[i].bLevel = 30;
                        packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
                    }
                }
            }
            else if (skillgroup == 2)
            {
                for (BYTE i = 76; i <= 81; i++)
                {
                    if (30 > packet.skills[i].bLevel)
                    {
                        packet.skills[i].bLevel = 30;
                        packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
                    }
                }
            }
        }

        case JOB_SHAMAN:
        {
            if (skillgroup == 1)
            {
                for (BYTE i = 91; i <= 96; i++)
                {
                    if (30 > packet.skills[i].bLevel)
                    {
                        packet.skills[i].bLevel = 30;
                        packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
                    }
                }
            }
            else if (skillgroup == 2)
            {
                for (BYTE i = 106; i <= 111; i++)
                {
                    if (30 > packet.skills[i].bLevel)
                    {
                        packet.skills[i].bLevel = 30;
                        packet.skills[i].bMasterType = SKILL_GRAND_MASTER;
                    }
                }
            }
        }
    }
}

aynı dosya içerisinde aratılır:
C++:
int CHARACTER::GetSkillMasterType(DWORD dwVnum) const

ve fonksiyon içeriği değiştirilir;

C++:
    if (!IsPC())
        return 0;

    if (dwVnum >= SKILL_MAX_NUM)
    {
        sys_err("%s skill vnum overflow %u", GetName(), dwVnum);
        return 0;
    }

    if (m_pSkillLevels)
    {
        if (IsEquipUniqueItem(UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER))
        {
            return (SKILL_GRAND_MASTER > m_pSkillLevels[dwVnum].bMasterType) ? SKILL_GRAND_MASTER : m_pSkillLevels[dwVnum].bMasterType;
        }
        else
        {
            return m_pSkillLevels[dwVnum].bMasterType;
        }
    }

    return SKILL_NORMAL;

tekrar aratılır:
C++:
int CHARACTER::GetSkillLevel(DWORD dwVnum) const

ve fonksiyon içeriği değiştirilir;

C++:
    if (dwVnum >= SKILL_MAX_NUM)
    {
        sys_err("%s skill vnum overflow %u", GetName(), dwVnum);
        sys_log(0, "%s skill vnum overflow %u", GetName(), dwVnum);
        return 0;
    }

    if (m_pSkillLevels)
    {
        if (IsEquipUniqueItem(UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER) && !skilltraining)
        {
            return (30 > m_pSkillLevels[dwVnum].bLevel) ? 30 : m_pSkillLevels[dwVnum].bLevel;
        }
        else
        {
            return std::min<int>(SKILL_MAX_LEVEL, m_pSkillLevels[dwVnum].bLevel);
        }
    }

    return 0;
}

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

input_login.cpp içerisinde üst kısımda eğer yoksa eklenir:
C++:
#include "unique_item.h"

aynı dosyada aratılır:
C++:
void CInputLogin::Entergame(LPDESC d, const char * data)

ve aratılan fonksiyonun en altına eklenir;
C++:
    if (ch->IsEquipUniqueItem(UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER))
    {
        ch->SkillLevelPacket(true);
    }

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

item.cpp içerisinde aratılır:
C++:
void CItem::StartUniqueExpireEvent()

ve fonksiyonun içerisine eklenir;

C++:
bu kısımın altına;

    // HARD CODING
    if (GetVnum() == UNIQUE_ITEM_HIDE_ALIGNMENT_TITLE)
        m_pOwner->ShowAlignment(false);

bu eklenecek;

    if (GetVnum() == UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER)
        m_pOwner->SkillLevelPacket(true);

tekrar aratılır:
C++:
void CItem::StopUniqueExpireEvent()

ve fonksiyonun içerisine eklenir;


C++:
bu kısımın altına;

    // HARD CODING
    if (GetVnum() == UNIQUE_ITEM_HIDE_ALIGNMENT_TITLE)
        m_pOwner->ShowAlignment(false);

bu eklenecek;

    if (GetVnum() == UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER)
        m_pOwner->SkillLevelPacket();

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

questlua_pc.cpp içerisinde aratılır:
C++:
int pc_get_skill_level(lua_State * L)

ve fonksiyon içeriği komple değiştirilir;

C++:
        if (!lua_isnumber(L, 1))
        {
            sys_err("invalid argument");
            lua_pushnumber(L, 0);
            return 1;
        }

        LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();

        DWORD dwVnum = (DWORD) lua_tonumber(L, 1);
        lua_pushnumber(L, ch->GetSkillLevel(dwVnum, true));

        return 1;

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

unique_item.h içerisine eklenir:
C++:
UNIQUE_ITEM_TEMP_SKILL_GRAND_MASTER = 70059,

----------------------​

item kodu 70059 dur. isteğe göre değiştirilebilir. client/pack kısmından item_list.txt ve item_desc.txt kısmını düzenlemeniz gerekir (yoksa oyun içinde item gözükmez)

bug varmıdır bilmiyorum, aklıma gelen türden denemeler yaptım ve sıkıntı yaşamadım ayrıca fonksiyonda constexpr ve noexcept kullandığım için c++ sürümü düşük dosyalarda derlenmeyebilir, eğer düşük c++ sürümüyle derlemek istiyorsanız constexpr kısmını inline ile değiştirip noexcept kısmını silin.

item_proto.txt ve item_names.txt kısmını unutmuşum:​
item_proto.txt:
70059    ¼±ՀǠÀ尩    ITEM_UNIQUE    UNIQUE_NONE    1    NONE    NONE    WEAR_SHIELD        0    50000    0    0    0    LIMIT_NONE    0    LIMIT_NONE    0    APPLY_NONE    0    APPLY_NONE    0    APPLY_NONE    0    120    0    0    0    0    0    0    0    0
item_names.txt:
70059    Büyük Usta'nın Yüzüğü
 
Son düzenleme:
Grandmaster tılsımı gibi bir şey olarak aslında oyna eklenebilir beceri geliştirme ultra zor olur bu metinlerden düşer süreli olarak oynu renklendirir güzel görünüyor
 
eline sağlık teşekkürler
 
Geri
Üst