ترقيع رقع ثغرات السورس - Part II - منظمة قانون التطور - Evolution Law Organization





غير متواجد
معلومات الكاتب ▼
رقم العضوية : 540
المشاركات : 102
الجنس : ذكر
الإنذارات : 3
يتابعهم : 0
يتابعونه : 2
الإجابات المقدمة : 4
الرصيد : 0$
رصيد المتجر: 0.107$
قوة السمعة : 70
27-05-2020 11:50 مساء
السلام عليكم ورحمة الله وبركاته ،،

نكمل موضوعنا بخصوص إغلاق الثغرات 

1- إغلاق ثغرة التدبيل بشكل نهائي في كل من التفعيلاتالأحبالالجرع
قم بفتح ملف char_item.cpp وأضف فيه الآتي :

bool CHARACTER::CheckTimeUsed(LPITEM item)
{
    switch (item->GetVnum())
    {
        case 50821:    case 50822:    case 50823:    case 50824:    case 50825:    case 50826:    case 50827:    case 50828:    case 20171:    case 20172:
        case 27866:    case 27868:    case 27870:    case 27873:    case 39026:    case 50093:    case 50094:        
        case 50123:    case 50801:    case 50802:    case 50817:    case 50818:    case 50819:    case 50820:    
        case 39010:    case 39017:    case 39018:    case 39019:    case 39020:    case 39024:    case 39025:
        case 39031:    case 50813:    case 50814:    case 71014:    case 71015:    case 71016:    case 71017:
        case 71027:    case 71028:    case 71029:    case 71030:    case 71034:    case 71044:    case 71045:
        case 71101:    case 71102:    case 71153:    case 71154:    case 71155:    case 71156:    case 72025:
        case 72026:    case 72027:    case 72031:    case 72032:    case 72033:    case 72034:    case 72035:    
        case 72036:    case 72037:    case 72038:    case 72039:    case 72040:    case 72041:    case 72042:    
        case 72046:    case 72047:    case 72048:    case 72312:    case 72313:    case 72501:    case 72502:    
        case 76003:    case 76017:    case 76018:    case 27126:    case 27127:    case 27128:    case 27129:    
        case 27130:    case 27131:    case 27132:    case 27133:

            int pGetTime[] = {5};
            int pGetFlag = GetQuestFlag("item.last_time");

            if (pGetFlag)
            {
                if (get_global_time() < pGetFlag + pGetTime[0])
                {
                    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("you have to wait %u seconds before use %s again."), pGetTime[0], item->GetName());
                    return false;
                }
            }
        break;
    }
        return true;
}



والأن قم بالبحث عن (3 مرات) :
                    case USE_ABILITY_UP:
                        {



أضف بعدها : 
                            if ((CheckTimeUsed(item) == false))
                            {
                                return false;
                            }



قم بالبحث عن (مرتين) : 
case USE_AFFECT :
                        {

أضف بعدها : 
                            if ((CheckTimeUsed(item) == false))
                            {
                                return false;
                            }


قم بالبحث عن : 
case ITEM_BLEND:

أضف بعدها : 
            if ((CheckTimeUsed(item) == false))
            {
                return false;





            }



والأن قم بفتح ملف char.h وأبحث عن :
void            SetName(const std::string& name) { m_stName = name; }

أضف فوقها : 
bool            CheckTimeUsed(LPITEM item);

قم بفتح ملف i*nput_login.cpp
وقم بالبحث عن :
ch->StartCheckSpeedHackEvent();

أضف بعدها : 
ch->SetQuestFlag("item.last_time", get_global_time());


تمت

2- إصلاح علاوة إستعادة نقاط الحياةالأسلوب 

قم بفتح ملف char_battle.cpp

قم بالبحث عن : 
            if (pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) && number(0, 4) > 0) // 80% 확률
            {
                int i = ((iCurHP>=0)?MIN(dam, iCurHP):dam) * pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) / 100; //@fixme107

                if (i)
                {
                    CreateFly(FLY_HP_SMALL, pAttacker);
                    pAttacker->PointChange(POINT_HP, i);
                }
            }

            // 칠 때마다 SP회복
            if (pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) && number(0, 4) > 0) // 80% 확률
            {
                int i = ((iCurHP>=0)?MIN(dam, iCurHP):dam) * pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) / 100; //@fixme107

                if (i)
                {
                    CreateFly(FLY_SP_SMALL, pAttacker);
                    pAttacker->PointChange(POINT_SP, i);
                }
            }


استبدلها بـ : 
            int iAbsoHP_ptr = pAttacker->GetPoint(POINT_HIT_HP_RECOVERY);
            if (iAbsoHP_ptr)
            {
                if (number(1, 100) <= iAbsoHP_ptr)
                {
                    int iHPAbso = MIN(dam, iCurHP) * pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) / 100;

                    if ((pAttacker->GetHP() > 0) && (pAttacker->GetHP() + iHPAbso < pAttacker->GetMaxHP()) && (GetHP() > 0) && (iHPAbso > 0))
                    {
                        CreateFly(FLY_HP_SMALL, pAttacker);
                        pAttacker->PointChange(POINT_HP, iHPAbso);
                    }
                }
            }
            // ?¥ ¶§¸¶´? SP?¸?¹
            int iAbsoSP_ptr = pAttacker->GetPoint(POINT_HIT_SP_RECOVERY);
            if (iAbsoSP_ptr)
            {
                if (number(1, 100) <= iAbsoSP_ptr)
                {
                    int iSPAbso = MIN(dam, iCurSP) * pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) / 100;

                    if ((pAttacker->GetSP() > 0) && (pAttacker->GetSP() + iSPAbso < pAttacker->GetMaxSP()) && (GetSP() > 0) && (iSPAbso > 0))
                    {
                        CreateFly(FLY_SP_SMALL, pAttacker);
                        pAttacker->PointChange(POINT_SP, iSPAbso);
                    }
                }
            }



3- إصلاح ثغرة الأسم الطويل من السورس

قم بفتح ملف i*nput_login.cpp وقم بالبحث عن :

packFailure.header = HEADER_GC_CHARACTER_CREATE_FAILURE;


أضف بعدها : 
    if (strlen(pinfo->name) > 12)
    {
        d->Packet(&packFailure, sizeof(packFailure));
        return;
    }



4- إصلاح ثغرة حقن تخص DBManager
قم بفتح ملف db.cpp وقم بإستبدال دالتي : 
void DBManager::Query(const char * c_pszFormat, ...)
{
الكود هنا ..
}
SQLMsg * DBManager::DirectQuery(const char * c_pszFormat, ...)
{
الكود هنا

}


بالآتي : 
void DBManager::Query(const char * c_pszFormat, ...)
{
    char szQuery[4096];

    va_list args;
    va_start(args, c_pszFormat);
    vsnprintf(szQuery, sizeof(szQuery), c_pszFormat, args);
    va_end(args);
    std::string sQuery(szQuery);
    m_sql.AsyncQuery(sQuery.substr(0, sQuery.find_first_of(";") == std::string::npos ? sQuery.length() : sQuery.find_first_of(";")).c_str());
}

SQLMsg * DBManager::DirectQuery(const char * c_pszFormat, ...)
{
    char szQuery[4096];
    va_list args;
    va_start(args, c_pszFormat);
    vsnprintf(szQuery, sizeof(szQuery), c_pszFormat, args);
    va_end(args);

    std::string sQuery(szQuery);

    return m_sql_direct.DirectQuery(sQuery.substr(0, sQuery.find_first_of(";") == std::string::npos ? sQuery.length() : sQuery.find_first_of(";")).c_str());

}



5- إصلاح Game Core بسبب أمر GetQuestFlag 
قم بفتح ملف char.cpp وقم بالبحث عن : 
return pPC->GetFlag(flag);


أضف فوقها : 
    if(!pPC)
    {
        sys_err("Nullpointer in CHARACTER::GetQuestFlag %lu", GetPlayerID());
        return 0;
    }



6- إغلاق ثغرة تغيير الإمبراطورية أثناء الوجود في مجموعة 
قم بفتح ملف questlua_pc.cpp وقم بالبحث عن : 
lua_pushnumber(L, ch->ChangeEmpire((unsigned char)lua_tonumber(L, 1)));


أضف فوقها : 
        if(ch->GetParty())
        {
            lua_pushnumber(L, 4);
            return 0;
        }



7- منع قتل اللاعبين أثناء فتحهم لمتاجر خاصة
قم بفتح ملف battle.cpp وقم بالبحث عن :
    if (victim->IsDead())
        return false;



أضف بعدها : 
    if (victim->GetMyShop())
        return false;



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


أضف بعدها : 
    if (pkVictim->GetMyShop())
        return false;



8- إصلاح Game Core بسبب المجموعة 
قم بفتح ملف party.cpp وقم بالبحث عن دالة :
void CParty::UpdateOfflineState(DWORD dwPID)
{
محتوى الدالة هنا .. 

}


استبدلها كاملةً بـ :
void CParty::UpdateOfflineState(DWORD dwPID)
{
    //const TMember& r = m_memberMap[dwPID];

    TPacketGCPartyAdd p;
    p.header = HEADER_GC_PARTY_ADD;
    p.pid = dwPID;
    memset(p.name, 0, CHARACTER_NAME_MAX_LEN + 1);
    for (TMemberMap::iterator it = m_memberMap.begin(); it != m_memberMap.end(); ++it)
    {
        if (it->second.pCharacter && it->second.pCharacter->GetDesc())
        {
            if (it->second.pCharacter->GetDungeon())
                it->second.pCharacter->GetDungeon()->ExitAllToStartPosition();
            else
                it->second.pCharacter->GetDesc()->Packet(&p, sizeof(p));
        }
    }
}



9- إغلاق ثغرة إلتقاط العتاد في المجموعة

قم بالبحث عن : 
            if (!owner)
                return false;



أضف بعدها : 

            if (owner)
            {
                if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
                {
                    BYTE bCount = item->GetCount();
                    for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = owner->GetInventoryItem(i);

                        if (!item2)
                            continue;
                        if (item2->GetVnum() == item->GetVnum())
                        {
                            int j;

                            for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
                            if (item2->GetSocket(j) != item->GetSocket(j))
                                break;

                            if (j != ITEM_SOCKET_MAX_NUM)
                                continue;

                            BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
                            bCount -= bCount2;

                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                            {
                                owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Player: %s Has %s"), GetName(), item2->GetName());
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Player: %s Has %s"), owner->GetName(), item2->GetName());
                                M2_DESTROY_ITEM(item);
                                if (item2->GetType() == ITEM_QUEST)
                                    quest::CQuestManager::instance().PickupItem(owner->GetPlayerID(), item2);
                                return true;
                            }
                        }
                    }
                    item->SetCount(bCount);

                }

            }



10- إغلاق ثغرة إرتداء نفس البند مرتين 
قم بفتح ملف char_item.cpp

قم بالبحث عن دالة : 
bool CHARACTER::CanEquipNow(const LPITEM item, const TItemPos& srcCell, const TItemPos& destCell)


بنهاية الدالة قبل return true;

أضف الآتي : 
#define ENABLE_ITEM_RING_FIX /* تعريف الإصلاح */
#ifdef ENABLE_ITEM_RING_FIX
    if (item->GetType() == ITEM_RING)
    {
        LPITEM ring1 = GetWear(WEAR_RING1);
        LPITEM ring2 = GetWear(WEAR_RING2);
        
        if (ring1 && (ring1->GetVnum() == item->GetVnum()))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("같은 종류의 유니크 아이템 두 개를 동시에 장착할 수 없습니다."));
            return false;            
        }
        
        if (ring2 && (ring2->GetVnum() == item->GetVnum()))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("같은 종류의 유니크 아이템 두 개를 동시에 장착할 수 없습니다."));
            return false;            
        }
    }
#endif

#define ENABLE_COSTUEM_WEAPON_FIXES // تفعيل الإصلاح
#ifdef ENABLE_COSTUEM_WEAPON_FIXES
#ifdef ENABLE_WEAPON_COSTUME_SYSTEM /* إن كان لديك أزياء الأسلحة */
#ifdef ENABLE_NEW_ARROW_SYSTEM /* إن كان لديك جعبة الأسهم */
    if (item->GetType() == ITEM_WEAPON && item->GetSubType() != WEAPON_ARROW && item->GetSubType() != WEAPON_UNLIMITED_ARROW)
#else
    if (item->GetType() == ITEM_WEAPON && item->GetSubType() != WEAPON_ARROW)
#endif
    {
        LPITEM pkItem = GetWear(WEAR_COSTUME_WEAPON);
        if (pkItem)
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("For can do this unwear the costume weapon."));
            return false;
        }
    }
    else if (item->GetType() == ITEM_COSTUME && item->GetSubType() == COSTUME_WEAPON)
    {
        LPITEM pkItem = GetWear(WEAR_WEAPON);
        if (!pkItem)
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can't wear a costume weapon without have a weapon weared."));
            return false;
        }
        else if (item->GetValue(3) != pkItem->GetSubType())
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can't wear a costume weapon who has different type of your weapon."));
            return false;
        }
        else if (pkItem->GetType() == ITEM_ROD || pkItem->GetType() == ITEM_PICK)
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("kazma_veya_olta_takili"));
            return false;
        }
    }
    
    if (item->GetType() == ITEM_ROD || item->GetType() == ITEM_PICK)
    {
        LPITEM pkItem = GetWear(WEAR_COSTUME_WEAPON);
        if (pkItem)
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("For can do this unwear the costume weapon."));
            return false;
        }
    }
#endif
#endif

#define ENABLE_WEDDING_SUIT_FIX
#ifdef ENABLE_WEDDING_SUIT_FIX /* إغلاق ثغرة إرتداء أزياء فوق بدلات العرس */
    if (item->GetType() == ITEM_COSTUME && item->GetSubType() == COSTUME_BODY)
    {
        LPITEM atakanxd = GetWear(WEAR_BODY);
        if (atakanxd && (atakanxd->GetVnum() >= 11901 && atakanxd->GetVnum() <= 11914))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("you can't wear costume body on wedding suit."));
            return false;
        }
    }

    if (item->GetVnum() >= 11901 && item->GetVnum() <= 11914)
    {
        LPITEM atakan = GetWear(WEAR_COSTUME_BODY);
        if (atakan && (atakan->GetType() == ITEM_COSTUME && atakan->GetSubType() == COSTUME_BODY))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("you can't wear wedding suit on costume body."));
            return false;
        }
    }
#endif



طبعا بإمكانك إزالة جميع شروط #ifdef وجعلها أساسية لملفاتك لكن قمت بوضعها إحتياطاً - وإن أردت تعطيلها فقط بوضع علامتي // قبل الdefine#

11- إصلاح خطأ دالة pc.select_vid (قد تتسبب في مشاكل ربما منها Game Core)

قم فتح ملف questlua_pc.cpp وقم بالبحث عن : 
lua_pushnumber(L, (DWORD)ch->GetVID());


استبدلها بـ : 
 lua_pushnumber(L, ch ? (DWORD)ch->GetVID() : 0); // return 0 if no player exist 


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

كل الود ،،

والسلام خير ختام ~



توقيع: sharqawy
" ما جادلت عالماً إلا غلبته ، وما جادلت جاهلاً إلا غلبني "

أفضل ملفات عربية للعمل عليها

يجب عليك التسجيل لمشاهدة الرابط يجب عليك التسجيل لمشاهدة الرابط
مقيمين الموضوع: yumeko،

غير متواجد
معلومات الكاتب ▼
رقم العضوية : 2
المشاركات : 478
الجنس : ذكر
الدعوات : 15
يتابعهم : 1
يتابعونه : 24
الإجابات المقدمة : 10
الرصيد : 5$
رصيد المتجر: 14.41$
المنتجات: 8
قوة السمعة : 220
موقعي : زيارة موقعي
  • الأوسمة

    الإدارة
28-05-2020 10:31 مساء
[1]
يثبت للاهمية

توقيع: Quest
Quest
غير متواجد
معلومات الكاتب ▼
رقم العضوية : 59
المشاركات : 68
الجنس : ذكر
يتابعهم : 1
يتابعونه : 4
الإجابات المقدمة : 2
الرصيد : 0$
رصيد المتجر: 0.685$
قوة السمعة : 35
29-05-2020 01:14 صباحا
[2]
من افيد المواضيع في المنظمة
بارك الله فيك

توقيع: Baba Voss
Every Child Eventually Comes To a Bridge That They Must Cross Alone


Baba Voss#7692
غير متواجد
معلومات الكاتب ▼
رقم العضوية : 540
المشاركات : 102
الجنس : ذكر
الإنذارات : 3
يتابعهم : 0
يتابعونه : 2
الإجابات المقدمة : 4
الرصيد : 0$
رصيد المتجر: 0.107$
قوة السمعة : 70
02-06-2020 07:16 مساء
[3]
شكراً لكم

توقيع: sharqawy
" ما جادلت عالماً إلا غلبته ، وما جادلت جاهلاً إلا غلبني "

أفضل ملفات عربية للعمل عليها

يجب عليك التسجيل لمشاهدة الرابط يجب عليك التسجيل لمشاهدة الرابط
غير متواجد
معلومات الكاتب ▼
رقم العضوية : 256
المشاركات : 428
الجنس : ذكر
يتابعهم : 16
يتابعونه : 8
الإجابات المقدمة : 19
الرصيد : 0$
رصيد المتجر: 0.473$
قوة السمعة : 210
موقعي : زيارة موقعي
03-07-2020 08:25 مساء
[4]
تصحيح الموضوع
-----------------
رقم : 1- إغلاق ثغره التدبيل


case USE_ABILITY_UP
}


التصحيح :
ابحث فقط مرتين علي 

case USE_ABILITY_UP
}


والمره الثالثه هتبحث عن

case USE_ABILITY_UP :


------------------------------
رقم :  9-إغلاق ثغرة إلتقاط العتاد في المجموعه

لم يتم ذكر الورقه
وهي
 char_item.cpp
------------------------------
فقط عند البحث هذا ما رأيته 
وشكرا جدا علي الشرح
تم تحرير الموضوع بواسطة :Dev Ahmed Shaban بتاريخ:03-07-2020 08:29 مساء. سبب التعديل : خطأ املائي
غير متواجد
معلومات الكاتب ▼
رقم العضوية : 1065
المشاركات : 7
الجنس : ذكر
يتابعهم : 0
يتابعونه : 0
الرصيد : 0$
رصيد المتجر: 0.022$
قوة السمعة : 10
29-07-2020 06:29 صباحا
[5]
يعطيك العافيه على الشرح  biggrin2

غير متواجد
معلومات الكاتب ▼
رقم العضوية : 1576
المشاركات : 5
الجنس : ذكر
يتابعهم : 0
يتابعونه : 0
الرصيد : 0$
رصيد المتجر: 0.205$
قوة السمعة : 10
20-11-2020 05:10 مساء
[6]
شي جميل الصراحة 



المواضيع المتشابهه
فتح الموضوع بصفحة مستقلة ترقيع [تجميعة] رقع ثغرات السورس - Part I
sharqawy - بتاريخ: 02-06-2020 07:07 مساء
الردود : 16
الزوار : 1069
عدد المشاهدات:
عدد الردود:
1069
16

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع :1(0عضو و1ضيف)
ضيف،