- Mesaj
- 12.032
- Çözümler
- 569
- Beğeni
- 14.198
- Puan
- 5.915
- Ticaret Puanı
- 2
Merhaba arkadaşlar,
Bugün size sorunları fixlenmiş bir şekilde 4 envanter sistemi eklemeyi anlatacağım.
Biliyorsunuz ki ben server files üzerinde çalışıyorum bu hususta forumlarda paylaşılan sistemlerin çoğunda bug bulunuyor. Bende bu bugları fixleyerek 4 envanter sistemi ekledim. Size nasıl ekleneceğini anlatacağım. İsterseniz 5 envanter yapın isterseniz 10 envanter yapın fark etmez.
Not: İşlemleri yapmadan önce yedek almanızı öneririm. Bu sistemde bilinen sorunlar çözülmüştür. Bilinmeyen bir sorun oluştuğu zaman konu altından belirtirseniz seve seve düzenlerim.
Sırasıyla şu işlemleri uygulayınız;
Server/common/lenght.h açılır ve aratılır;
Şu kodlarla değiştirin;
Server/game/src/exchange.cpp açılır ve CheckSpace fonksiyonun içinde şu kod aratılır;
Şu kodlarla değiştirin;
Aynı dosya ve fonksiyonun içinde şu kodları aratın;
Altına şunları ekleyin;
Eğer 5 envanter yapacaksanız şu değeri de eklemelisiniz;
Gene aynı dosya ve fonksiyonun içinde şu kodları aratın;
Biz 2 den fazla envanter kullanacağımız için bunu tamamen şu şekilde değiştiriyoruz;
5. Envanteri eklemek için for döngülerine şunu da ekleyin;
Bu kodları eklememizin sebebi ticaret yaptığımız zaman diğer envanterleri de görmesidir. Aksi taktirde diğer envanterler boş olsa bile envanter dolu hatası verir.
Server/game/src/char_item.cpp dosyasını açın ve IsEmptyItemGrid fonksiyonu içinde şu kodu aratın;
Not: Aynı fonksiyonda 2 tane oluyor. 2 sinide göstereceğim şekilde düzenleyin.
Bu kodu şu şekilde değiştirin;
Aynı dosya ve fonksiyon içinde şu kodu aratın;
Not: Aynı fonksiyonda 2 tane oluyor. 2 sinide göstereceğim şekilde düzenleyin.
Bu kodu şu şekilde değiştirin;
Evet arkadaşlar server kısmı bitti şimdi client kısmına geliyoruz.
Client/UserInterface/GameType.h açılır ve aratılır;
Kodları bunla değiştirin;
Not: 5 envanter kullanmak isterseniz 4 kısmını 5 yapın.
Evet arkaaşlar client kısmı da bu kadar. Sıra geldi Python'a.
İlk önce UIScript üzerinden gidelim.
Not: Bazı fileslerde inventorywindow.py dosyası locale_tr/ui içinden alınıyor. Bu yüzden UIScript mi yoksa locale_tr mi diye kontrol edin.
Not2: Python kodları 4 envanter içindir. Forumlarda 5 olanını bulabilirsiniz.
UIScript/InventoryWindow.py dosyası açılır ve şu kod aratılır;
Şu şekilde değiştirin;
Aynı dosyada şu kodları aratın;
Şu kodlarla hepsini değiştirin;
UIScript/BeltInventoryWindow.py dosyasını açın ve şu kodu aratın;
Şu şekilde değiştirin;
Evet arkadaşlar UIScript kısmı bitti şimdi sıra geldi Root dosyalarına.
Root/uiInventory.py dosyasını açın ve şu kodları aratın;
Altına şunları ekleyin;
Aynı dosyada şu kodları aratın;
Altına şunları ekleyin;
Aynı dosyada şu kodları aratın;
Altına şunları ekleyin;
Aynı dosyada SetInventoryPage fonksiyonun içindeki şu kodları aratın;
Şu şekilde değiştirin;
Bu kod sayesinde diğer sayfalara geçerken butonlar takılı kalmayacak.
Aynı dosyada RefreshBagSlotWindow fonksiyonunun içinde şu kodları aratın;
Şu şekilde değiştirin;
Bu kod sayesinde 3 ve 4 envanterde yer alan otomatik potlar çalışacak, efsun botları da efsunu görecektir.
Evet arkadaşlar Root kısmıda bitti. Şimdi locale_xx (locale_tr) üzerinde ayarlamalar yapacağız.
Not: locale_xx => locale_tr, xx => tr
locale_tr/tr/locale_interface.txt dosyası açın ve şunları aratın;
Altına şunları ekleyin;
Bu kodları eklemezseniz oyuna giremezsiniz ve syserr şöyle bir hata verir;
Evet arkadaşlar sistem bu şekildedir. Anlayabilmeniz için hazır kod vermiyorum. Lakin eski fileslerde tab_button_large_half_01.sub şu dosya yok. Bu yüzden ekten verdiğim dosyayı indirip ETC içine atın.
Not: Ekteki dosyanın içinde de anlatım mevcuttur. Konuda kodları eklerken tab ayarlarını filan düzgün yaptım. Gene de emin olmak için ekteki dosyanın anlatımını da kullanabilirsiniz.
Kanıt eklemek zorunlu olduğu için buyurun kanıt;
Bugün size sorunları fixlenmiş bir şekilde 4 envanter sistemi eklemeyi anlatacağım.
Biliyorsunuz ki ben server files üzerinde çalışıyorum bu hususta forumlarda paylaşılan sistemlerin çoğunda bug bulunuyor. Bende bu bugları fixleyerek 4 envanter sistemi ekledim. Size nasıl ekleneceğini anlatacağım. İsterseniz 5 envanter yapın isterseniz 10 envanter yapın fark etmez.
Not: İşlemleri yapmadan önce yedek almanızı öneririm. Bu sistemde bilinen sorunlar çözülmüştür. Bilinmeyen bir sorun oluştuğu zaman konu altından belirtirseniz seve seve düzenlerim.
Sırasıyla şu işlemleri uygulayınız;
Server/common/lenght.h açılır ve aratılır;
C++:
INVENTORY_MAX_NUM = 90,
Şu kodlarla değiştirin;
C++:
INVENTORY_MAX_NUM = 180,
INVENTORY_PAGE_COUNT = INVENTORY_MAX_NUM / 45,
INVENTORY_PAGE_SLOT_COUNT = INVENTORY_MAX_NUM / INVENTORY_PAGE_COUNT,
Server/game/src/exchange.cpp açılır ve CheckSpace fonksiyonun içinde şu kod aratılır;
C++:
static CGrid s_grid1(5, INVENTORY_MAX_NUM/5 / 2); // inven page 1
static CGrid s_grid2(5, INVENTORY_MAX_NUM/5 / 2); // inven page 2
Şu kodlarla değiştirin;
C++:
static CGrid s_grid1(5, INVENTORY_MAX_NUM/5 / INVENTORY_PAGE_COUNT); // inven page 1
static CGrid s_grid2(5, INVENTORY_MAX_NUM/5 / INVENTORY_PAGE_COUNT); // inven page 2
static CGrid s_grid3(5, INVENTORY_MAX_NUM/5 / INVENTORY_PAGE_COUNT); // inven page 3
static CGrid s_grid4(5, INVENTORY_MAX_NUM/5 / INVENTORY_PAGE_COUNT); // inven page 4
Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.
Aynı dosya ve fonksiyonun içinde şu kodları aratın;
C++:
s_grid1.Clear();
s_grid2.Clear();
Altına şunları ekleyin;
C++:
s_grid3.Clear();
s_grid4.Clear();
Eğer 5 envanter yapacaksanız şu değeri de eklemelisiniz;
C++:
s_grid5.Clear();
Gene aynı dosya ve fonksiyonun içinde şu kodları aratın;
C++:
for (i = 0; i < INVENTORY_MAX_NUM / 2; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid1.Put(i, 1, item->GetSize());
}
for (i = INVENTORY_MAX_NUM / 2; i < INVENTORY_MAX_NUM; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid2.Put(i - INVENTORY_MAX_NUM / 2, 1, item->GetSize());
}
Biz 2 den fazla envanter kullanacağımız için bunu tamamen şu şekilde değiştiriyoruz;
C++:
for (i = 0; i < INVENTORY_PAGE_SLOT_COUNT; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid1.Put(i, 1, item->GetSize());
}
for (i = INVENTORY_PAGE_SLOT_COUNT; i < INVENTORY_PAGE_SLOT_COUNT * 2; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid2.Put(i - INVENTORY_PAGE_SLOT_COUNT, 1, item->GetSize());
}
for (i = INVENTORY_PAGE_SLOT_COUNT * 2; i < INVENTORY_PAGE_SLOT_COUNT * 3; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid3.Put(i - INVENTORY_PAGE_SLOT_COUNT * 2, 1, item->GetSize());
}
for (i = INVENTORY_PAGE_SLOT_COUNT * 3; i < INVENTORY_PAGE_SLOT_COUNT * 4; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid4.Put(i - INVENTORY_PAGE_SLOT_COUNT * 3, 1, item->GetSize());
}
5. Envanteri eklemek için for döngülerine şunu da ekleyin;
C++:
for (i = INVENTORY_PAGE_SLOT_COUNT * 4; i < INVENTORY_PAGE_SLOT_COUNT * 5; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid5.Put(i - INVENTORY_PAGE_SLOT_COUNT * 4, 1, item->GetSize());
}
Bu kodları eklememizin sebebi ticaret yaptığımız zaman diğer envanterleri de görmesidir. Aksi taktirde diğer envanterler boş olsa bile envanter dolu hatası verir.
Merhaba, konu sorunsuz çalışmakta ama exchange.cpp kısmında düzenlenmesi gereke bir kod bölümü daha var eğer düzenlenmez ise ticarette 3 ve 4 envanteri görmüyor mainline src'de farklı hazır srclerde farklı mainline kullananlar için kodu aşağıya bırakıyorum @Whistle Konuya eklerseniz sevinirim.
if (iPos >= 0) kodunu aratın ve değiştirin
son oluşacak görüntü ;
10536 eklentisini görüntüle
C++:if (iPos >= 0) { s_grid2.Put(iPos, 1, item->GetSize()); } else { //3. envanter item alma bug fix iPos = s_grid3.FindBlank(1, item->GetSize()); if (iPos >= 0) { s_grid3.Put(iPos, 1, item->GetSize()); } else { //4. envanter item alma bug fix iPos = s_grid4.FindBlank(1, item->GetSize()); if (iPos >= 0){ s_grid4.Put(iPos, 1, item->GetSize()); } else{ return false;//bul } } } } }
Server/game/src/char_item.cpp dosyasını açın ve IsEmptyItemGrid fonksiyonu içinde şu kodu aratın;
Not: Aynı fonksiyonda 2 tane oluyor. 2 sinide göstereceğim şekilde düzenleyin.
Kod:
BYTE bPage = bCell / (INVENTORY_MAX_NUM / 2);
Bu kodu şu şekilde değiştirin;
Kod:
BYTE bPage = bCell / (INVENTORY_MAX_NUM / INVENTORY_PAGE_COUNT);
Aynı dosya ve fonksiyon içinde şu kodu aratın;
Not: Aynı fonksiyonda 2 tane oluyor. 2 sinide göstereceğim şekilde düzenleyin.
C++:
if (p / (INVENTORY_MAX_NUM / 2) != bPage)
Bu kodu şu şekilde değiştirin;
C++:
if (p / (INVENTORY_MAX_NUM / INVENTORY_PAGE_COUNT) != bPage)
Evet arkadaşlar server kısmı bitti şimdi client kısmına geliyoruz.
Client/UserInterface/GameType.h açılır ve aratılır;
C++:
const DWORD c_Inventory_Page_Count = 2;
Kodları bunla değiştirin;
C++:
const DWORD c_Inventory_Page_Count = 4;
Evet arkaaşlar client kısmı da bu kadar. Sıra geldi Python'a.
İlk önce UIScript üzerinden gidelim.
Not: Bazı fileslerde inventorywindow.py dosyası locale_tr/ui içinden alınıyor. Bu yüzden UIScript mi yoksa locale_tr mi diye kontrol edin.
Not2: Python kodları 4 envanter içindir. Forumlarda 5 olanını bulabilirsiniz.
UIScript/InventoryWindow.py dosyası açılır ve şu kod aratılır;
Python:
EQUIPMENT_START_INDEX = 90
Şu şekilde değiştirin;
Python:
EQUIPMENT_START_INDEX = 180
Aynı dosyada şu kodları aratın;
Python:
{
"name" : "Inventory_Tab_01",
"type" : "radio_button",
"x" : 10,
"y" : 33 + 191,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub",
"tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_1,
"children" :
(
{
"name" : "Inventory_Tab_01_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "I",
},
),
},
{
"name" : "Inventory_Tab_02",
"type" : "radio_button",
"x" : 10 + 78,
"y" : 33 + 191,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub",
"tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_2,
"children" :
(
{
"name" : "Inventory_Tab_02_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "II",
},
),
},
Şu kodlarla hepsini değiştirin;
Python:
{
"name" : "Inventory_Tab_01",
"type" : "radio_button",
"x" : 10,
"y" : 33 + 191,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_03.sub",
"tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_1,
"children" :
(
{
"name" : "Inventory_Tab_01_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "I",
},
),
},
{
"name" : "Inventory_Tab_02",
"type" : "radio_button",
#"x" : 10 + 78,
"x" : 10 + 39,
"y" : 33 + 191,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_03.sub",
"tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_2,
"children" :
(
{
"name" : "Inventory_Tab_02_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "II",
},
),
},
{
"name" : "Inventory_Tab_03",
"type" : "radio_button",
"x" : 10 + 39 + 39,
"y" : 33 + 191,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_03.sub",
"tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_3,
"children" :
(
{
"name" : "Inventory_Tab_03_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "III",
},
),
},
{
"name" : "Inventory_Tab_04",
"type" : "radio_button",
"x" : 10 + 39 + 39 + 39,
"y" : 33 + 191,
"default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub",
"over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub",
"down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_03.sub",
"tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_4,
"children" :
(
{
"name" : "Inventory_Tab_04_Print",
"type" : "text",
"x" : 0,
"y" : 0,
"all_align" : "center",
"text" : "IV",
},
),
},
UIScript/BeltInventoryWindow.py dosyasını açın ve şu kodu aratın;
Python:
EQUIPMENT_START_INDEX = 90
Şu şekilde değiştirin;
Python:
EQUIPMENT_START_INDEX = 180
Evet arkadaşlar UIScript kısmı bitti şimdi sıra geldi Root dosyalarına.
Root/uiInventory.py dosyasını açın ve şu kodları aratın;
Python:
self.inventoryTab = []
self.inventoryTab.append(self.GetChild("Inventory_Tab_01"))
self.inventoryTab.append(self.GetChild("Inventory_Tab_02"))
Altına şunları ekleyin;
Python:
self.inventoryTab.append(self.GetChild("Inventory_Tab_03"))
self.inventoryTab.append(self.GetChild("Inventory_Tab_04"))
Aynı dosyada şu kodları aratın;
Python:
self.inventoryTab[0].SetEvent(lambda arg=0: self.SetInventoryPage(arg))
self.inventoryTab[1].SetEvent(lambda arg=1: self.SetInventoryPage(arg))
Altına şunları ekleyin;
Python:
self.inventoryTab[2].SetEvent(lambda arg=2: self.SetInventoryPage(arg))
self.inventoryTab[3].SetEvent(lambda arg=3: self.SetInventoryPage(arg))
Aynı dosyada şu kodları aratın;
Python:
self.inventoryTab[0].Down()
Altına şunları ekleyin;
Python:
self.inventoryPageIndex = 0
Aynı dosyada SetInventoryPage fonksiyonun içindeki şu kodları aratın;
Python:
self.inventoryPageIndex = page
self.inventoryTab[1-page].SetUp()
self.RefreshBagSlotWindow()
Şu şekilde değiştirin;
Python:
self.inventoryTab[self.inventoryPageIndex].SetUp()
self.inventoryPageIndex = page
self.inventoryTab[self.inventoryPageIndex].Down()
self.RefreshBagSlotWindow()
Aynı dosyada RefreshBagSlotWindow fonksiyonunun içinde şu kodları aratın;
Python:
if slotNumber >= player.INVENTORY_PAGE_SIZE:
slotNumber -= player.INVENTORY_PAGE_SIZE
Şu şekilde değiştirin;
Python:
if slotNumber >= player.INVENTORY_PAGE_SIZE * self.inventoryPageIndex:
slotNumber -= player.INVENTORY_PAGE_SIZE * self.inventoryPageIndex
Evet arkadaşlar Root kısmıda bitti. Şimdi locale_xx (locale_tr) üzerinde ayarlamalar yapacağız.
Not: locale_xx => locale_tr, xx => tr
locale_tr/tr/locale_interface.txt dosyası açın ve şunları aratın;
Kod:
INVENTORY_PAGE_BUTTON_TOOLTIP_1 1. Envanter
INVENTORY_PAGE_BUTTON_TOOLTIP_2 2. Envanter
Altına şunları ekleyin;
Kod:
INVENTORY_PAGE_BUTTON_TOOLTIP_3 3. Envanter
INVENTORY_PAGE_BUTTON_TOOLTIP_4 4. Envanter
Kod:
<type 'exceptions.AttributeError'>:'module' object has no attribute 'INVENTORY_PAGE_BUTTON_TOOLTIP_3'
Evet arkadaşlar sistem bu şekildedir. Anlayabilmeniz için hazır kod vermiyorum. Lakin eski fileslerde tab_button_large_half_01.sub şu dosya yok. Bu yüzden ekten verdiğim dosyayı indirip ETC içine atın.
Not: Ekteki dosyanın içinde de anlatım mevcuttur. Konuda kodları eklerken tab ayarlarını filan düzgün yaptım. Gene de emin olmak için ekteki dosyanın anlatımını da kullanabilirsiniz.
Kanıt eklemek zorunlu olduğu için buyurun kanıt;
Dosya Eklentileri
Son düzenleme: