Geçici Grand Master beceri sistemi

Denizeri24

Gentleman
Geliştirici
Usta Üye
Mesaj
518
Çözümler
14
Beğeni
469
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
 
Bence de mantığı hoş, uyarlanabilir oyuna
 
eline sağlık teşekkürler
 
Geri
Üst