Merhaba arkadaşlar.

Sistem özellikleri;
soul pack dosyalarını pack klasörünüze atıp Index'e eklemeyi unutmayın.
refine_proto'dan dönüşümleri ayarlamayı unutmayın.
Kanıt;
Hayırlı kullanımlar.
Rüya Ruhu Sistemi Nedir?
Metin2 özel sunucularında gelişmiş PvP sistemlerine odaklanan geliştiriciler için kritik öneme sahip olan Rüya Ruhu Sistemi, oyuncuların karakter güçlerini artırmada kullanılan etkileyici bir özelliktir. Bu sistem, oyuncuların belirli eşyaları birleştirerek güçlü bonuslar kazanmalarını sağlar. Özellikle C++ tabanlı sistemlerde entegre edilmesiyle birlikte, hem estetik hem de stratejik açıdan dikkat çeker. Rüya Ruhu, oyuncuların karakterlerini daha güçlü hale getirmek için kullandıkları bir yükseltme mekanizmasıdır. Bu sistem genellikle PvP odaklı sunucularda popülerdir ve oyuncuların rekabet gücünü artırmada önemli rol oynar.
Sistem Nasıl Çalışır?
Rüya Ruhu sistemi, oyuncuların elde ettikleri Rüya Taşı ve Ruh eşyalarını bir araya getirerek karakterlerine bonuslar kazandırmalarını sağlar. Bu işlem genellikle bir GUI üzerinden yönetilir. Python tabanlı Py GUI sistemleri, bu süreçte kullanıcı dostu bir arayüz sunarak deneyimi artırır. Oyuncular, belirli sayıda Rüya Taşı ve Ruh birleştirildiğinde karakterlerine ek hasar, savunma veya özel efektler kazandırabilirler. Bu işlemler genellikle Python Script ile kontrol edilir ve sunucu tarafında game core ile entegre çalışır.
C++ Kaynak Kod Entegrasyonu
Metin2 özel sunucularında Rüya Ruhu sistemi, genellikle C++ tabanlı kaynak kodlarla entegre edilir. Geliştiriciler, server src dosyalarına bu sistemi eklemek için source edit işlemleri yapar. Bu süreçte martysama gibi kaynaklar oldukça faydalı olabilir. Rüya Ruhu sisteminin doğru çalışabilmesi için hem auth hem de game sunucularında gerekli düzenlemeler yapılmalıdır. Geliştiriciler, db core üzerinde veritabanı bağlantılarını da eksiksiz yapmalıdır.
Python ve Py Root Kullanımı
Sistemde kullanılan Python scriptleri genellikle py root altında tutulur. Bu scriptler, oyuncuların Rüya Ruhu yükseltmelerini gerçekleştirmesini sağlar. UIScript ile birlikte çalışan bu yapı, kullanıcı arayüzünü etkili şekilde destekler. Py GUI sistemleri sayesinde, oyuncular Rüya Ruhu işlemlerini daha kolay ve anlaşılır bir şekilde yapabilirler. Bu, özellikle yeni başlayan geliştiriciler için öğrenmeyi kolaylaştırır.
Sunucu Paketleme ve Dağıtım
Oluşturulan Rüya Ruhu sistemi, pack olarak derlenip oyunculara sunulabilir. Bu süreçte compile işlemleri önemlidir. Doğru paketleme sayesinde sistem, farklı sunuculara kolayca entegre edilebilir. Bu tür sistemler genellikle PvP odaklı sunucularda tercih edilir ve oyuncuların ilgisini çekecek niteliktedir.
What is Dream Soul System?
The Dream Soul System is a crucial feature for developers focusing on advanced PvP systems in Metin2 private servers. This system allows players to enhance their character power by combining specific items. Integrated with C++ based systems, it attracts attention both aesthetically and strategically. Dream Soul is a power-up mechanism that players use to strengthen their characters. It is especially popular in PvP focused servers and plays a significant role in increasing player competitiveness.
How Does the System Work?
The Dream Soul system allows players to grant bonuses to their characters by combining obtained Dream Stones and Soul items. This process is usually managed through a GUI. Py GUI systems based on Python provide a user-friendly interface that enhances the experience. When players combine a certain number of Dream Stones and Souls, they can grant additional damage, defense, or special effects to their characters. These operations are typically controlled via Python Script and integrated with the game core on the server side.
C++ Source Code Integration
In Metin2 private servers, the Dream Soul system is usually integrated with C++ based source codes. Developers perform source edit operations to add this system into server src files. Resources like martysama can be very helpful during this process. For the system to work correctly, necessary adjustments must be made in both auth and game servers. Developers must also complete database connections properly within the db core.
Using Python and Py Root
Python scripts used in the system are generally stored under py root. These scripts allow players to perform Dream Soul upgrades. Together with UIScript, this structure effectively supports the user interface. Thanks to Py GUI systems, players can execute Dream Soul operations more easily and clearly, which makes learning easier especially for beginner developers.
Server Packaging and Distribution
The created Dream Soul system can be compiled as a pack and distributed to players. Compilation processes are important during this phase. Proper packaging enables the system to be easily integrated into different servers. Such systems are commonly preferred in PvP-focused servers and have the quality to attract player interest.
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
Sistem özellikleri;
- <li data-xf-list-type="ul">Rüya Ruhu saldırı hasarını artırır. <li data-xf-list-type="ul">Gök Ruhu beceri hasarını artırır. <li data-xf-list-type="ul">PvP ve Dönüşüm sırasında herhangi bir işleve sahip değiller, sadece PvE modunda çalışır. <li data-xf-list-type="ul">Eşya efektleri Official sunucudaki ile aynıdır. <li data-xf-list-type="ul">Aynı anda çalıştırılabilir. <li data-xf-list-type="ul">Rüya Ruhu düşmana karşı vurulan her bir darbede etki gösterir. <li data-xf-list-type="ul">Gök Ruhu düşmana karşı beceri kullanımı başına etki gösterir.
Kod:
//müsait bir yere ekle; #define ENABLE_ITEM_SOUL_SYSTEM
Kod:
//arat; enum EItemTypes //fonksiyonun içinde bul; ITEM_BELT, //altına ekle; (ITEM_BELT'in altında tür varsa o türün altına ekleyin, yani aynı blok içerisinde fakat bloğun sonunda olsun yapacağınız eklenti.) #ifdef ENABLE_ITEM_SOUL_SYSTEM ITEM_SOUL, #endif //tekrar arat; enum EDragonSoulSubType //fonksiyonun altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM enum ESoulSubType { RED_SOUL, BLUE_SOUL, }; #endif //tekrar arat; REFINE_TYPE_BDRAGON, //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM REFINE_TYPE_SOUL_SCROLL, #endif
Kod:
//arat; "ITEM_BELT", //altına ekle; (ITEM_BELT'in altında tür varsa o türün altına ekleyin, yani aynı blok içerisinde fakat bloğun sonunda olsun yapacağınız eklenti.) #ifdef ENABLE_ITEM_SOUL_SYSTEM "ITEM_SOUL", #endif //tekrar arat; static string arSub31[] = { "EXTRACT_DRAGON_SOUL", "EXTRACT_DRAGON_HEART", }; //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM static string arSub37[] = { "SOUL_RED", "SOUL_BLUE", "0", }; #endif //tekrar arat; static string* arSubType[] = //fonksiyonun içinde bul; 0, //değiştir; (Fonksiyon içinde birden fazla " 0," olacaktır, fonksiyonun sonundakini değiştirin.) #ifdef ENABLE_ITEM_SOUL_SYSTEM arSub37, #endif //tekrar arat; static int arNumberOfSubtype[_countof(arSubType)] = //fonksiyonun içinde bul; 0, //değiştir; (Fonksiyon içinde birden fazla " 0," olacaktır, fonksiyonun sonundakini değiştirin.) #ifdef ENABLE_ITEM_SOUL_SYSTEM sizeof(arSub37) / sizeof(arSub37[0]), #endif
Kod:
//arat; AFFECT_QUEST_START_IDX = 1000 //üstüne ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM AFFECT_SOUL, #endif //tekrar arat; AFF_BITS_MAX //üstüne ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM AFF_RED_SOUL, AFF_BLUE_SOUL, AFF_MIX_SOUL, #endif
Kod:
//arat; if (pkVictim->Damage(pkAttacker, iDam, DAMAGE_TYPE_NORMAL)) return (BATTLE_DEAD); //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM if (!pkAttacker->IsPolymorphed() && !pkVictim->IsPC()) iDam *= pkAttacker->GetSoulDamVal(true); #endif
Kod:
//arat; int GetSyncHackCount() { return m_iSyncHackCount; } //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM public: void CheckSoul(); float GetSoulDamVal(bool bMelee); bool CheckSoulItem(bool bBlue); #endif
Kod:
//arat; BDRAGON_SCROLL = 6, //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM SOUL_SCROLL = 7,//Buradaki 7'nin sıraya göre değişmesi gerekebilir. #endif //tekrar arat; else if (pkItemScroll->GetValue(0) == BDRAGON_SCROLL) { if (item->GetType() != ITEM_METIN || item->GetRefineLevel() != 4) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("이 아이템으로 개량할 수 없습니다.")); return false; } } //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM else if (pkItemScroll->GetValue(0) == SOUL_SCROLL) { if (item->GetType() != ITEM_SOUL) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("you can only upgrade soul items")); return false; } } #endif //tekrar arat; pkItemScroll->GetValue(0) == YAGONG_SCROLL) //değiştir; pkItemScroll->GetValue(0) == YAGONG_SCROLL #ifdef ENABLE_ITEM_SOUL_SYSTEM || pkItemScroll->GetValue(0) == SOUL_SCROLL #endif ) //tekrar arat; else if (pkItemScroll->GetValue(0) == HYUNIRON_CHN) {} //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM else if (pkItemScroll->GetValue(0) == SOUL_SCROLL) { success_prob += pkItemScroll->GetValue(1); } #endif //tekrar arat; else if (pkItemScroll->GetValue(0) == YAGONG_SCROLL) { szRefineType = "YAGONG_SCROLL"; } //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM else if (pkItemScroll->GetValue(0) == SOUL_SCROLL) { szRefineType = "SOUL_SCROLL"; } #endif //tekrar arat; bool CHARACTER::DoRefineWithScroll(LPITEM item) //fonksiyonun altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM void CHARACTER::CheckSoul() { for (int i = 0; i < INVENTORY_MAX_NUM; ++i) { LPITEM item = GetInventoryItem(i); if (!item) continue; if (item->GetType() == ITEM_SOUL) { if (item->GetSocket(1) > 0) { UseItemEx(item, TItemPos(item->GetWindow(), item->GetCell())); } } } } float CHARACTER::GetSoulDamVal(bool bMelee) { for (int i = 0; i < INVENTORY_MAX_NUM; ++i) { LPITEM item = GetInventoryItem(i); if (!item) continue; if (item->GetType() == ITEM_SOUL) { if (bMelee) { if (item->GetSocket(2) == 0) { if (item->GetSubType() == RED_SOUL) { if (IsAffectFlag(AFF_MIX_SOUL)) { RemoveAffect(AFF_MIX_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_BLUE_SOUL, INFINITE_AFFECT_DURATION, 0, false); } else if (IsAffectFlag(AFF_RED_SOUL)) { RemoveAffect(AFFECT_SOUL); } } item->SetCount(item->GetCount()-1); } if (item->GetSubType() == RED_SOUL && item->GetSocket(1) > 0) { item->SetSocket(2, item->GetSocket(2) - 1); if (item->GetSocket(1) > 0) return float(item->GetValue(3)/10.0f); return 1.0f; } } else { if (item->GetSocket(2) == 0) { if (item->GetSubType() == BLUE_SOUL) { if (IsAffectFlag(AFF_MIX_SOUL)) { RemoveAffect(AFFECT_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_RED_SOUL, INFINITE_AFFECT_DURATION, 0, false); } else if (IsAffectFlag(AFF_BLUE_SOUL)) { RemoveAffect(AFFECT_SOUL); } } item->SetCount(item->GetCount()-1); } if (item->GetSubType() == BLUE_SOUL && item->GetSocket(1) > 0) { item->SetSocket(2, item->GetSocket(2) - 1); if (item->GetSocket(1) > 0) return float(item->GetValue(3)/10.0f); return 1.0f; } } } } return 1.0f; } bool CHARACTER::CheckSoulItem(bool bBlue) { for (int i = 0; i < INVENTORY_MAX_NUM; ++i) { LPITEM item = GetInventoryItem(i); if (!item) continue; if (item->GetType() == ITEM_SOUL) { if (bBlue) { if (item->GetSubType() == BLUE_SOUL) { if (item->GetSocket(1) > 0) { return true; } return false; } } else { if (item->GetSubType() == RED_SOUL) { if (item->GetSocket(1) > 0) { return true; } return false; } } } } return false; } #endif //tekrar arat; else if (pkItem->GetValue(0) == BDRAGON_SCROLL) { if (pkTarget->GetRefineSet() != 702) return false; RefineInformation(pkTarget->GetCell(), REFINE_TYPE_BDRAGON, pkItem->GetCell()); } //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM else if (pkTarget->GetValue(0) == SOUL_SCROLL) { if (pkTarget->GetType() != ITEM_SOUL) return false; RefineInformation(pkTarget->GetCell(), REFINE_TYPE_SOUL_SCROLL, pkItem->GetCell()); } #endif //tekrar arat; if (item2->GetVnum() >= 28330 && item2->GetVnum() <= 28343) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("+3 영석은 이 아이템으로 개량할 수 없습니다")); return false; } //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM if (item2->GetType() == ITEM_SOUL) { if (item->GetValue(0) != SOUL_SCROLL) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("SADECE_RUH_PARSOMENI_ILE_YUKSELTEBILIRSIN")); return false; } } #endif //tekrar arat; case ITEM_EXTRACT: { LPITEM pDestItem = GetItem(DestCell); if (NULL == pDestItem) { return false; } switch (item->GetSubType()) { case EXTRACT_DRAGON_SOUL: if (pDestItem->IsDragonSoul()) { return DSManager::instance().PullOut(this, NPOS, pDestItem, item); } return false; case EXTRACT_DRAGON_HEART: if (pDestItem->IsDragonSoul()) { return DSManager::instance().ExtractDragonHeart(this, pDestItem, item); } return false; default: return false; } } break; //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM case ITEM_SOUL: { switch (item->GetSubType()) { case RED_SOUL: { if (item->GetSocket(1) != 0) { if (!IsAffectFlag(AFF_RED_SOUL)) { item->SetSocket(1, 0); item->Lock(false); } if (IsAffectFlag(AFF_MIX_SOUL)) { if (CheckSoulItem(true) == true) { RemoveAffect(AFFECT_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_BLUE_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1, 0); item->Lock(false); return true; } else if (CheckSoulItem(false) == true) { RemoveAffect(AFFECT_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_RED_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1, 1); item->Lock(true); return true; } else { RemoveAffect(AFFECT_SOUL); item->SetSocket(1, 0); item->Lock(false); return true; } } else if (IsAffectFlag(AFF_BLUE_SOUL)) { RemoveAffect(AFFECT_SOUL); if (IsAffectFlag(AFF_RED_SOUL)) { AddAffect(AFFECT_SOUL, 0, 0, AFF_RED_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1, 1); item->Lock(true); return true; } item->SetSocket(1,0); item->Lock(false); return true; } else if (IsAffectFlag(AFF_RED_SOUL)) { RemoveAffect(AFFECT_SOUL); item->SetSocket(1,0); item->Lock(false); return true; } } else { if (IsAffectFlag(AFF_RED_SOUL)) return true; if (IsAffectFlag(AFF_BLUE_SOUL)) { RemoveAffect(AFFECT_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_MIX_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1,1); item->Lock(true); return true; } else if (!IsAffectFlag(AFF_MIX_SOUL)) { RemoveAffect(AFFECT_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_RED_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1,1); item->Lock(true); return true; } } } break; case BLUE_SOUL: { if (item->GetSocket(1) != 0) { if (IsAffectFlag(AFF_MIX_SOUL)) { if (CheckSoulItem(false) == true) { RemoveAffect(AFFECT_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_RED_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1, 0); item->Lock(false); return true; } else if (CheckSoulItem(true) == true) { RemoveAffect(AFFECT_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_BLUE_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1, 1); item->Lock(true); return true; } else { RemoveAffect(AFFECT_SOUL); item->SetSocket(1, 0); item->Lock(false); return true; } } else if (IsAffectFlag(AFF_RED_SOUL)) { RemoveAffect(AFFECT_SOUL); if (IsAffectFlag(AFF_BLUE_SOUL)) { AddAffect(AFFECT_SOUL, 0, 0, AFF_BLUE_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1, 1); item->Lock(true); return true; } item->SetSocket(1,0); item->Lock(false); return true; } else if (IsAffectFlag(AFF_BLUE_SOUL)) { RemoveAffect(AFFECT_SOUL); item->SetSocket(1,0); item->Lock(false); return true; } } else // tiklanmamis { if (IsAffectFlag(AFF_BLUE_SOUL)) return true; if (IsAffectFlag(AFF_RED_SOUL)) { RemoveAffect(AFFECT_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_MIX_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1,1); item->Lock(true); return true; } else if (!IsAffectFlag(AFF_MIX_SOUL)) { RemoveAffect(AFFECT_SOUL); AddAffect(AFFECT_SOUL, 0, 0, AFF_BLUE_SOUL, INFINITE_AFFECT_DURATION, 0, false); item->SetSocket(1,1); item->Lock(true); return true; } } } break; } } break; #endif
Kod:
//arat; iDam -= iDam * (ResistAmount / 100.0); } } } } //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM if (!m_pkChr->IsPolymorphed() && !pkChrVictim->IsPC()) iDam *= m_pkChr->GetSoulDamVal(false); #endif
Kod:
//arat; return; } if (true == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex())) //üstüne ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM ch->CheckSoul(); #endif //tekrar arat; else { ch->Show(ch->GetMapIndex(), GetSungziStartX(ch->GetEmpire()), GetSungziStartY(ch->GetEmpire())); } ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP()); ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP()); ch->ReviveInvisible(5); //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM ch->CheckSoul(); #endif //tekrar arat; if (CWarMapManager::instance().GetStartPosition(ch->GetMapIndex(), ch->GetGuild()->GetID() < dwGuildOpponent ? 0 : 1, pos)) ch->Show(ch->GetMapIndex(), pos.x, pos.y); else ch->ExitToSavedLocation(); ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP()); ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP()); ch->ReviveInvisible(5); //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM ch->CheckSoul(); #endif //tekrar arat; case SCMD_RESTART_HERE: sys_log(0, "do_restart: restart here"); ch->RestartAtSamePos(); //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY()); ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP()); ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP()); ch->ReviveInvisible(5); //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM ch->CheckSoul(); #endif //tekrar arat; case SCMD_RESTART_HERE: sys_log(0, "do_restart: restart here"); ch->RestartAtSamePos(); //ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY()); ch->PointChange(POINT_HP, 50 - ch->GetHP()); ch->DeathPenalty(0); ch->ReviveInvisible(5); //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM ch->CheckSoul(); #endif
Kod:
//arat; if (Race < JOB_WARRIOR || Race > JOB_WOLFMAN) return; //altına ekle; if (Cat < ITEM_NONE || Cat > ITEM_SOUL) return;
Kod:
//arat; if (item->IsDragonSoul() && 0 == id) { DSManager::instance().DragonSoulItemInitialize(item); } //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM if (item->GetType() == ITEM_SOUL) { item->SetSocket(2, item->GetValue(2)); } #endif
Kod:
//arat; "ITEM_BELT", //altına ekle; (ITEM_BELT'in altında tür varsa o türün altına ekleyin, yani aynı blok içerisinde fakat bloğun sonunda olsun yapacağınız eklenti.) "ITEM_SOUL", //tekrar arat; string arIAFVSub31[] = { "EXTRACT_DRAGON_SOUL", "EXTRACT_DRAGON_HEART" }; //altına ekle; string arIAFVSub37[] = { "SOUL_RED", "SOUL_BLUE", "0", }; //tekrar arat; string* arIAFVSubType[] = { //fonksiyon içinde bul; 0, //değiştir; (Fonksiyon içinde birden fazla " 0," olacaktır, fonksiyonun sonundakini değiştirin.) arIAFVSub37, //tekrar arat; int arNumberOfSubtype[] = //fonksiyonun içinde bul; 0, //değiştir; (Fonksiyon içinde birden fazla " 0," olacaktır, fonksiyonun sonundakini değiştirin.) sizeof(arIAFVSub37) / sizeof(arIAFVSub37[0]),
Kod:
//arat; AFFECT_RAMADAN_RING, // 41 //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM AFFECT_RED_SOUL, // 42 AFFECT_BLUE_SOUL, // 43 AFFECT_MIX_SOUL, // 44 #endif //arat, NEW_AFFECT_QUEST_START_IDX = 1000, //üstüne ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM AFFECT_SOUL, #endif
Kod:
//müsait bir yere ekle; #define ENABLE_ITEM_SOUL_SYSTEM
Kod:
//arat; #ifdef ENABLE_COSTUME_SYSTEM PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 0); #endif //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM PyModule_AddIntConstant(poModule, "ENABLE_ITEM_SOUL_SYSTEM", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_ITEM_SOUL_SYSTEM", 0); #endif
Kod:
//arat; PyModule_AddIntConstant(poModule, "NEW_AFFECT_DRAGON_SOUL_DECK2", CInstanceBase::NEW_AFFECT_DRAGON_SOUL_DECK2); //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM PyModule_AddIntConstant(poModule, "AFFECT_RED_SOUL", CInstanceBase::AFFECT_RED_SOUL); PyModule_AddIntConstant(poModule, "AFFECT_BLUE_SOUL", CInstanceBase::AFFECT_BLUE_SOUL); PyModule_AddIntConstant(poModule, "AFFECT_MIX_SOUL", CInstanceBase::AFFECT_MIX_SOUL); #endif
Kod:
//arat; PyModule_AddIntConstant(poModule, "ITEM_TYPE_BELT", CItemData::ITEM_TYPE_BELT); //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM PyModule_AddIntConstant(poModule, "ITEM_TYPE_SOUL", CItemData::ITEM_TYPE_SOUL); PyModule_AddIntConstant(poModule, "RED_SOUL", 0); PyModule_AddIntConstant(poModule, "BLUE_SOUL", 1); #endif
Kod:
//arat; DWORD CPythonPlayer::GetItemCount(TItemPos Cell) //üstüne ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM DWORD CPythonPlayer::GetItemAntiFlags(TItemPos Cell) { if (!Cell.IsValidCell()) return 0; const TItemData * pItem = GetItemData(Cell); assert(pItem != nullptr); return pItem->anti_flags; } BYTE CPythonPlayer::GetItemTypeBySlot(TItemPos Cell) { if (!Cell.IsValidCell()) return 0; CItemData * pItemDataPtr = nullptr; if (CItemManager::Instance().GetItemDataPointer(GetItemIndex(Cell), &pItemDataPtr)) return pItemDataPtr->GetType(); else { TraceError("FAILED\t\tCPythonPlayer::GetItemTypeBySlot()\t\tCell(%d, %d) item is nullptr", Cell.window_type, Cell.cell); return 0; } } BYTE CPythonPlayer::GetItemSubTypeBySlot(TItemPos Cell) { if (!Cell.IsValidCell()) return 0; CItemData * pItemDataPtr = nullptr; if (CItemManager::Instance().GetItemDataPointer(GetItemIndex(Cell), &pItemDataPtr)) return pItemDataPtr->GetSubType(); else { TraceError("FAILED\t\tCPythonPlayer::GetItemSubTypeBySlot()\t\tCell(%d, %d) item is nullptr", Cell.window_type, Cell.cell); return 0; } } #endif
Kod:
//arat; DWORD GetItemFlags(TItemPos Cell); //altına ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM DWORD GetItemAntiFlags(TItemPos Cell); BYTE GetItemTypeBySlot(TItemPos Cell); BYTE GetItemSubTypeBySlot(TItemPos Cell); #endif
Kod:
//arat; void initPlayer() //üstüne ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM PyObject * playerIsAntiFlagBySlot(PyObject * poSelf, PyObject * poArgs) { TItemPos Cell; int antiflag; switch (PyTuple_Size(poArgs)) { case 2: if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) return Py_BadArgument(); if (!PyTuple_GetInteger(poArgs, 1, &antiflag)) return Py_BadArgument(); break; case 3: if (!PyTuple_GetInteger(poArgs, 0, &Cell.window_type)) return Py_BadArgument(); if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) return Py_BadArgument(); if (!PyTuple_GetInteger(poArgs, 2, &antiflag)) return Py_BadArgument(); break; default: return Py_BuildException(); } DWORD itemAntiFlags = CPythonPlayer::Instance().GetItemAntiFlags(Cell); return Py_BuildValue("i", IS_SET(itemAntiFlags, antiflag) != 0 ? TRUE : FALSE); } PyObject * playerGetItemTypeBySlot(PyObject * poSelf, PyObject * poArgs) { TItemPos Cell; switch (PyTuple_Size(poArgs)) { case 1: if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) return Py_BadArgument(); break; case 2: if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) return Py_BadArgument(); if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) return Py_BadArgument(); break; default: return Py_BuildException(); } return Py_BuildValue("i", CPythonPlayer::Instance().GetItemTypeBySlot(Cell)); } PyObject * playerGetItemSubTypeBySlot(PyObject * poSelf, PyObject * poArgs) { TItemPos Cell; switch (PyTuple_Size(poArgs)) { case 1: if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) return Py_BadArgument(); break; case 2: if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) return Py_BadArgument(); if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) return Py_BadArgument(); break; default: return Py_BuildException(); } return Py_BuildValue("i", CPythonPlayer::Instance().GetItemSubTypeBySlot(Cell)); } #endif //tekrar arat; { NULL, NULL, NULL }, //üstüne ekle; #ifdef ENABLE_ITEM_SOUL_SYSTEM { "IsAntiFlagBySlot", playerIsAntiFlagBySlot, METH_VARARGS }, { "GetItemTypeBySlot", playerGetItemTypeBySlot, METH_VARARGS }, { "GetItemSubTypeBySlot", playerGetItemSubTypeBySlot, METH_VARARGS }, #endif
Kod:
#arat; chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+37, "", "d:/ymir work/effect/etc/guild_war_flag/flag_yellow.mse") #altına ekle; if app.ENABLE_ITEM_SOUL_SYSTEM: chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+42, "", "d:/ymir work/effect/etc/soul/soul_red_001.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+43, "", "d:/ymir work/effect/etc/soul/soul_blue_001.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+44, "", "d:/ymir work/effect/etc/soul/soul_mix_001.mse")
Kod:
#arat; self.wndItem.RefreshSlot() #üstüne ekle; if app.ENABLE_ITEM_SOUL_SYSTEM: if player.GetItemTypeBySlot(slotNumber) == item.ITEM_TYPE_SOUL: metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)] if slotNumber >= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex: slotNumber -= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex isActivated = 0 != metinSocket[1] if isActivated: self.wndItem.ActivateSlot(i) else: self.wndItem.DeactivateSlot(i)
Kod:
#arat; def AddRefineItemData(self, itemVnum, metinSlot, attrSlot = 0): #fonksiyonun altına ekle; if app.ENABLE_ITEM_SOUL_SYSTEM: def __SoulItemToolTip(self, itemVnum, metinSlot, flags): self.itemVnum = itemVnum item.SelectItem(itemVnum) itemType = item.GetItemType() itemSubType = item.GetItemSubType() (limit_Type, limit_Value) = item.GetLimit(1) max_time = limit_Value if 0 != flags: metinSlot[2] = item.GetValue(2) remain_count = metinSlot[2] value_index = 3 if value_index < 3: value_index = 3 if value_index > 5: value_index = 5 damage_value = float( item.GetValue(value_index) / 10.0 ) self.ClearToolTip() soul_desc = "" if item.RED_SOUL == itemSubType: soul_desc += localeInfo.SOUL_ITEM_TOOLTIP_RED2 % (damage_value) elif item.BLUE_SOUL == itemSubType: soul_desc += localeInfo.SOUL_ITEM_TOOLTIP_BLUE2 % (damage_value) self.__AdjustMaxWidth(0, soul_desc) self.__SetNormalItemTitle() board_width = self.__AdjustDescMaxWidth(soul_desc) desc_color = 0xfff15f5f # RGB(241,95,95) self.AppendDescription( soul_desc, 26, desc_color) self.AppendDescription(localeInfo.SOUL_ITEM_TOOLTIP_COMMON, 26, 0xfff15f5f) self.AppendSpace(10) if metinSlot[1] == 1 and remain_count > 0: self.AppendTextLine( localeInfo.SOUL_ITEM_TOOLTIP_APPLY, 0xff86e57f ) else: self.AppendTextLine( localeInfo.SOUL_ITEM_TOOLTIP_UNAPPLIED, 0xfff15f5f ) self.AppendSpace(5) self.AppendTextLine( localeInfo.SOUL_ITEM_TOOLTIP_REMAIN_COUNT % remain_count ) self.AppendSpace(5) if 0 == flags: for i in xrange(item.LIMIT_MAX_NUM): (limitType, limitValue) = item.GetLimit(i) if item.LIMIT_REAL_TIME == limitType: self.AppendSoulItemLastTime(metinSlot[0]) else: (limitType, limitValue) = item.GetLimit(0) self.AppendSoulItemLastTime(limitValue + app.GetGlobalTimeStamp()) self.ShowToolTip() #tekrar arat; itemDesc = item.GetItemDescription() #üstüne ekle; if app.ENABLE_ITEM_SOUL_SYSTEM: if item.ITEM_TYPE_SOUL == itemType: self.__SoulItemToolTip(itemVnum, metinSlot, flags) return
Kod:
70500 ETC icon/item/70500.tga 70501 ETC icon/item/70501.tga 70502 ETC icon/item/70502.tga 70503 ETC icon/item/70503.tga 70504 ETC icon/item/70504.tga 70505 ETC icon/item/70505.tga 70506 ETC icon/item/70506.tga 70507 ETC icon/item/70507.tga 70508 ETC icon/item/70508.tga 70509 ETC icon/item/70509.tga 70601 ETC icon/item/70601.tga 70602 ETC icon/item/70602.tga 70603 ETC icon/item/70603.tga
Kod:
70500 Rüya Ruhu 70501 Parıldayan Rüya Ruhu 70502 Yanardöner Rüya Ruhu 70503 Prizmatik Rüya Ruhu 70504 Aydınlanmış Rüya Ruhu 70505 Gök Ruhu 70506 Parıldayan Gök Ruhu 70507 Yanardöner Gök Ruhu 70508 Prizmatik Gök Ruhu 70509 Aydınlanmış Gök Ruhu 70601 Mavi Saç Bandı 70602 Ruh Parşömeni 70603 Ruh Parşömeni
Kod:
70500 붉은영혼(일반) ITEM_SOUL SOUL_RED 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 70501 0 0 REAL_TIME 86400 LIMIT_NONE 60 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 1 500 12 12 12 0 0 0 70501 붉은영혼(화려) ITEM_SOUL SOUL_RED 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 70502 0 0 REAL_TIME 86400 LIMIT_NONE 60 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 2 500 15 15 15 0 0 0 70502 붉은영혼(고귀) ITEM_SOUL SOUL_RED 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 70503 0 0 REAL_TIME 172800 LIMIT_NONE 120 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 3 500 15 18 18 0 0 0 70503 붉은영혼(고대) ITEM_SOUL SOUL_RED 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 70504 0 0 REAL_TIME 259200 LIMIT_NONE 180 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 4 500 15 18 25 0 0 0 70504 붉은영혼(전설) ITEM_SOUL SOUL_RED 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 0 0 0 REAL_TIME 604800 LIMIT_NONE 180 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 5 1000 15 18 25 0 0 0 70505 푸른영혼(일반) ITEM_SOUL SOUL_BLUE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 70506 0 0 REAL_TIME 86400 LIMIT_NONE 60 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 1 500 12 12 12 0 0 0 70506 푸른영혼(화려) ITEM_SOUL SOUL_BLUE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 70507 0 0 REAL_TIME 86400 LIMIT_NONE 60 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 2 500 15 15 15 0 0 0 70507 푸른영혼(고귀) ITEM_SOUL SOUL_BLUE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 70508 0 0 REAL_TIME 172800 LIMIT_NONE 120 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 3 500 15 18 18 0 0 0 70508 푸른영혼(고대) ITEM_SOUL SOUL_BLUE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 70509 0 0 REAL_TIME 259200 LIMIT_NONE 180 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 4 500 15 18 25 0 0 0 70509 푸른영혼(전설) ITEM_SOUL SOUL_BLUE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 0 0 0 REAL_TIME 604800 LIMIT_NONE 180 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 5 1000 15 18 25 0 0 0 70601 머리띠 ITEM_QUEST 0 1 ANTI_DROP | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0 70602 진화의 혼 ITEM_USE USE_TUNING 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP NONE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 8 0 0 0 0 0 0 0 0 70603 각성의 혼 ITEM_USE USE_TUNING 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP NONE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 9 0 0 0 0 0 0 0 0
Kod:
70500 Rüya Ruhu 70501 Parıldayan Rüya Ruhu 70502 Yanardöner Rüya Ruhu 70503 Prizmatik Rüya Ruhu 70504 Aydınlanmış Rüya Ruhu 70505 Gök Ruhu 70506 Parıldayan Gök Ruhu 70507 Yanardöner Gök Ruhu 70508 Prizmatik Gök Ruhu 70509 Aydınlanmış Gök Ruhu 70601 Mavi Saç Bandı Ah-Yu'nun Kaybettiği Saç Bandı. 70602 Ruh Parşömeni (%100) Bu parşömenle ruhunu bir basamak ilerleyecek şekilde geliştir. 70603 Ruh Parşömeni Bu parşömenle ruhunu bir basamağa kadar ilerleyecek şekilde geliştir. Deneme başarısız olabilir.
soul pack dosyalarını pack klasörünüze atıp Index'e eklemeyi unutmayın.
refine_proto'dan dönüşümleri ayarlamayı unutmayın.
Kanıt;
Hayırlı kullanımlar.
Rüya Ruhu Sistemi Nedir?
Metin2 özel sunucularında gelişmiş PvP sistemlerine odaklanan geliştiriciler için kritik öneme sahip olan Rüya Ruhu Sistemi, oyuncuların karakter güçlerini artırmada kullanılan etkileyici bir özelliktir. Bu sistem, oyuncuların belirli eşyaları birleştirerek güçlü bonuslar kazanmalarını sağlar. Özellikle C++ tabanlı sistemlerde entegre edilmesiyle birlikte, hem estetik hem de stratejik açıdan dikkat çeker. Rüya Ruhu, oyuncuların karakterlerini daha güçlü hale getirmek için kullandıkları bir yükseltme mekanizmasıdır. Bu sistem genellikle PvP odaklı sunucularda popülerdir ve oyuncuların rekabet gücünü artırmada önemli rol oynar.
Sistem Nasıl Çalışır?
Rüya Ruhu sistemi, oyuncuların elde ettikleri Rüya Taşı ve Ruh eşyalarını bir araya getirerek karakterlerine bonuslar kazandırmalarını sağlar. Bu işlem genellikle bir GUI üzerinden yönetilir. Python tabanlı Py GUI sistemleri, bu süreçte kullanıcı dostu bir arayüz sunarak deneyimi artırır. Oyuncular, belirli sayıda Rüya Taşı ve Ruh birleştirildiğinde karakterlerine ek hasar, savunma veya özel efektler kazandırabilirler. Bu işlemler genellikle Python Script ile kontrol edilir ve sunucu tarafında game core ile entegre çalışır.
C++ Kaynak Kod Entegrasyonu
Metin2 özel sunucularında Rüya Ruhu sistemi, genellikle C++ tabanlı kaynak kodlarla entegre edilir. Geliştiriciler, server src dosyalarına bu sistemi eklemek için source edit işlemleri yapar. Bu süreçte martysama gibi kaynaklar oldukça faydalı olabilir. Rüya Ruhu sisteminin doğru çalışabilmesi için hem auth hem de game sunucularında gerekli düzenlemeler yapılmalıdır. Geliştiriciler, db core üzerinde veritabanı bağlantılarını da eksiksiz yapmalıdır.
Python ve Py Root Kullanımı
Sistemde kullanılan Python scriptleri genellikle py root altında tutulur. Bu scriptler, oyuncuların Rüya Ruhu yükseltmelerini gerçekleştirmesini sağlar. UIScript ile birlikte çalışan bu yapı, kullanıcı arayüzünü etkili şekilde destekler. Py GUI sistemleri sayesinde, oyuncular Rüya Ruhu işlemlerini daha kolay ve anlaşılır bir şekilde yapabilirler. Bu, özellikle yeni başlayan geliştiriciler için öğrenmeyi kolaylaştırır.
Sunucu Paketleme ve Dağıtım
Oluşturulan Rüya Ruhu sistemi, pack olarak derlenip oyunculara sunulabilir. Bu süreçte compile işlemleri önemlidir. Doğru paketleme sayesinde sistem, farklı sunuculara kolayca entegre edilebilir. Bu tür sistemler genellikle PvP odaklı sunucularda tercih edilir ve oyuncuların ilgisini çekecek niteliktedir.
What is Dream Soul System?
The Dream Soul System is a crucial feature for developers focusing on advanced PvP systems in Metin2 private servers. This system allows players to enhance their character power by combining specific items. Integrated with C++ based systems, it attracts attention both aesthetically and strategically. Dream Soul is a power-up mechanism that players use to strengthen their characters. It is especially popular in PvP focused servers and plays a significant role in increasing player competitiveness.
How Does the System Work?
The Dream Soul system allows players to grant bonuses to their characters by combining obtained Dream Stones and Soul items. This process is usually managed through a GUI. Py GUI systems based on Python provide a user-friendly interface that enhances the experience. When players combine a certain number of Dream Stones and Souls, they can grant additional damage, defense, or special effects to their characters. These operations are typically controlled via Python Script and integrated with the game core on the server side.
C++ Source Code Integration
In Metin2 private servers, the Dream Soul system is usually integrated with C++ based source codes. Developers perform source edit operations to add this system into server src files. Resources like martysama can be very helpful during this process. For the system to work correctly, necessary adjustments must be made in both auth and game servers. Developers must also complete database connections properly within the db core.
Using Python and Py Root
Python scripts used in the system are generally stored under py root. These scripts allow players to perform Dream Soul upgrades. Together with UIScript, this structure effectively supports the user interface. Thanks to Py GUI systems, players can execute Dream Soul operations more easily and clearly, which makes learning easier especially for beginner developers.
Server Packaging and Distribution
The created Dream Soul system can be compiled as a pack and distributed to players. Compilation processes are important during this phase. Proper packaging enables the system to be easily integrated into different servers. Such systems are commonly preferred in PvP-focused servers and have the quality to attract player interest.
