[C++ / PY] Mainline'ın bazı hard-coded hesaplarını düzeltin

Kaptan Yosun

Co-Co Admin
Moderatör
Geliştirici
Yardımsever Üye
Usta Üye
Mesaj
1.505
Çözümler
55
Beğeni
2.612
Puan
1.839
Ticaret Puanı
0
Hiç ellemezseniz doğru çalışsan, ancak oyuna yeni bir eşya tipi veya envanter sayfası veya yeni bir efsun tipi eklemeye çalışırsanız sizi yarı yolda bırakacak olan bazı kodları dinamik yapalım.

Client\ClientSource\UserInterface\GameType.h:
Genişlet Daralt Kopyala
Aratın:
const DWORD c_Name_Max_Length = 64;
const DWORD c_FileName_Max_Length = 128;
const DWORD c_Short_Name_Max_Length = 32;

const DWORD c_Inventory_Page_Size = 5 * 9; // x*y
const DWORD c_Inventory_Page_Count = 2;
const DWORD c_ItemSlot_Count = c_Inventory_Page_Size * c_Inventory_Page_Count;
const DWORD c_Equipment_Count = 12;

const DWORD c_Equipment_Start = c_ItemSlot_Count;

const DWORD c_Equipment_Body    = c_Equipment_Start + 0;
const DWORD c_Equipment_Head    = c_Equipment_Start + 1;
const DWORD c_Equipment_Shoes    = c_Equipment_Start + 2;
const DWORD c_Equipment_Wrist    = c_Equipment_Start + 3;
const DWORD c_Equipment_Weapon    = c_Equipment_Start + 4;
const DWORD c_Equipment_Neck    = c_Equipment_Start + 5;
const DWORD c_Equipment_Ear        = c_Equipment_Start + 6;
const DWORD c_Equipment_Unique1    = c_Equipment_Start + 7;
const DWORD c_Equipment_Unique2    = c_Equipment_Start + 8;
const DWORD c_Equipment_Arrow    = c_Equipment_Start + 9;
const DWORD c_Equipment_Shield    = c_Equipment_Start + 10;
Client\ClientSource\UserInterface\GameType.h:
Genişlet Daralt Kopyala
Değiştirin:
constexpr DWORD c_Name_Max_Length = 64;
constexpr DWORD c_FileName_Max_Length = 128;
constexpr DWORD c_Short_Name_Max_Length = 32;

constexpr DWORD c_Inventory_Page_Column = 5;
constexpr DWORD c_Inventory_Page_Row = 9;
constexpr DWORD c_Inventory_Page_Size = c_Inventory_Page_Column*c_Inventory_Page_Row; // x*y
constexpr DWORD c_Inventory_Page_Count = 2;
constexpr DWORD c_ItemSlot_Count = c_Inventory_Page_Size * c_Inventory_Page_Count;
constexpr DWORD c_Equipment_Count = 12;

constexpr DWORD c_Equipment_Start = c_ItemSlot_Count;

constexpr DWORD c_Equipment_Body    = c_Equipment_Start + CItemData::WEAR_BODY;
constexpr DWORD c_Equipment_Head    = c_Equipment_Start + CItemData::WEAR_HEAD;
constexpr DWORD c_Equipment_Shoes    = c_Equipment_Start + CItemData::WEAR_FOOTS;
constexpr DWORD c_Equipment_Wrist    = c_Equipment_Start + CItemData::WEAR_WRIST;
constexpr DWORD c_Equipment_Weapon    = c_Equipment_Start + CItemData::WEAR_WEAPON;
constexpr DWORD c_Equipment_Neck    = c_Equipment_Start + CItemData::WEAR_NECK;
constexpr DWORD c_Equipment_Ear        = c_Equipment_Start + CItemData::WEAR_EAR;
constexpr DWORD c_Equipment_Unique1    = c_Equipment_Start + CItemData::WEAR_UNIQUE1;
constexpr DWORD c_Equipment_Unique2    = c_Equipment_Start + CItemData::WEAR_UNIQUE2;
constexpr DWORD c_Equipment_Arrow    = c_Equipment_Start + CItemData::WEAR_ARROW;
constexpr DWORD c_Equipment_Shield    = c_Equipment_Start + CItemData::WEAR_SHIELD;
Client\ClientSource\UserInterface\GameType.h:
Genişlet Daralt Kopyala
Aratın:
    const DWORD c_New_Equipment_Start = c_Equipment_Start + 21;
    const DWORD c_New_Equipment_Count = 3;
    const DWORD c_Equipment_Ring1 = c_New_Equipment_Start + 0;
    const DWORD c_Equipment_Ring2 = c_New_Equipment_Start + 1;
    const DWORD c_Equipment_Belt  = c_New_Equipment_Start + 2;;

Değiştirin:
    constexpr DWORD c_New_Equipment_Start = c_Equipment_Start + CItemData::WEAR_RING1;
    constexpr DWORD c_New_Equipment_Count = 3;
    constexpr DWORD c_Equipment_Ring1 = c_Equipment_Start + CItemData::WEAR_RING1;
    constexpr DWORD c_Equipment_Ring2 = c_Equipment_Start + CItemData::WEAR_RING2;
    constexpr DWORD c_Equipment_Belt  = c_Equipment_Start + CItemData::WEAR_BELT;
Client\ClientSource\UserInterface\GameType.h:
Genişlet Daralt Kopyala
Arayın:
    const DWORD c_Costume_Slot_Start    = c_Equipment_Start +
    19;    // [����] ����(19) �ϵ��ڵ� ����. ���� �������� �ڽ��� ������ 19������. ���� common/length.h ������ EWearPositions ������ ����.
    const DWORD    c_Costume_Slot_Body        = c_Costume_Slot_Start + 0;
    const DWORD    c_Costume_Slot_Hair        = c_Costume_Slot_Start + 1;
    const DWORD c_Costume_Slot_Count    = 2;
    const DWORD c_Costume_Slot_End        = c_Costume_Slot_Start + c_Costume_Slot_Count;

Değiştirin:
    constexpr DWORD c_Costume_Slot_Start    = c_Equipment_Start + CItemData::WEAR_COSTUME_BODY;    // [����] ����(19) �ϵ��ڵ� ����. ���� �������� �ڽ��� ������ 19������. ���� common/length.h ������ EWearPositions ������ ����.
    constexpr DWORD    c_Costume_Slot_Body        = c_Costume_Slot_Start + CItemData::COSTUME_BODY;
    constexpr DWORD    c_Costume_Slot_Hair        = c_Costume_Slot_Start + CItemData::COSTUME_HAIR;
    constexpr DWORD c_Costume_Slot_Count    = CItemData::COSTUME_NUM_TYPES;
    constexpr DWORD c_Costume_Slot_End        = c_Costume_Slot_Start + c_Costume_Slot_Count;

Client\ClientSource\UserInterface\GameType.h:
Genişlet Daralt Kopyala
Arayın:
const DWORD c_Wear_Max = 32;

Değiştirin:
const DWORD c_Wear_Max = CItemData::WEAR_MAX_NUM;

Client\ClientSource\UserInterface\GameType.h:
Genişlet Daralt Kopyala
Arayın:
    ITEM_ATTRIBUTE_SLOT_MAX_NUM = 7,

Değiştirin:
    // refactored attribute slot begin
    ITEM_ATTRIBUTE_SLOT_NORM_NUM = 5,
    ITEM_ATTRIBUTE_SLOT_RARE_NUM = 2,

    ITEM_ATTRIBUTE_SLOT_NORM_START = 0,
    ITEM_ATTRIBUTE_SLOT_NORM_END = ITEM_ATTRIBUTE_SLOT_NORM_START + ITEM_ATTRIBUTE_SLOT_NORM_NUM,

    ITEM_ATTRIBUTE_SLOT_RARE_START = ITEM_ATTRIBUTE_SLOT_NORM_END,
    ITEM_ATTRIBUTE_SLOT_RARE_END = ITEM_ATTRIBUTE_SLOT_RARE_START + ITEM_ATTRIBUTE_SLOT_RARE_NUM,

    ITEM_ATTRIBUTE_SLOT_MAX_NUM = ITEM_ATTRIBUTE_SLOT_RARE_END, // 7
    // refactored attribute slot end

Client\ClientSource\GameLib\ItemData.h:
Genişlet Daralt Kopyala
Arayın:
            WEAR_MAX_NUM,

Değiştirin:
            WEAR_MAX_NUM = 32,

Client\ClientSource\UserInterface\PythonPlayerModule.cpp:
Genişlet Daralt Kopyala
Arayın:
    PyModule_AddIntConstant (poModule, "ATTRIBUTE_SLOT_MAX_NUM",                    ITEM_ATTRIBUTE_SLOT_MAX_NUM);

Değiştirin:
    // refactored attribute slot begin
    PyModule_AddIntConstant(poModule, "ATTRIBUTE_SLOT_NORM_NUM", ITEM_ATTRIBUTE_SLOT_NORM_NUM);
    PyModule_AddIntConstant(poModule, "ATTRIBUTE_SLOT_RARE_NUM", ITEM_ATTRIBUTE_SLOT_RARE_NUM);
    PyModule_AddIntConstant(poModule, "ATTRIBUTE_SLOT_NORM_START", ITEM_ATTRIBUTE_SLOT_NORM_START);
    PyModule_AddIntConstant(poModule, "ATTRIBUTE_SLOT_NORM_END", ITEM_ATTRIBUTE_SLOT_NORM_END);
    PyModule_AddIntConstant(poModule, "ATTRIBUTE_SLOT_RARE_START", ITEM_ATTRIBUTE_SLOT_RARE_START);
    PyModule_AddIntConstant(poModule, "ATTRIBUTE_SLOT_RARE_END", ITEM_ATTRIBUTE_SLOT_RARE_END);
    PyModule_AddIntConstant(poModule, "ATTRIBUTE_SLOT_MAX_NUM", ITEM_ATTRIBUTE_SLOT_MAX_NUM);
    // refactored attribute slot end

pack\root\uitooltip.py:
Genişlet Daralt Kopyala
Arayın:
    SPECIAL_POSITIVE_COLOR2 = grp.GenerateColor(0.8824, 0.9804, 0.8824, 1.0)

Altına ekleyin:
    SPECIAL_POSITIVE_COLOR5 = grp.GenerateColor(0.7824, 0.9004, 0.8024, 1.0) #bonus 5

pack\root\uitooltip.py:
Genişlet Daralt Kopyala
def __GetAttributeColor içinde arayın:
            if index >= 5:

Değiştirin:
            if index >= player.ATTRIBUTE_SLOT_RARE_START and index < player.ATTRIBUTE_SLOT_RARE_END:

Arayın:
                return self.SPECIAL_POSITIVE_COLOR

Değiştirin:
                if index == player.ATTRIBUTE_SLOT_NORM_END:
                    return self.SPECIAL_POSITIVE_COLOR5
                else:
                    return self.SPECIAL_POSITIVE_COLOR

 
Son düzenleme:
1749797790668.webp
 
Not:
İtemdata içindeki
C++:
Genişlet Daralt Kopyala
enum EWearPositions
'u server/length.h içindeki aynı enumla eşlemeyi unutmayın. Mainline'nin clientindeki enum eksik.

5. Efsunun renginin değişmesi için bu değişikliği de yapın, yoksa çalışmaz.

Diff:
Genişlet Daralt Kopyala
diff --git a/Client/Binary/pack/root/uitooltip.py b/Client/Binary/pack/root/uitooltip.py
index b6f8957b..1d64ec54 100644
--- a/Client/Binary/pack/root/uitooltip.py
+++ b/Client/Binary/pack/root/uitooltip.py
@@ -721,7 +721,7 @@ class ItemToolTip(ToolTip):
             if index >= player.ATTRIBUTE_SLOT_RARE_START and index < player.ATTRIBUTE_SLOT_RARE_END:
                 return self.SPECIAL_POSITIVE_COLOR2
             else:
-                if index == player.ATTRIBUTE_SLOT_NORM_END:
+                if index == player.ATTRIBUTE_SLOT_NORM_END - 1:
                     return self.SPECIAL_POSITIVE_COLOR5
                 else:
                     return self.SPECIAL_POSITIVE_COLOR
 
En son bir moderatör tarafından düzenlenmiş:
Bu tarz constexpr iyileştirmeleri için ufak bir not;

C++'da global scopedaki variablelar implicitly olarak external linkage'dir(const istisna, const variablelar internal linkage olur ve constexpr implicitly const'dur).

Bir header dosyasında static işaretlediğiniz veya sadece constexpr olarak nitelediğiniz her variable için(static data member olmamak şartı ile), her TU kendi kopyasını oluşturur(yani halk dilinde hangi cpp'de include ediyorsanız, derleme sırasında alakalı variable'ın bir kopyası oluşturulur), bunu görmek istiyorsanız bir .hpp dosyasına absürt sayıda boyutlu bir array tanımlayın sonrasında sırasıyla constexpr ve inline constexpr işaretleyin, sonrasında bir kaç cpp dosyasına include edin ve include ettiğiniz dosyaların assembly phase'de oluşturulan obj dosyaslarının boyutlarını kontrol edin.

Bir header dosyasında tanımlanan (tercihen namespace kullanılmalı, global scope kullanmak iyi bir fikir değil) variableları inline işaretlemenizi öneririm, bu şekilde her TU kendi kopyasını oluşturmak yerine ortak variable kullanılır, ek olarak da ODR violation yaşama ihtimaliniz engellenmiş olur.

C++:
Genişlet Daralt Kopyala
constexpr int temp_value{1}; // internal linkage
static constexpr int temp_value{1}; //internal linkage
inline constexpr int temp_value{1}; // external linkage

Bahsettiğim obj boyut testi:
C++:
Genişlet Daralt Kopyala
// test.hpp
/*inline*/ constexpr int64_t vals[1'000'000]{};

// t1.cpp
#include "test.hpp"

// t2.cpp
#include "test.hpp"

// main.cpp
#include "test.hpp"

int main()
{
    return EXIT_SUCCESS;
}
 
Geri
Üst