Çözülemedi Kodlamayla alakalı bir sorun

Ne yazık ki bu konuda sorulara çözüm bulunmuyor. Eğer konuda yorumlar varsa hepsini inceleyebilirsiniz. Belki sizlerin sorununuzu çözmek için için ipuçları bulabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

TheAdmin33

Ah bu şarkıların gözü kör olsun
Premium Üye
Geliştirici
Yardımsever Üye
Usta Üye
Editör
Mesaj
783
Çözümler
45
Beğeni
1.459
Puan
1.139
Ticaret Puanı
0
şu şekil bir fonksiyon oluşturdum ;
char.cpp:
DWORD CHARACTER::GetAcceBonusInfo(BYTE Acce_Level)
{
    DWORD ACCE_ABS_MAX = 0;
    switch (Acce_Level)
    {
        case 1:
            {
                ACCE_ABS_MAX = ACCE_GRADE_4_ABS_MAX_1;
            }
            break;
        case 2:
            {
                ACCE_ABS_MAX = ACCE_GRADE_4_ABS_MAX_2;
            }
            break;
        case 3:
            {
                ACCE_ABS_MAX = ACCE_GRADE_4_ABS_MAX_3;
            }
            break;
        case 4:
            {
                ACCE_ABS_MAX = ACCE_GRADE_4_ABS_MAX_4;
            }
            break;
        case 5:
            {
                ACCE_ABS_MAX = ACCE_GRADE_4_ABS_MAX_5;
            }
            break;
        case 6:
            {
                ACCE_ABS_MAX = ACCE_GRADE_4_ABS_MAX_6;
            }
            break;
        case 7:
            {
                ACCE_ABS_MAX = ACCE_GRADE_4_ABS_MAX_7;
            }
            break;
        default:
            {
                ACCE_ABS_MAX = ACCE_GRADE_4_ABS_MAX;
            }
            break;
    }
    
    return ACCE_ABS_MAX;
}

ve şu sorguyu yaptırıyorum;
char.cpp:
    else if ((m_bAcceCombination) && ((pkItem->GetSocket(ACCE_ABSORPTION_SOCKET)) >= (GetAcceBonusInfo(pkItem->GetSocket(ACCE_BOOSTER_SOCKET)))))
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Bu kanat zaten maksimum emiş oranına sahip."));
        return;
    }

kuşağın "pkItem->GetSocket(ACCE_BOOSTER_SOCKET) = 1" yani "GetAcceBonusInfo(pkItem->GetSocket(ACCE_BOOSTER_SOCKET))"=ACCE_GRADE_4_ABS_MAX_1" oluyor ve item_lenght de ACCE_GRADE_4_ABS_MAX_1 == 40 olarak tanımlı

ben 36 emiş olan kuşağı kombinlemeye yani emiş oranını arttırmaya çalıştığım da if sorguyunun içine giriyor ama 36 >= 40 olmasına rağmen nasıl if sorgunun içine giriyor bir türlü anlamadım

if sorgusunun içine girmemesi gerekiyor tam olarak nerde hata yapıyorum?
 
Çözüm
dediğini yaptım ilk seferde düzgün çalışıyor ondan sonra hep default 'a atıyor. Ama neden?
O zaman sorunun sebebini tam olarak anlamak için değişken ataması yaparak deneyebilirsin.
Örneğin:
C++:
BYTE absorptionSocket = pkItem->GetSocket(ACCE_ABSORPTION_SOCKET);
BYTE boosterSocket = pkItem->GetSocket(ACCE_BOOSTER_SOCKET);
DWORD acceBonusInfo = GetAcceBonusInfo(boosterSocket);

if (m_bAcceCombination && (absorptionSocket >= acceBonusInfo))
{
     // degerleri loga yazdir..
     sys_log(0, "absorptionSocket : %d -- boosterSocket : %d -- acceBonusInfo : %d", absorptionSocket,boosterSocket,acceBonusInfo);
     ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Bu kanat zaten maksimum emiş oranına sahip."));
     return;
}

Buradan çıkan sonuçlara...
case bloklarının çalıştığına emin misin? Belki de switch döngüsüne hiç girmeyip direkt return ACCE_ABS_MAX; döndürüyordur. Yani 0.
Eğer böyle bir durum söz konusuysa if sorgusuna girmesi normal. Çünkü sorgu şöyle oluyor:
(m_bAcceCombination true ise ve 36 >= 0)

Test etmek için her case bloğuna sys_log ile log düşürmeyi deneyebilirsin.
 
case bloklarının çalıştığına emin misin? Belki de switch döngüsüne hiç girmeyip direkt return ACCE_ABS_MAX; döndürüyordur. Yani 0.
Eğer böyle bir durum söz konusuysa if sorgusuna girmesi normal. Çünkü sorgu şöyle oluyor:
(m_bAcceCombination true ise ve 36 >= 0)

Test etmek için her case bloğuna sys_log ile log düşürmeyi deneyebilirsin.
ACCE_GRADE_4_ABS_MAX == 30 olarak tanımlı

30 level olan bir kuşağın levelini arttırdığımda konudaki kod ile yeni sınır ACCE_GRADE_4_ABS_MAX == 40 oluyor .

ilk kombinlemede kuşağın kombinlenmesi gerçekleşiyor mesela 30 sa 34 vs. oluyor ama daha sonrasında konuda bahsettiğim durum yaşanıyor .

ilk seferde oluyor sonrasında olmuyor case lerde sıkıntı varsa ilk seferinde de gerçekleşmemesi gerekmiyormu?
 
case bloklarının çalıştığına emin misin? Belki de switch döngüsüne hiç girmeyip direkt return ACCE_ABS_MAX; döndürüyordur. Yani 0.
Eğer böyle bir durum söz konusuysa if sorgusuna girmesi normal. Çünkü sorgu şöyle oluyor:
(m_bAcceCombination true ise ve 36 >= 0)

Test etmek için her case bloğuna sys_log ile log düşürmeyi deneyebilirsin.
dediğini yaptım ilk seferde düzgün çalışıyor ondan sonra hep default 'a atıyor. Ama neden?
 
dediğini yaptım ilk seferde düzgün çalışıyor ondan sonra hep default 'a atıyor. Ama neden?
O zaman sorunun sebebini tam olarak anlamak için değişken ataması yaparak deneyebilirsin.
Örneğin:
C++:
BYTE absorptionSocket = pkItem->GetSocket(ACCE_ABSORPTION_SOCKET);
BYTE boosterSocket = pkItem->GetSocket(ACCE_BOOSTER_SOCKET);
DWORD acceBonusInfo = GetAcceBonusInfo(boosterSocket);

if (m_bAcceCombination && (absorptionSocket >= acceBonusInfo))
{
     // degerleri loga yazdir..
     sys_log(0, "absorptionSocket : %d -- boosterSocket : %d -- acceBonusInfo : %d", absorptionSocket,boosterSocket,acceBonusInfo);
     ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Bu kanat zaten maksimum emiş oranına sahip."));
     return;
}

Buradan çıkan sonuçlara göre incelemen gereken kısım daha net olabilir.
 
Çözüm
O zaman sorunun sebebini tam olarak anlamak için değişken ataması yaparak deneyebilirsin.
Örneğin:
C++:
BYTE absorptionSocket = pkItem->GetSocket(ACCE_ABSORPTION_SOCKET);
BYTE boosterSocket = pkItem->GetSocket(ACCE_BOOSTER_SOCKET);
DWORD acceBonusInfo = GetAcceBonusInfo(boosterSocket);

if (m_bAcceCombination && (absorptionSocket >= acceBonusInfo))
{
     // degerleri loga yazdir..
     sys_log(0, "absorptionSocket : %d -- boosterSocket : %d -- acceBonusInfo : %d", absorptionSocket,boosterSocket,acceBonusInfo);
     ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Bu kanat zaten maksimum emiş oranına sahip."));
     return;
}

Buradan çıkan sonuçlara göre incelemen gereken kısım daha net olabilir.
ben socket 2 ye göre kuşak leveli belirliyorum. 30 emiş olan kuşağa yeni olşturduğum itemi sürükleyince socket 2 = 1 oluyor.

şimdi durum şöyle ki bu itemi kullandıktan sonra ilk kombin işlemini gerçekleştirene kadar sorun yok ilk kombinleme işlemini gerçekleştirince socket 2 değeri tekrardan 0 oluyor bu yüzdende default 'a atıyor.

kuşak sisteminde socket sayıları için değişkenler tanımlı ACCE_ABSORPTION_SOCKET ve ACCE_ABSORBED_SOCKET diye ama bunlar 0 ve 1 değerini alıyor socket2 için bir değişken yok bende bu yüzden socket2 yi kullandım.

benim bu socket 2 yi neden sıfırlıyor onu bulmam lazım.

Yada farklı bir yol izleyip kuşakların emişini kombinlemeyle değil yeni oluşturduğum bir itemle arttıracam .
 
Son düzenleme:
Bu kodun öncesinde yapılan düzenlemeleri detaylı olarak bilmediğimden daha fazla yardımcı olamam. Kuşak sistemini de pek sevmediğimden dolayı bugüne kadar hiç kullanmadım ve kodlarını incelemedim.
Ancak dediğin gibi asıl sorun kombinleme iteminde olabilir. Detaylı incelemek gerekiyor.
 
ben bu sevdadan vazgeçtim kombinlemeyle değil yeni oluşturduğum bir itemle emiş oranını arttıracam yok işin için çıkılacak gibi değil. oynadığım fileslarda da itemle emiş oranı artıyordu demekki varmış bir bildikleri.
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst