منظمة قانون التطور - Evolution Law Organization
(نسخة قابلة للطباعة من الموضوع)
https://lb-h.mt2academy.com/t481
أنقر هنا لمشاهدة الموضوع بهيئته الأصلية

[تجميعة] رقع ثغرات السورس - Part I
sharqawy 27-05-2020 02:32 صباحا
السلام عليكم ورحمة الله وبركاته ،، 

في هذا الموضوع سيتم عرض حوالي 10 ثغرة والباقي في مواضيع أخرى إن شاء الله كي لا أطيل عليكم

1- حل مشكلة عودة الخبرة للوراء .
نذهب للسورس ونقوم بفتح ملف char_battle.cpp ونبحث عن 
iExp = iExp * CHARACTER_MANAGER::instance().GetMobExpRate(to) / 100;

أضف بعدها : 
    if (iExp < 0)
    {
        iExp = 1 * (to->GetNextExp() / 100);
    }



2- ظهور Game Core عند كتابة أمر reload quests
نذهب للسورس ونقوم بفتح ملف quest.h ونبحث عن :
std::string    _counter_name;

أضف بعدها : 
std::string    quest_name;


نقوم بفتح ملف questlua.cpp ونبحث عن : 
qs.suspend_state = SUSPEND_STATE_SELECT;

أضف بعدها : 
qs.quest_name = GetCurrentPC() ? GetCurrentPC()->GetCurrentQuestName() : "no_quest";


نقوم بفتح ملف questlua_quest.cpp ونبحث عن : 
QuestState* pQS = pPC->GetRunningQuestState();

أضف بعدها :
            std::string stQuestName = pPC->GetCurrentQuestName();
            if (pQS->quest_name.length() != 0)
                stQuestName = pQS->quest_name;



3- وضع وقت بين إمكانية إستعمال الموقد
نفتح ملف char_item.cpp ونبحث عن : 
if (tree->IsAttr((long)(GetX()+fx), (long)(GetY()+fy), ATTR_WATER))
{
Bla Bla
}


أو ابحث عن : 
ونقوم بإضافة بعدها : 

                if (GetMapIndex() == 113)
                {
                    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can't use that here."));
                    return false;
                }
                
                int item_campfire_block = GetQuestFlag("item_campfire.fix");
                if (get_global_time() - item_campfire_block < 30)
                {
                    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("you have to wait 30 seconds before use that again."));
                    return false;
                }
                
                SetQuestFlag("item_campfire.fix", get_global_time());


4- إغلاق ثغرة الدم في المجموعة + ثغرة مهارات المجموعة
نقوم بفتح ملف party.cpp ونبحث فيه عن دالة : 
​if (!bAdd)


ونستبدل شرط if كاملاً بدايةً من if(!bAdd) وحتى قوس إنتهاء الشرط (شرح للمبتدئين)

بـ : 
    if (!bAdd)
    {
        bool state = false;
        const DWORD Bonuses[] =
        {
            POINT_PARTY_ATTACKER_BONUS,
            POINT_PARTY_TANKER_BONUS,
            POINT_PARTY_BUFFER_BONUS,
            POINT_PARTY_SKILL_MASTER_BONUS,
            POINT_PARTY_DEFENDER_BONUS,
            POINT_PARTY_HASTE_BONUS
        };

        for (size_t i = 0; i < sizeof(Bonuses) / sizeof(DWORD); ++i)
        {
            if (ch->GetPoint(Bonuses[i]))
            {
                ch->PointChange(Bonuses[i], -ch->GetPoint(Bonuses[i]));
                state = true;
            }
        }

        if (state)
        {
            ch->ComputePoints();
            ch->ComputeBattlePoints();
        }
        return;
    }



5- إصلاح عمل مهارة بدون سلاح بشكل تام

نقوم بفتح ملف char_affect.cpp ونبحث عن : 
bool CHARACTER::UpdateAffect()


ونضيف فيها الشرط التالي (بعد ال } مباشرة) :
    if (!GetWear(WEAR_WEAPON))
    {
        if (IsAffectFlag(AFF_GEOMGYEONG))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Equip your weapon before active skill."));
            RemoveAffect(SKILL_GEOMKYUNG);
        }

        if (IsAffectFlag(AFF_GWIGUM))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Equip your weapon before active skill."));
            RemoveAffect(SKILL_GWIGEOM);
        }
    }


نقوم بفتح ملف char_battle.cpp ونبحث عن دالة : 
bool CHARACTER::Attack(LPCHARACTER pkVictim, BYTE bType)

ونضيف فيها الشرط :
    if (!GetWear(WEAR_WEAPON))
    {
        if (IsAffectFlag(AFF_GEOMGYEONG))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Equip your weapon before active skill."));
            RemoveAffect(SKILL_GEOMKYUNG);
        }

        if (IsAffectFlag(AFF_GWIGUM))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Equip your weapon before active skill."));
            RemoveAffect(SKILL_GWIGEOM);
        }
    }



نقوم بفتح ملف char_skill.cpp ونبحث فيه عن :
bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaster)


نضيف بعده : 
    if ((dwVnum == SKILL_GEOMKYUNG || dwVnum == SKILL_GWIGEOM) && !GetWear(WEAR_WEAPON))
        return false;



6- إصلاح مشكلة إنشاء رابطة تحت المستوى 40 من السورس (كما يصلح مشكلة هاك الرابطة)
نفتح ملف i*nput_main.cpp ونقوم بالبحث عن :
    if (ch->GetGold() < 200000)
        return;


المتواجد داخل دالة : 
void CInputMain::AnswerMakeGuild(LPCHARACTER ch, const char* c_pData)


ونضيف الشرط : 
    if (ch->GetLevel() < 40)
        return;



7- إصلاح مشكلة Game Core بسبب نظام الصقل (Cube)
نقوم بفتح ملف cube.cpp ونبحث عن :
resultCount = resultList.size();

أضف بعدها : 
        if (resultCount == 0)
        {
            return;
        }



نبحث عن : 
        if (resultText.size() - 20 >= CHAT_MAX_LEN)
        {
            sys_err("[CubeInfo] Too long cube result list text. (NPC: %d, length: %d)", npcVNUM, resultText.size());
            resultText.clear();
            resultCount = 0;
        }



استبدل الشرط كاملاً ب : 
        int cubeResultFIXED;
        if (resultText.size() < 20)
        {
            cubeResultFIXED = 20 - resultText.size();
        }
        else
        {
            cubeResultFIXED = resultText.size() - 20;
        }
        if (cubeResultFIXED >= CHAT_MAX_LEN)
        {
            sys_err("[CubeInfo] Too long cube result list text. (NPC: %d, FIXED_size_value_exygo: %d, length: %d)", npcVNUM, cubeResultFIXED, resultText.size());
            resultText.clear();
            resultCount = 0;
        }



نبحث عن (هذا السطر فقط وليس الدالة كاملة!!) : 
if (false == bCatchInfo)

نستبدلها بـ :
if (!bCatchInfo || materialInfoText.size() == 0)


8- إصلاح خطأ فتح الصناديق أثناء إمتلاء الجرد (ما يسبب سقوط البنود على الأرض وبعضها قد يختفي)
نقوم بفتح ملف char_item.cpp ونقوم بالبحث عن : 
case ITEM_GIFTBOX:
}

نقوم بإضافة : 
                int pos = GetEmptyInventory(item->GetSize());
                if(pos == -1)
                {
                    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("No empty slot in your inventory."));
                    return false;
                }



9- إصلاح Game Core بسبب شرط GetDesc() في دالة Disconnect
نقوم بفتح ملف char.cpp 
نقوم بالبحث عن :
    if (g_TeenDesc)
    {
        int        offset = 0;
        char    buf[245] = {0};

        buf[0] = HEADER_GT_LOGOUT;
        offset += 1;

        memset(buf+offset, 0x00, 2);
        offset += 2;

        TAccountTable    &acc_table = GetDesc()->GetAccountTable();
        memcpy(buf+offset, &acc_table.id, 4);
        offset += 4;

        g_TeenDesc->Packet(buf, offset);
    }

    if (GetDesc())
    {
        GetDesc()->BindCharacter(NULL);
        // BindDesc(NULL);
    }



استبدلهم بـ :
    if (GetDesc())
    {
        packet_point_change pack;
        pack.header = HEADER_GC_CHARACTER_POINT_CHANGE;
        pack.dwVID = m_vid;
        pack.type = POINT_PLAYTIME;
        pack.value = GetRealPoint(POINT_PLAYTIME) + (get_dword_time() - m_dwPlayStartTime) / 60000;
        pack.amount = 0;
        GetDesc()->Packet(&pack, sizeof(struct packet_point_change));
        GetDesc()->BindCharacter(NULL);
//        BindDesc(NULL);
    }



10- حل مشكلة Game Core بسبب الأبراج 
نقوم بفتح ملف char.cpp والبحث عن :
    //if (m_pkDungeon && IsPC())
    //SetDungeon(NULL);



استبدلها بـ : 
    if (m_pkDungeon && IsPC() && !pkParty)
    SetDungeon(NULL);



نكتفي بهذا القدر .

(ملحوظة : يرجى مراعاة المسافات لضمان عدم وجود مشاكل)

هذا الحلول أساسية لمن يريد البدء بملفاته ويقوم بصناعتها بنفسه ، فمن يستعمل الملفات التركية معه الله 

كل الود ،،

والسلام خير ختام .
منظمة قانون التطور - Evolution Law Organization

Powered by PBBoard ©Version 3.0.3