Geçici Grand Master beceri sistemi

  • Konuyu açan Konuyu açan Denizeri24
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 5
  • Gösterim Gösterim 831

Denizeri24

Gentleman
Geliştirici
Usta Üye
Mesaj
577
Çözümler
18
Beğeni
576
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++:
Genişlet Daralt Kopyala
void SkillLevelPacket();

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

tekrar aratılır:
C++:
Genişlet Daralt Kopyala
int GetSkillLevel(DWORD dwVnum) const;

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

char_skill.cpp içinde aratılır:
C++:
Genişlet Daralt Kopyala
void CHARACTER::SkillLevelPacket()

fonksiyon ve içeriği değiştirilir:
C++:
Genişlet Daralt Kopyala
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++:
Genişlet Daralt Kopyala
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++:
Genişlet Daralt Kopyala
int CHARACTER::GetSkillMasterType(DWORD dwVnum) const

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

C++:
Genişlet Daralt Kopyala
    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++:
Genişlet Daralt Kopyala
int CHARACTER::GetSkillLevel(DWORD dwVnum) const

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

C++:
Genişlet Daralt Kopyala
    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++:
Genişlet Daralt Kopyala
#include "unique_item.h"

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

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

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

item.cpp içerisinde aratılır:
C++:
Genişlet Daralt Kopyala
void CItem::StartUniqueExpireEvent()

ve fonksiyonun içerisine eklenir;

C++:
Genişlet Daralt Kopyala
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++:
Genişlet Daralt Kopyala
void CItem::StopUniqueExpireEvent()

ve fonksiyonun içerisine eklenir;


C++:
Genişlet Daralt Kopyala
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++:
Genişlet Daralt Kopyala
int pc_get_skill_level(lua_State * L)

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

C++:
Genişlet Daralt Kopyala
        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++:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
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
 
Çok güzel düşünce, elinize sağlık.
 
Üst