السلام عليكم ورحمة الله وبركاته ،،
في هذا الموضوع سيتم عرض حوالي 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;
أضف بعدها :
نقوم بفتح ملف 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 كاملاً بدايةً من 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 (!bCatchInfo || materialInfoText.size() == 0)
8- إصلاح خطأ فتح الصناديق أثناء إمتلاء الجرد (ما يسبب سقوط البنود على الأرض وبعضها قد يختفي)
نقوم بفتح ملف char_item.cpp ونقوم بالبحث عن :
نقوم بإضافة :
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);
نكتفي بهذا القدر .
(ملحوظة : يرجى مراعاة المسافات لضمان عدم وجود مشاكل)
هذا الحلول أساسية لمن يريد البدء بملفاته ويقوم بصناعتها بنفسه ، فمن يستعمل الملفات التركية معه الله
كل الود ،،
والسلام خير ختام .