Onaylı Envanter Sistemi #ZacqooLeaven

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 33

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Bu konu daha önce açılan konuyla farklıdır, bunda görüntüleme yapılırken "onaylama" istemektedir.
Eğer oyun seçeneklerine aç kapat engellemek istiyorsanız;

blackdragon61 arkadaşımızın konusundan faydalanın bazı şeyleri ondan alıntıladım bilgilerinize.

Resimler kanıtlar (sayfayı kaplamaması için link olarak koydum)




Gamesrc/packet.h açılır aratılır:
Kod:
typedef struct pakcet_view_equip


Değiştirilir
komple
Kod:
typedef struct pakcet_view_equip    {    BYTE    header;    DWORD    vid;    struct {        DWORD    vnum;        BYTE    count;        long    alSockets[ITEM_SOCKET_MAX_NUM];        TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];    } equips[16]; } TPacketViewEquip;

Char.cpp aratılır:
Kod:
void CHARACTER::SendEquipment(LPCHARACTER ch)


Değiştirilir
komple
Kod:
void CHARACTER::SendEquipment(LPCHARACTER ch)        {     TPacketViewEquip p;     p.header = HEADER_GC_VIEW_EQUIP;     p.vid    = GetVID();     int pos[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 20, 21, 22, 23 };     for (int i = 0; i < 16; i++)     {         LPITEM item = GetWear(pos[i]);         if (item)         {             p.equips[i].vnum = item->GetVnum();             p.equips[i].count = item->GetCount();             thecore_memcpy(p.equips[i].alSockets, item->GetSockets(), sizeof(p.equips[i].alSockets));             thecore_memcpy(p.equips[i].aAttr, item->GetAttributes(), sizeof(p.equips[i].aAttr));         }         else         {             p.equips[i].vnum = 0;         }     }     ch->GetDesc()->Packet(&p, sizeof(p)); }

Clientsrc/Userınterface/packet.h aratılır:
Kod:
typedef struct pakcet_view_equip


Değiştirilir komple
Kod:
typedef struct pakcet_view_equip {    BYTE    header;    DWORD    dwVID;    TEquipmentItemSet equips[16]; } TPacketGCViewEquip;

UserInterfacePythonNetworkStreamPhaseGame.cpp aratılır:
Kod:
bool CPythonNetworkStream::RecvViewEquipPacket()


Değiştirilir komple
Kod:
bool CPythonNetworkStream::RecvViewEquipPacket() {     TPacketGCViewEquip kViewEquipPacket;     if (!Recv(sizeof(kViewEquipPacket), &kViewEquipPacket))         return false;     PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenEquipmentDialog", Py_BuildValue("(i)", kViewEquipPacket.dwVID));     for (int i = 0; i < 16; ++i)     {         TEquipmentItemSet & rItemSet = kViewEquipPacket.equips[i];         PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogItem", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, rItemSet.vnum, rItemSet.count));         for (int j = 0; j < ITEM_SOCKET_SLOT_MAX_NUM; ++j)             PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogSocket", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, j, rItemSet.alSockets[j]));         for (int k = 0; k < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++k)             PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogAttr", Py_BuildValue("(iiiii)", kViewEquipPacket.dwVID, i, k, rItemSet.aAttr[k].bType, rItemSet.aAttr[k].sValue));     }     return true; }

Pack & python aşamasına geçiyoruz :



root> constinfo.py açılır ve müsait yere eklenir
Kod:
ENVANTER_TARGET_VID = 0 CLIENT_YOL = "lib/"

uitarget.py açılır ve aratılır
Kod:
locale.TARGET_BUTTON_EMOTION_ALLOW, "VOTE_BLOCK_CHAT",

altına eklenir
Kod:
"Profil",

aratılır
Kod:
self.buttonDict[locale.TARGET_BUTTON_EXIT_OBSERVER].SAFE_SetEvent(self.__OnExitObserver)

altına eklenir
Kod:
self.buttonDict["Profil"].SAFE_SetEvent(self.__OnProfilGoster)

aratılır
Kod:
def __ShowMainCharacterMenu(self):

kod bloğunun altına eklenir
Kod:
def __OnProfilGoster(self):                if not (self.zaman < app.GetTime()):             chat.AppendChat(chat.CHAT_TYPE_INFO, localegame.OYUN_ENVANTER_SURE)             return         self.zaman = app.GetTime() + 10         net.SendWhisperPacket(chr.GetNameByVID(self.vid), '#zacqooleavenEnvanter_Teklifi#Sorgu#')         constInfo.ENVANTER_TARGET_VID = self.vid

aratılır
Kod:
self.showingButtonList.append(self.buttonDict[locale.TARGET_BUTTON_FIGHT])

altına eklenir
Kod:
if(self.zaman < app.GetTime()):             self.showingButtonList.append(self.buttonDict["Profil"])

aratılır

Kod:
if distance < 0:                 return
altına eklenir
Kod:
if(self.zaman < app.GetTime()):                                self.zaman = 0                 self.__ShowButton("Profil")                 self.RefreshButton()             else:                 self.__HideButton("Profil")                 self.RefreshButton()

game.py açılır ve aratılır
Kod:
chat.AppendWhisper(mode, name, line)         self.interface.RecvWhisper(name)

üstüne eklenir
Kod:
if line.find("#zacqooleavenEnvanter_Teklifi#") != -1:                         if os.path.exists(str(constInfo.CLIENT_YOL)+"profil_"+str(player.GetName())+".kf"):                 return             if line.find("#Sorgu#") != -1:                 self.EnvanterDialog = uiCommon.QuestionDialog()                 self.EnvanterDialog.SetText(locale.OYUN_ENVANTER % (str(name)))                 self.EnvanterDialog.SetAcceptEvent(lambda arg=TRUE: self.OnEnvanterDialog(name, 1))                 self.EnvanterDialog.SetCancelEvent(lambda arg=FALSE: self.OnEnvanterDialog(name, 0))                 self.EnvanterDialog.Open()             else:                 if line.find("Red") != -1:                     self.uyari = uiCommon.PopupDialog()                     self.uyari.SetText(locale.ENVANTER_RED)                     self.uyari.Open()                     return                 chat.AppendChat(chat.CHAT_TYPE_INFO, locale.OYUN_ENVANTER_CHAT % (name))                 net.SendChatPacket("/view_equip " + str(constInfo.ENVANTER_TARGET_VID))             return

aratılır
Kod:
def OnRecvWhisperError(self, mode, name, line):

kod bloğunun altına eklenir
Kod:
def OnEnvanterDialog(self, ad, flag):                if flag == 0:             self.EnvanterDialog.Close()             return         self.EnvanterDialog.Close()         net.SendWhisperPacket(ad, "#zacqooleavenEnvanter_Teklifi#Cevap#")

locale_tr>locale_game.txt açılır ve an alta eklenir
Kod:
OYUN_ENVANTER    %s Envanterini görmek istiyor? OYUN_ENVANTER_SURE    Tekrar sorgu göndermek için 10 saniye beklemen gerekli. OYUN_ENVANTER_CHAT    Şuanda %s adlı oyuncunun profilini görmektesin.


İndirilecek dosyalar ;
Virüstotal ;

verdiğim indirme dosyasında uiscript , root içerisine ve packa atılacak dosyalar var bunları atın.



Onaylı Envanter Sistemi #ZacqooLeaven

Metin2 özel sunucularında kullanıcı deneyimini artırmak ve sistematik hataları en aza indirmek adına geliştirilen Onaylı Envanter Sistemi #ZacqooLeaven, son derece güçlü ve esnek bir yapıya sahiptir. Bu sistem sayesinde oyuncuların envanterlerinde meydana gelen veri tutarsızlıklarını engellemek, aynı zamanda güvenlik seviyesini artırmak mümkün hale gelmektedir.

Envanter sistemleri, Metin2 özel sunucularında en kritik yapı taşlarından biridir. Oyuncu karakterleri, eşyalar, petler ve diğer nesnelerle etkileşim kurarken doğru ve hızlı bir şekilde veri işlemek zorundadır. #ZacqooLeaven sistemi bu işlemleri doğrulama tabanlı bir yapıyla yöneterek, sunucu tarafında oluşabilecek olası veri kayıplarını veya manipülasyonları engeller.

Sistem Özellikleri

Bu envanter sistemi, C++ tabanlı sunucu tarafında çalışan bir doğrulama modülüne sahiptir. Her eşya işlemi sırasında, sunucu tarafından istemciye gönderilen veriler kontrol edilir ve uyuşmazlık durumunda otomatik olarak iptal edilir. Bu sayede hile kullanımı da büyük ölçüde azaltılır. Aynı zamanda Python GUI destekli yönetim paneli sayesinde, sistem yöneticileri gerçek zamanlı olarak envanter verilerini takip edebilir ve gerekirse müdahale edebilirler.

Neden Onaylı Sistem Kullanmalısınız?

Geleneksel envanter sistemlerinde, oyuncular bazen veri kaybı yaşayabilir veya yanlışlıkla eşyaları silinebilir. Onaylı Envanter Sistemi sayesinde tüm işlemler loglanır ve geri döndürülebilir. Bu sayede, sunucu sahipleri hem daha güvenli bir ortam sağlayabilir hem de oyuncu memnuniyetini artırabilirler.

Ayrıca bu sistem, Metin2 geliştirme ortamlarında kolay entegrasyon sunar. Martysama veya diğer popüler kaynak kodlarla uyumlu çalışması sayesinde, geliştiricilerin sisteme adapte olması çok daha kolaydır. PyRoot, UIScript ve diğer alt yapılarla sorunsuz bir şekilde entegre olabilir.

Kurulum ve Entegrasyon

Kurulum aşamasında, geliştiricilerin öncelikle Game Server üzerinde gerekli C++ değişikliklerini yapması gerekir. Auth ve DB Core yapıları ile uyumlu çalışacak şekilde tasarlanmıştır. Kurulum tamamlandıktan sonra, her envanter işlemi doğrulanır ve veritabanına yazılır. Bu sayede hem veri bütünlüğü sağlanır hem de sunucu güvenliği artırılır.

ZacqooLeaven sistemi, Metin2 özel sunucularında güvenilirlik ve performans odaklı bir çözüm arayan geliştiriciler için idealdir. Oyun içi ekonomiye katkı sağlarken, aynı zamanda sunucu yönetimini de kolaylaştırır.


Verified Inventory System #ZacqooLeaven

The Verified Inventory System #ZacqooLeaven has been developed to enhance the user experience on Metin2 private servers and minimize systematic errors. This system features a highly powerful and flexible structure that prevents data inconsistencies in players' inventories and increases security levels.

Inventory systems are among the most critical components in Metin2 private servers. Player characters must process data accurately and quickly while interacting with items, pets, and other objects. The #ZacqooLeaven system manages these processes through a validation-based structure, preventing potential data losses or manipulations on the server side.

System Features

This inventory system includes a validation module operating on the C++ based server-side. During each item transaction, the data sent from the server to the client is checked, and any mismatches are automatically canceled. This significantly reduces cheating attempts. Additionally, with its Python GUI-supported management panel, system administrators can monitor inventory data in real-time and intervene when necessary.

Why Should You Use a Verified System?

In traditional inventory systems, players may occasionally experience data loss or unintended deletion of items. With the Verified Inventory System, all transactions are logged and reversible. This allows server owners to provide a more secure environment while also increasing player satisfaction.

Moreover, this system offers easy integration within Metin2 development environments. Thanks to its compatibility with popular source codes like Martysama, developers can adapt to the system more easily. It integrates seamlessly with PyRoot, UIScript, and other infrastructure components.

Installation and Integration[/BR][/BR]During installation, developers need to make the necessary C++ modifications on the Game Server. Designed to work compatibly with Auth and DB Core structures, once the installation is completed, every inventory operation is verified and written into the database. This ensures both data integrity and increased server security.

ZacqooLeaven system is ideal for developers seeking reliable and performance-oriented solutions in Metin2 private servers. While contributing to the in-game economy, it also simplifies server management.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt