Çözüldü Python Refreshstatus

  • Konuyu açan Konuyu açan Legandalith
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 11
  • Gösterim Gösterim 162
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

Legandalith

MT Üye
MT Üye
Mesaj
168
Çözümler
5
Beğeni
185
Puan
769
Ticaret Puanı
0
Konu başlığını nasıl açacağımı bilemedim açıkcası, python tarafında şöyle bir problemim var, mesela getstatus ile çektiğim bilgileri yang kısmına yani yang yerine yazdığımda değişikliği anlayıp sıkıntısız bir şekilde sürekli otomatik güncelliyor. Fakat deneme olarak beltinventoryine ayrı bir board açıp oraya yazdım, orası için herhangi bir kendi triggerimi yaratmayı bilmiyorum, show'a koyduğumda inventorye bağlı olduğu için kapatıp açtığımda yeniliyor. Yang tarafında değişikliği otomatik algılaması için ne kullanılıyor anlayamadım. Ve bir problemimde her ne kadar getstatus ile çeksemde o tetikleyiciyi kullanmadan değerlerin 0 olarak kalıyor olması. Yani karakter attığımda gene her şey 0'lanıyor ve bir değişim yaşanması gerekiyor. Bunları yapmayı nasıl sağlayabilirim?

 
Çözüm
Maalesef hala aynı sorun var:


Sanırım kaynak kodlarında verilerin aktarımıyla ilgili bir eksiklik veya yanlışlık var. Çünkü halihazırda bulunan player.GetStatus(player.DEF_GRADE) gibi verileri rastgele bir gui içine yazdırmayı denediğimde sorunsuz bir şekilde yazdırdı. Hatta verdiğim kodda ufak bir düzenleme yaparak vermiş olduğum DEF_GRADE özelliğini çektirip yazdırmayı dene. Ve zırh vb. değiştirip yazının güncellenip güncellenmediğine bak. Eğer çalışırsa sorun büyük ihtimalle kaynak tarafındadır.
interfacemodulede wndinventory refreshstatuse eklidir ama wndbeltinventory(kafadan salladım böyle değildir belki) ekli değildir belki ondan yapıyordur
 
Yang olayı dinamik bir şekilde çalıştığı için anlık olarak algılıyor. Python > Client src > Server > DB şeklinde birbiriyle bağlantılı ve paketler/pointler aracılığı ile sürekli güncellenen bir veri.
Daha iyi anlaman için olabildiğince açıklayayım:

C++:
Genişlet Daralt Kopyala
    def RefreshStatus(self):
        money = player.GetElk()
        if constInfo.NEW_YANG_TEXT:
            self.wndMoney.SetText(localeInfo.NumberToMoneyStringNew(money))
        else:
            self.wndMoney.SetText(localeInfo.NumberToMoneyString(money))

RefreshStatus fonksiyonu her 5 saniyede bir kendini günceller. Bunu client src ve server src sayesinde yapar.
player.GetElk() ile oyuncunun sahip olduğu yang çekiliyor ve envanterdeki text alanına yazdırıyor.

RefreshStatus fonksiyonu, karakter hiçbir şey yapmadan dursa bile her 5 saniyede bir update çeker. Ancak oyun içinde oyuncu başka bir etkileşimde bulunursa (bir şey satın alma, ticaret ile para aktarma vb.) Bahsettiğim 5 saniye beklenmeden anında yenilenir. Çünkü bu etkileşimler de kendi içinde bir tetikleyicidir ve işlem sonunda update çekilir. Mesela örnek veriyorum, ticaret ile birine para gönderdiğinde client src de şu kısım tekiklenir ve servere gönderilir:

C++:
Genişlet Daralt Kopyala
bool CPythonNetworkStream::SendExchangeElkAddPacket(long long elk)
{
    if (!__CanActMainInstance())
        return true;

    TPacketCGExchange    packet;

    packet.header        = HEADER_CG_EXCHANGE;
    packet.subheader    = EXCHANGE_SUBHEADER_CG_ELK_ADD;
    packet.arg1            = elk;

    if (!Send(sizeof(packet), &packet))
    {
        Tracef("send_trade_elk_add_packet Error\n");
        return false;
    }

    return true;
}

Daha sonra ise input_main.cpp içindeki şu kısımda işleme alınır:
C++:
Genişlet Daralt Kopyala
void CInputMain::Exchange(LPCHARACTER ch, const char * data)
{
    struct command_exchange * pinfo = (struct command_exchange *) data;
    LPCHARACTER    to_ch = NULL;

    if (!ch->CanHandleItem())
        return;

    int iPulse = thecore_pulse();

    if ((to_ch = CHARACTER_MANAGER::instance().Find(pinfo->arg1)))
    {
        if (iPulse - to_ch->GetSafeboxLoadTime() < PASSES_PER_SEC(g_nPortalLimitTime))
        {
            to_ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°Å·¡ ÈÄ %dÃÊ À̳»¿¡ â°í¸¦ ¿¼ö ¾ø½À´Ï´Ù."), g_nPortalLimitTime);
            return;
        }

        if( true == to_ch->IsDead() )
        {
            return;
        }
    }

    sys_log(0, "CInputMain()::Exchange()  SubHeader %d ", pinfo->sub_header);

    if (iPulse - ch->GetSafeboxLoadTime() < PASSES_PER_SEC(g_nPortalLimitTime))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°Å·¡ ÈÄ %dÃÊ À̳»¿¡ â°í¸¦ ¿¼ö ¾ø½À´Ï´Ù."), g_nPortalLimitTime);
        return;
    }

    switch (pinfo->sub_header)
    {
        case EXCHANGE_SUBHEADER_CG_START:    // arg1 == vid of target character
            if (!ch->GetExchange())
            {
                if ((to_ch = CHARACTER_MANAGER::instance().Find(pinfo->arg1)))
                {
                    //MONARCH_LIMIT

                    if (iPulse - ch->GetSafeboxLoadTime() < PASSES_PER_SEC(g_nPortalLimitTime))
                    {
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("â°í¸¦ ¿¬ÈÄ %dÃÊ À̳»¿¡´Â °Å·¡¸¦ ÇÒ¼ö ¾ø½À´Ï´Ù."), g_nPortalLimitTime);

                        if (test_server)
                            ch->ChatPacket(CHAT_TYPE_INFO, "[TestOnly][Safebox]Pulse %d LoadTime %d PASS %d", iPulse, ch->GetSafeboxLoadTime(), PASSES_PER_SEC(g_nPortalLimitTime));
                        return;
                    }

                    if (iPulse - to_ch->GetSafeboxLoadTime() < PASSES_PER_SEC(g_nPortalLimitTime))
                    {
                        to_ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("â°í¸¦ ¿¬ÈÄ %dÃÊ À̳»¿¡´Â °Å·¡¸¦ ÇÒ¼ö ¾ø½À´Ï´Ù."), g_nPortalLimitTime);

                        if (test_server)
                            to_ch->ChatPacket(CHAT_TYPE_INFO, "[TestOnly][Safebox]Pulse %d LoadTime %d PASS %d", iPulse, to_ch->GetSafeboxLoadTime(), PASSES_PER_SEC(g_nPortalLimitTime));
                        return;
                    }

                    if (ch->GetGold() >= GOLD_MAX)
                    {
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾×¼ö°¡ 20¾ï ³ÉÀ» ÃÊ°úÇÏ¿© °Å·¡¸¦ ÇÒ¼ö°¡ ¾ø½À´Ï´Ù.."));

                        sys_err("[OVERFLOG_GOLD] START (%u) id %u name %s ", ch->GetGold(), ch->GetPlayerID(), ch->GetName());
                        return;
                    }

                    if (to_ch->IsPC())
                    {
                        if (quest::CQuestManager::instance().GiveItemToPC(ch->GetPlayerID(), to_ch))
                        {
                            sys_log(0, "Exchange canceled by quest %s %s", ch->GetName(), to_ch->GetName());
                            return;
                        }
                    }

                    if (ch->GetMyShop() || ch->IsOpenSafebox() || ch->GetShopOwner() || ch->IsCubeOpen())
                    {
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ °Å·¡ÁßÀÏ°æ¿ì °³ÀλóÁ¡À» ¿¼ö°¡ ¾ø½À´Ï´Ù."));
                        return;
                    }

                    ch->ExchangeStart(to_ch);
                }
            }
            break;

        case EXCHANGE_SUBHEADER_CG_ITEM_ADD:    // arg1 == position of item, arg2 == position in exchange window
            if (ch->GetExchange())
            {
                if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true)
                    ch->GetExchange()->AddItem(pinfo->Pos, pinfo->arg2);
            }
            break;

        case EXCHANGE_SUBHEADER_CG_ITEM_DEL:    // arg1 == position of item
            if (ch->GetExchange())
            {
                if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true)
                    ch->GetExchange()->RemoveItem(pinfo->arg1);
            }
            break;

        case EXCHANGE_SUBHEADER_CG_ELK_ADD:    // arg1 == amount of gold
            if (ch->GetExchange())
            {
                const int64_t nTotalGold = static_cast<int64_t>(ch->GetExchange()->GetCompany()->GetOwner()->GetGold()) + static_cast<int64_t>(pinfo->arg1);

                if (GOLD_MAX <= nTotalGold)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ Ãѱݾ×ÀÌ 20¾ï ³ÉÀ» ÃÊ°úÇÏ¿© °Å·¡¸¦ ÇÒ¼ö°¡ ¾ø½À´Ï´Ù.."));

                    sys_err("[OVERFLOW_GOLD] ELK_ADD (%u) id %u name %s ",
                            ch->GetExchange()->GetCompany()->GetOwner()->GetGold(),
                            ch->GetExchange()->GetCompany()->GetOwner()->GetPlayerID(),
                               ch->GetExchange()->GetCompany()->GetOwner()->GetName());

                    return;
                }

                if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true)
                    ch->GetExchange()->AddGold(pinfo->arg1);
            }
            break;

        case EXCHANGE_SUBHEADER_CG_ACCEPT:
            if (ch->GetExchange())
            {
                sys_log(0, "CInputMain()::Exchange() ==> ACCEPT ");
                ch->GetExchange()->Accept(true);
            }

            break;

        case EXCHANGE_SUBHEADER_CG_CANCEL:    // arg1 == not used
            if (ch->GetExchange())
                ch->GetExchange()->Cancel();
            break;
    }
}

Bu fonksiyonda gördüğün gibi ch-> ile yapılan birçok işlem ve kontrol var. Şartlara ve işleme bağlı olarak karakter verisini güncelliyor ve sonucunda ise envanterde anlık olarak yeniliyor.

Sorununa gelecek olursak; eğer senin çekmek istediğin bilgiler senin harici olarak eklediğin bilgiler ise, onları bu tür halihazırda bulunan sürekli kendini güncelleyen paketler aracılığı ile akıcı bir hale getirmen gerekir. Eğer zaten metin2'de bulunan verileri çekmeye çalışıyorsan, bu bahsettiğim olayı sadece python tarafında yapman gerekir. Envanter ve öğeleri oyunun bel kemiği olduğu için bir çok yerde bağlantıları var ve sürekli aktif çalışıyor. Ancak diğer guiler çoğu zaman yarı statiktir. Bu yüzden bu tür pencerelerde (OnUpdate) gibi fonksiyonlardan yardım alarak çekmek istediğin verileri sürekli olarak güncelleyebilirsin.
 
interfacemodulede wndinventory refreshstatuse eklidir ama wndbeltinventory(kafadan salladım böyle değildir belki) ekli değildir belki ondan yapıyordur
Yang olayı dinamik bir şekilde çalıştığı için anlık olarak algılıyor. Python > Client src > Server > DB şeklinde birbiriyle bağlantılı ve paketler/pointler aracılığı ile sürekli güncellenen bir veri.
Daha iyi anlaman için olabildiğince açıklayayım:

C++:
Genişlet Daralt Kopyala
    def RefreshStatus(self):
        money = player.GetElk()
        if constInfo.NEW_YANG_TEXT:
            self.wndMoney.SetText(localeInfo.NumberToMoneyStringNew(money))
        else:
            self.wndMoney.SetText(localeInfo.NumberToMoneyString(money))

RefreshStatus fonksiyonu her 5 saniyede bir kendini günceller. Bunu client src ve server src sayesinde yapar.
player.GetElk() ile oyuncunun sahip olduğu yang çekiliyor ve envanterdeki text alanına yazdırıyor.

RefreshStatus fonksiyonu, karakter hiçbir şey yapmadan dursa bile her 5 saniyede bir update çeker. Ancak oyun içinde oyuncu başka bir etkileşimde bulunursa (bir şey satın alma, ticaret ile para aktarma vb.) Bahsettiğim 5 saniye beklenmeden anında yenilenir. Çünkü bu etkileşimler de kendi içinde bir tetikleyicidir ve işlem sonunda update çekilir. Mesela örnek veriyorum, ticaret ile birine para gönderdiğinde client src de şu kısım tekiklenir ve servere gönderilir:

C++:
Genişlet Daralt Kopyala
bool CPythonNetworkStream::SendExchangeElkAddPacket(long long elk)
{
    if (!__CanActMainInstance())
        return true;

    TPacketCGExchange    packet;

    packet.header        = HEADER_CG_EXCHANGE;
    packet.subheader    = EXCHANGE_SUBHEADER_CG_ELK_ADD;
    packet.arg1            = elk;

    if (!Send(sizeof(packet), &packet))
    {
        Tracef("send_trade_elk_add_packet Error\n");
        return false;
    }

    return true;
}

Daha sonra ise input_main.cpp içindeki şu kısımda işleme alınır:
C++:
Genişlet Daralt Kopyala
void CInputMain::Exchange(LPCHARACTER ch, const char * data)
{
    struct command_exchange * pinfo = (struct command_exchange *) data;
    LPCHARACTER    to_ch = NULL;

    if (!ch->CanHandleItem())
        return;

    int iPulse = thecore_pulse();

    if ((to_ch = CHARACTER_MANAGER::instance().Find(pinfo->arg1)))
    {
        if (iPulse - to_ch->GetSafeboxLoadTime() < PASSES_PER_SEC(g_nPortalLimitTime))
        {
            to_ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°Å·¡ ÈÄ %dÃÊ À̳»¿¡ â°í¸¦ ¿¼ö ¾ø½À´Ï´Ù."), g_nPortalLimitTime);
            return;
        }

        if( true == to_ch->IsDead() )
        {
            return;
        }
    }

    sys_log(0, "CInputMain()::Exchange()  SubHeader %d ", pinfo->sub_header);

    if (iPulse - ch->GetSafeboxLoadTime() < PASSES_PER_SEC(g_nPortalLimitTime))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°Å·¡ ÈÄ %dÃÊ À̳»¿¡ â°í¸¦ ¿¼ö ¾ø½À´Ï´Ù."), g_nPortalLimitTime);
        return;
    }

    switch (pinfo->sub_header)
    {
        case EXCHANGE_SUBHEADER_CG_START:    // arg1 == vid of target character
            if (!ch->GetExchange())
            {
                if ((to_ch = CHARACTER_MANAGER::instance().Find(pinfo->arg1)))
                {
                    //MONARCH_LIMIT

                    if (iPulse - ch->GetSafeboxLoadTime() < PASSES_PER_SEC(g_nPortalLimitTime))
                    {
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("â°í¸¦ ¿¬ÈÄ %dÃÊ À̳»¿¡´Â °Å·¡¸¦ ÇÒ¼ö ¾ø½À´Ï´Ù."), g_nPortalLimitTime);

                        if (test_server)
                            ch->ChatPacket(CHAT_TYPE_INFO, "[TestOnly][Safebox]Pulse %d LoadTime %d PASS %d", iPulse, ch->GetSafeboxLoadTime(), PASSES_PER_SEC(g_nPortalLimitTime));
                        return;
                    }

                    if (iPulse - to_ch->GetSafeboxLoadTime() < PASSES_PER_SEC(g_nPortalLimitTime))
                    {
                        to_ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("â°í¸¦ ¿¬ÈÄ %dÃÊ À̳»¿¡´Â °Å·¡¸¦ ÇÒ¼ö ¾ø½À´Ï´Ù."), g_nPortalLimitTime);

                        if (test_server)
                            to_ch->ChatPacket(CHAT_TYPE_INFO, "[TestOnly][Safebox]Pulse %d LoadTime %d PASS %d", iPulse, to_ch->GetSafeboxLoadTime(), PASSES_PER_SEC(g_nPortalLimitTime));
                        return;
                    }

                    if (ch->GetGold() >= GOLD_MAX)
                    {
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾×¼ö°¡ 20¾ï ³ÉÀ» ÃÊ°úÇÏ¿© °Å·¡¸¦ ÇÒ¼ö°¡ ¾ø½À´Ï´Ù.."));

                        sys_err("[OVERFLOG_GOLD] START (%u) id %u name %s ", ch->GetGold(), ch->GetPlayerID(), ch->GetName());
                        return;
                    }

                    if (to_ch->IsPC())
                    {
                        if (quest::CQuestManager::instance().GiveItemToPC(ch->GetPlayerID(), to_ch))
                        {
                            sys_log(0, "Exchange canceled by quest %s %s", ch->GetName(), to_ch->GetName());
                            return;
                        }
                    }

                    if (ch->GetMyShop() || ch->IsOpenSafebox() || ch->GetShopOwner() || ch->IsCubeOpen())
                    {
                        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ °Å·¡ÁßÀÏ°æ¿ì °³ÀλóÁ¡À» ¿¼ö°¡ ¾ø½À´Ï´Ù."));
                        return;
                    }

                    ch->ExchangeStart(to_ch);
                }
            }
            break;

        case EXCHANGE_SUBHEADER_CG_ITEM_ADD:    // arg1 == position of item, arg2 == position in exchange window
            if (ch->GetExchange())
            {
                if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true)
                    ch->GetExchange()->AddItem(pinfo->Pos, pinfo->arg2);
            }
            break;

        case EXCHANGE_SUBHEADER_CG_ITEM_DEL:    // arg1 == position of item
            if (ch->GetExchange())
            {
                if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true)
                    ch->GetExchange()->RemoveItem(pinfo->arg1);
            }
            break;

        case EXCHANGE_SUBHEADER_CG_ELK_ADD:    // arg1 == amount of gold
            if (ch->GetExchange())
            {
                const int64_t nTotalGold = static_cast<int64_t>(ch->GetExchange()->GetCompany()->GetOwner()->GetGold()) + static_cast<int64_t>(pinfo->arg1);

                if (GOLD_MAX <= nTotalGold)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ Ãѱݾ×ÀÌ 20¾ï ³ÉÀ» ÃÊ°úÇÏ¿© °Å·¡¸¦ ÇÒ¼ö°¡ ¾ø½À´Ï´Ù.."));

                    sys_err("[OVERFLOW_GOLD] ELK_ADD (%u) id %u name %s ",
                            ch->GetExchange()->GetCompany()->GetOwner()->GetGold(),
                            ch->GetExchange()->GetCompany()->GetOwner()->GetPlayerID(),
                               ch->GetExchange()->GetCompany()->GetOwner()->GetName());

                    return;
                }

                if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true)
                    ch->GetExchange()->AddGold(pinfo->arg1);
            }
            break;

        case EXCHANGE_SUBHEADER_CG_ACCEPT:
            if (ch->GetExchange())
            {
                sys_log(0, "CInputMain()::Exchange() ==> ACCEPT ");
                ch->GetExchange()->Accept(true);
            }

            break;

        case EXCHANGE_SUBHEADER_CG_CANCEL:    // arg1 == not used
            if (ch->GetExchange())
                ch->GetExchange()->Cancel();
            break;
    }
}

Bu fonksiyonda gördüğün gibi ch-> ile yapılan birçok işlem ve kontrol var. Şartlara ve işleme bağlı olarak karakter verisini güncelliyor ve sonucunda ise envanterde anlık olarak yeniliyor.

Sorununa gelecek olursak; eğer senin çekmek istediğin bilgiler senin harici olarak eklediğin bilgiler ise, onları bu tür halihazırda bulunan sürekli kendini güncelleyen paketler aracılığı ile akıcı bir hale getirmen gerekir. Eğer zaten metin2'de bulunan verileri çekmeye çalışıyorsan, bu bahsettiğim olayı sadece python tarafında yapman gerekir. Envanter ve öğeleri oyunun bel kemiği olduğu için bir çok yerde bağlantıları var ve sürekli aktif çalışıyor. Ancak diğer guiler çoğu zaman yarı statiktir. Bu yüzden bu tür pencerelerde (OnUpdate) gibi fonksiyonlardan yardım alarak çekmek istediğin verileri sürekli olarak güncelleyebilirsin.
Cevaplarınız için teşekkür ederim, gönderdiğim veri metin2 haricinde bir veri fakat HEADER_GC_CHARACTER_POINTS ile aktarılıyor:

C++:
Genişlet Daralt Kopyala
    pack.header = HEADER_GC_CHARACTER_POINTS;

    pack.points[POINT_LEVEL] = GetLevel();
    pack.points[POINT_EXP] = GetExp();
    pack.points[POINT_NEXT_EXP] = GetNextExp();
    pack.points[POINT_HP] = GetHP();
    pack.points[POINT_MAX_HP] = GetMaxHP();
    pack.points[POINT_SP] = GetSP();
    pack.points[POINT_MAX_SP] = GetMaxSP();
    pack.points[POINT_GOLD] = GetGold();
    pack.points[POINT_STAMINA] = GetStamina();
    pack.points[POINT_MAX_STAMINA] = GetMaxStamina();
#ifdef WEAPON_MASTERY
    pack.points[POINT_WEAPON_LEVEL] = GetWeaponLevel();
    pack.points[POINT_WEAPON_EXP] = GetWeaponExp();
    pack.points[POINT_WEAPON_NEXT_EXP] = GetWeaponNextExp();
#endif

Yang kısmında bu pointleri çektirdiğim zaman videodaki gibi sıkıntısız bir şekilde çalışıyor game'den gelen veri dbye kayıt etme vs. @hasanmacit 'in dediği gibi bir şey galiba bu, client python tarafına girdiğimden beri kafam allak bullak oldu.
 
Cevaplarınız için teşekkür ederim, gönderdiğim veri metin2 haricinde bir veri fakat HEADER_GC_CHARACTER_POINTS ile aktarılıyor:

C++:
Genişlet Daralt Kopyala
    pack.header = HEADER_GC_CHARACTER_POINTS;

    pack.points[POINT_LEVEL] = GetLevel();
    pack.points[POINT_EXP] = GetExp();
    pack.points[POINT_NEXT_EXP] = GetNextExp();
    pack.points[POINT_HP] = GetHP();
    pack.points[POINT_MAX_HP] = GetMaxHP();
    pack.points[POINT_SP] = GetSP();
    pack.points[POINT_MAX_SP] = GetMaxSP();
    pack.points[POINT_GOLD] = GetGold();
    pack.points[POINT_STAMINA] = GetStamina();
    pack.points[POINT_MAX_STAMINA] = GetMaxStamina();
#ifdef WEAPON_MASTERY
    pack.points[POINT_WEAPON_LEVEL] = GetWeaponLevel();
    pack.points[POINT_WEAPON_EXP] = GetWeaponExp();
    pack.points[POINT_WEAPON_NEXT_EXP] = GetWeaponNextExp();
#endif

Yang kısmında bu pointleri çektirdiğim zaman videodaki gibi sıkıntısız bir şekilde çalışıyor game'den gelen veri dbye kayıt etme vs. @hasanmacit 'in dediği gibi bir şey galiba bu, client python tarafına girdiğimden beri kafam allak bullak oldu.
Demek istediğini anladım. Dediğim gibi eğer veriler doğru bir şekilde geliyorsa, geriye sadece pythonda OnUpdate fonksiyonundan yardım almak gerekiyor.
Yanlış anlamadıysam senin durumunun birebir aynısını test için yaptım. Karakterin yang bilgisini arkadaş listesi ekranına yazdırdım.

Birinci video:
Yangı yere attıktan sonra, envanter güncelleniyor ama arkadaş listesindeki yang bilgisi güncellenmiyor. Sadece ışınlandığım zaman güncelleniyor.


İkinci video:
OnUpdate ile artık her saniye ve her koşulda güncelleniyor.



Kodlar ise basitçe şöyle:
Python:
Genişlet Daralt Kopyala
    def TestFunc(self):
        import player
        money = player.GetElk()
        self.yang = ui.TextLine()
        self.yang.SetParent(self)
        self.yang.SetText(localeInfo.NumberToMoneyStringNew(money))
        self.yang.SetPosition(10,166)
        self.yang.Show()

Python:
Genişlet Daralt Kopyala
    def OnUpdate(self):
        self.TestFunc()
 
Demek istediğini anladım. Dediğim gibi eğer veriler doğru bir şekilde geliyorsa, geriye sadece pythonda OnUpdate fonksiyonundan yardım almak gerekiyor.
Yanlış anlamadıysam senin durumunun birebir aynısını test için yaptım. Karakterin yang bilgisini arkadaş listesi ekranına yazdırdım.

Birinci video:
Yangı yere attıktan sonra, envanter güncelleniyor ama arkadaş listesindeki yang bilgisi güncellenmiyor. Sadece ışınlandığım zaman güncelleniyor.


İkinci video:
OnUpdate ile artık her saniye ve her koşulda güncelleniyor.



Kodlar ise basitçe şöyle:
Python:
Genişlet Daralt Kopyala
    def TestFunc(self):
        import player
        money = player.GetElk()
        self.yang = ui.TextLine()
        self.yang.SetParent(self)
        self.yang.SetText(localeInfo.NumberToMoneyStringNew(money))
        self.yang.SetPosition(10,166)
        self.yang.Show()

Python:
Genişlet Daralt Kopyala
    def OnUpdate(self):
        self.TestFunc()

Evet bu şekilde çalıştı hocam teşekkür ederim. Artık güncelleniyor. Bunu öğrendiğim çok iyi oldu. Diğer sorunum hakkında bir bilginiz var mı acaba?
 
Evet bu şekilde çalıştı hocam teşekkür ederim. Artık güncelleniyor. Bunu öğrendiğim çok iyi oldu. Diğer sorunum hakkında bir bilginiz var mı acaba?
İlgili GUI'nin Load fonksiyonuna benzer işlemleri uygulaman ve değerleri yazdırman gerekebilir.
 
Ben bir şeyleri çok büyük yanlış yapıyorum sanırım, refresh fonksiyonunu mantıklı gelen her yere ekleyip tek tek denedim olmadı ne yapabilirim bilmiyorum şuan bu sade hali.

Python:
Genişlet Daralt Kopyala
class BeltInventoryWindow(ui.ScriptWindow):

    def __init__(self, wndInventory):
        import exception
      
        if not app.ENABLE_NEW_EQUIPMENT_SYSTEM:         
            exception.Abort("What do you do?")
            return

        if not wndInventory:
            exception.Abort("wndInventory parameter must be set to InventoryWindow")
            return                     
                
        ui.ScriptWindow.__init__(self)

        self.isLoaded = 0
        self.wndInventory = wndInventory;
      
        self.wndBeltInventoryLayer = None
        self.wndBeltInventorySlot = None
        self.expandBtn = None
        self.minBtn = None

        self.__LoadWindow()

    def __del__(self):
        ui.ScriptWindow.__del__(self)

    def Show(self, openBeltSlot = FALSE):
        self.__LoadWindow()
        self.RefreshSlot()

        ui.ScriptWindow.Show(self)
      
        if openBeltSlot:
            self.OpenInventory()
        else:
            self.CloseInventory()


    def Close(self):
        self.Hide()

    def IsOpeningInventory(self):
        return self.wndBeltInventoryLayer.IsShow()
      
    def OpenInventory(self):
        self.wndBeltInventoryLayer.Show()
        self.expandBtn.Hide()

        if localeInfo.IsARABIC() == 0:
            self.AdjustPositionAndSize()
              
    def CloseInventory(self):
        self.wndBeltInventoryLayer.Hide()
        self.expandBtn.Show()
      
        if localeInfo.IsARABIC() == 0:
            self.AdjustPositionAndSize()

    ## ���� �κ��丮 ��ġ�� �������� BASE ��ġ�� ���, ����.. ���� �ϵ��ڵ��ϱ� ���� ������ ����� ����..
    def GetBasePosition(self):
        x, y = self.wndInventory.GetGlobalPosition()
        return x - 148, y + 241
      
    def AdjustPositionAndSize(self):
        bx, by = self.GetBasePosition()
      
        if self.IsOpeningInventory():         
            self.SetPosition(bx, by)
            self.SetSize(self.ORIGINAL_WIDTH, self.GetHeight())
          
        else:
            self.SetPosition(bx + 138, by);
            self.SetSize(10, self.GetHeight())

    def __LoadWindow(self):
        if self.isLoaded == 1:
            return

        self.isLoaded = 1

        try:
            pyScrLoader = ui.PythonScriptLoader()
            pyScrLoader.LoadScriptFile(self, "UIScript/BeltInventoryWindow.py")
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.LoadObject")

        try:
            self.ORIGINAL_WIDTH = self.GetWidth()
            wndBeltInventorySlot = self.GetChild("BeltInventorySlot")
            self.wndBeltInventoryLayer = self.GetChild("BeltInventoryLayer")
            self.expandBtn = self.GetChild("ExpandBtn")
            self.minBtn = self.GetChild("MinimizeBtn")

            self.WeaponMasteryBoard = self.GetChild("WeaponMasteryBoard")
            self.WeaponMasteryLabel = self.GetChild("WeaponMasteryLabel")
            self.WeaponMasteryLevel = self.GetChild("WeaponMasteryLevel")
            self.WeaponMasteryGauge = self.GetChild("WeaponMasteryGauge")
          
            self.expandBtn.SetEvent(ui.__mem_func__(self.OpenInventory))
            self.minBtn.SetEvent(ui.__mem_func__(self.CloseInventory))
          
            if localeInfo.IsARABIC() :
                self.expandBtn.SetPosition(self.expandBtn.GetWidth() - 2, 15)
                self.wndBeltInventoryLayer.SetPosition(self.wndBeltInventoryLayer.GetWidth() - 5, 0)
                self.minBtn.SetPosition(self.minBtn.GetWidth() + 3, 15)         
  
            for i in xrange(item.BELT_INVENTORY_SLOT_COUNT):
                slotNumber = item.BELT_INVENTORY_SLOT_START + i                         
                wndBeltInventorySlot.SetCoverButton(slotNumber,    "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/belt_inventory/slot_disabled.tga", FALSE, FALSE)
          
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.BindObject")

        ## Equipment
        wndBeltInventorySlot.SetOverInItemEvent(ui.__mem_func__(self.wndInventory.OverInItem))
        wndBeltInventorySlot.SetOverOutItemEvent(ui.__mem_func__(self.wndInventory.OverOutItem))
        wndBeltInventorySlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))
        wndBeltInventorySlot.SetUseSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))                     
        wndBeltInventorySlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.wndInventory.SelectEmptySlot))
        wndBeltInventorySlot.SetSelectItemSlotEvent(ui.__mem_func__(self.wndInventory.SelectItemSlot))

        self.wndBeltInventorySlot = wndBeltInventorySlot

    def RefreshSlot(self):
        getItemVNum=player.GetItemIndex
      
        for i in xrange(item.BELT_INVENTORY_SLOT_COUNT):
            slotNumber = item.BELT_INVENTORY_SLOT_START + i
            self.wndBeltInventorySlot.SetItemSlot(slotNumber, getItemVNum(slotNumber), player.GetItemCount(slotNumber))
            self.wndBeltInventorySlot.SetAlwaysRenderCoverButton(slotNumber, TRUE)
          
            avail = "0"
          
            if player.IsAvailableBeltInventoryCell(slotNumber):
                self.wndBeltInventorySlot.EnableCoverButton(slotNumber)             
            else:
                self.wndBeltInventorySlot.DisableCoverButton(slotNumber)             

        self.wndBeltInventorySlot.RefreshSlot()

    def Refresh(self):
        try:
            w_lvl = player.GetStatus(player.WEAPON_LEVEL)
            w_exp = player.GetStatus(player.WEAPON_EXP)
            w_next_exp = player.GetStatus(player.WEAPON_NEXT_EXP)

            self.WeaponMasteryLevel.SetText(str(w_lvl))
            self.WeaponMasteryGauge.SetText(str(w_exp) + '/' + str(w_next_exp))
        except:
            pass

    def OnUpdate(self):
        self.Refresh()
 
Ben bir şeyleri çok büyük yanlış yapıyorum sanırım, refresh fonksiyonunu mantıklı gelen her yere ekleyip tek tek denedim olmadı ne yapabilirim bilmiyorum şuan bu sade hali.

Python:
Genişlet Daralt Kopyala
class BeltInventoryWindow(ui.ScriptWindow):

    def __init__(self, wndInventory):
        import exception
     
        if not app.ENABLE_NEW_EQUIPMENT_SYSTEM:        
            exception.Abort("What do you do?")
            return

        if not wndInventory:
            exception.Abort("wndInventory parameter must be set to InventoryWindow")
            return                    
               
        ui.ScriptWindow.__init__(self)

        self.isLoaded = 0
        self.wndInventory = wndInventory;
     
        self.wndBeltInventoryLayer = None
        self.wndBeltInventorySlot = None
        self.expandBtn = None
        self.minBtn = None

        self.__LoadWindow()

    def __del__(self):
        ui.ScriptWindow.__del__(self)

    def Show(self, openBeltSlot = FALSE):
        self.__LoadWindow()
        self.RefreshSlot()

        ui.ScriptWindow.Show(self)
     
        if openBeltSlot:
            self.OpenInventory()
        else:
            self.CloseInventory()


    def Close(self):
        self.Hide()

    def IsOpeningInventory(self):
        return self.wndBeltInventoryLayer.IsShow()
     
    def OpenInventory(self):
        self.wndBeltInventoryLayer.Show()
        self.expandBtn.Hide()

        if localeInfo.IsARABIC() == 0:
            self.AdjustPositionAndSize()
             
    def CloseInventory(self):
        self.wndBeltInventoryLayer.Hide()
        self.expandBtn.Show()
     
        if localeInfo.IsARABIC() == 0:
            self.AdjustPositionAndSize()

    ## ���� �κ��丮 ��ġ�� �������� BASE ��ġ�� ���, ����.. ���� �ϵ��ڵ��ϱ� ���� ������ ����� ����..
    def GetBasePosition(self):
        x, y = self.wndInventory.GetGlobalPosition()
        return x - 148, y + 241
     
    def AdjustPositionAndSize(self):
        bx, by = self.GetBasePosition()
     
        if self.IsOpeningInventory():        
            self.SetPosition(bx, by)
            self.SetSize(self.ORIGINAL_WIDTH, self.GetHeight())
         
        else:
            self.SetPosition(bx + 138, by);
            self.SetSize(10, self.GetHeight())

    def __LoadWindow(self):
        if self.isLoaded == 1:
            return

        self.isLoaded = 1

        try:
            pyScrLoader = ui.PythonScriptLoader()
            pyScrLoader.LoadScriptFile(self, "UIScript/BeltInventoryWindow.py")
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.LoadObject")

        try:
            self.ORIGINAL_WIDTH = self.GetWidth()
            wndBeltInventorySlot = self.GetChild("BeltInventorySlot")
            self.wndBeltInventoryLayer = self.GetChild("BeltInventoryLayer")
            self.expandBtn = self.GetChild("ExpandBtn")
            self.minBtn = self.GetChild("MinimizeBtn")

            self.WeaponMasteryBoard = self.GetChild("WeaponMasteryBoard")
            self.WeaponMasteryLabel = self.GetChild("WeaponMasteryLabel")
            self.WeaponMasteryLevel = self.GetChild("WeaponMasteryLevel")
            self.WeaponMasteryGauge = self.GetChild("WeaponMasteryGauge")
         
            self.expandBtn.SetEvent(ui.__mem_func__(self.OpenInventory))
            self.minBtn.SetEvent(ui.__mem_func__(self.CloseInventory))
         
            if localeInfo.IsARABIC() :
                self.expandBtn.SetPosition(self.expandBtn.GetWidth() - 2, 15)
                self.wndBeltInventoryLayer.SetPosition(self.wndBeltInventoryLayer.GetWidth() - 5, 0)
                self.minBtn.SetPosition(self.minBtn.GetWidth() + 3, 15)        
 
            for i in xrange(item.BELT_INVENTORY_SLOT_COUNT):
                slotNumber = item.BELT_INVENTORY_SLOT_START + i                        
                wndBeltInventorySlot.SetCoverButton(slotNumber,    "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/belt_inventory/slot_disabled.tga", FALSE, FALSE)
         
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.BindObject")

        ## Equipment
        wndBeltInventorySlot.SetOverInItemEvent(ui.__mem_func__(self.wndInventory.OverInItem))
        wndBeltInventorySlot.SetOverOutItemEvent(ui.__mem_func__(self.wndInventory.OverOutItem))
        wndBeltInventorySlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))
        wndBeltInventorySlot.SetUseSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))                    
        wndBeltInventorySlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.wndInventory.SelectEmptySlot))
        wndBeltInventorySlot.SetSelectItemSlotEvent(ui.__mem_func__(self.wndInventory.SelectItemSlot))

        self.wndBeltInventorySlot = wndBeltInventorySlot

    def RefreshSlot(self):
        getItemVNum=player.GetItemIndex
     
        for i in xrange(item.BELT_INVENTORY_SLOT_COUNT):
            slotNumber = item.BELT_INVENTORY_SLOT_START + i
            self.wndBeltInventorySlot.SetItemSlot(slotNumber, getItemVNum(slotNumber), player.GetItemCount(slotNumber))
            self.wndBeltInventorySlot.SetAlwaysRenderCoverButton(slotNumber, TRUE)
         
            avail = "0"
         
            if player.IsAvailableBeltInventoryCell(slotNumber):
                self.wndBeltInventorySlot.EnableCoverButton(slotNumber)            
            else:
                self.wndBeltInventorySlot.DisableCoverButton(slotNumber)            

        self.wndBeltInventorySlot.RefreshSlot()

    def Refresh(self):
        try:
            w_lvl = player.GetStatus(player.WEAPON_LEVEL)
            w_exp = player.GetStatus(player.WEAPON_EXP)
            w_next_exp = player.GetStatus(player.WEAPON_NEXT_EXP)

            self.WeaponMasteryLevel.SetText(str(w_lvl))
            self.WeaponMasteryGauge.SetText(str(w_exp) + '/' + str(w_next_exp))
        except:
            pass

    def OnUpdate(self):
        self.Refresh()

Aşağıda verdiğimi komple kopyalayıp değiştirerek dener misin? Yaptığım düzenlemeleri ##kaiser tagıyla belirttim.

Python:
Genişlet Daralt Kopyala
class BeltInventoryWindow(ui.ScriptWindow):

    def __init__(self, wndInventory):
        import exception
     
        if not app.ENABLE_NEW_EQUIPMENT_SYSTEM:        
            exception.Abort("What do you do?")
            return

        if not wndInventory:
            exception.Abort("wndInventory parameter must be set to InventoryWindow")
            return                    
               
        ui.ScriptWindow.__init__(self)

        self.isLoaded = 0
        self.wndInventory = wndInventory;
     
        self.wndBeltInventoryLayer = None
        self.wndBeltInventorySlot = None
        self.expandBtn = None
        self.minBtn = None
       
        ##kaiser
        self.w_lvl = None
        self.w_exp  = None
        self.w_next_exp  = None

        self.__LoadWindow()

    def __del__(self):
        ui.ScriptWindow.__del__(self)

    def Show(self, openBeltSlot = FALSE):
        self.__LoadWindow()
        self.RefreshSlot()

        ui.ScriptWindow.Show(self)
     
        if openBeltSlot:
            self.OpenInventory()
        else:
            self.CloseInventory()


    def Close(self):
        ##kaiser
        self.w_lvl = None
        self.w_exp  = None
        self.w_next_exp  = None
        ##
       
        self.Hide()

    def IsOpeningInventory(self):
        return self.wndBeltInventoryLayer.IsShow()
     
    def OpenInventory(self):
        self.wndBeltInventoryLayer.Show()
        self.expandBtn.Hide()

        if localeInfo.IsARABIC() == 0:
            self.AdjustPositionAndSize()
             
    def CloseInventory(self):
        self.wndBeltInventoryLayer.Hide()
        self.expandBtn.Show()
     
        if localeInfo.IsARABIC() == 0:
            self.AdjustPositionAndSize()

    ## ���� �κ��丮 ��ġ�� �������� BASE ��ġ�� ���, ����.. ���� �ϵ��ڵ��ϱ� ���� ������ ����� ����..
    def GetBasePosition(self):
        x, y = self.wndInventory.GetGlobalPosition()
        return x - 148, y + 241
     
    def AdjustPositionAndSize(self):
        bx, by = self.GetBasePosition()
     
        if self.IsOpeningInventory():        
            self.SetPosition(bx, by)
            self.SetSize(self.ORIGINAL_WIDTH, self.GetHeight())
         
        else:
            self.SetPosition(bx + 138, by);
            self.SetSize(10, self.GetHeight())

    def __LoadWindow(self):
        if self.isLoaded == 1:
            return

        self.isLoaded = 1

        try:
            pyScrLoader = ui.PythonScriptLoader()
            pyScrLoader.LoadScriptFile(self, "UIScript/BeltInventoryWindow.py")
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.LoadObject")

        try:
            self.ORIGINAL_WIDTH = self.GetWidth()
            wndBeltInventorySlot = self.GetChild("BeltInventorySlot")
            self.wndBeltInventoryLayer = self.GetChild("BeltInventoryLayer")
            self.expandBtn = self.GetChild("ExpandBtn")
            self.minBtn = self.GetChild("MinimizeBtn")

            self.WeaponMasteryBoard = self.GetChild("WeaponMasteryBoard")
            self.WeaponMasteryLabel = self.GetChild("WeaponMasteryLabel")
            self.WeaponMasteryLevel = self.GetChild("WeaponMasteryLevel")
            self.WeaponMasteryGauge = self.GetChild("WeaponMasteryGauge")
         
            self.expandBtn.SetEvent(ui.__mem_func__(self.OpenInventory))
            self.minBtn.SetEvent(ui.__mem_func__(self.CloseInventory))
         
            if localeInfo.IsARABIC() :
                self.expandBtn.SetPosition(self.expandBtn.GetWidth() - 2, 15)
                self.wndBeltInventoryLayer.SetPosition(self.wndBeltInventoryLayer.GetWidth() - 5, 0)
                self.minBtn.SetPosition(self.minBtn.GetWidth() + 3, 15)        
 
            for i in xrange(item.BELT_INVENTORY_SLOT_COUNT):
                slotNumber = item.BELT_INVENTORY_SLOT_START + i                        
                wndBeltInventorySlot.SetCoverButton(slotNumber,    "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/belt_inventory/slot_disabled.tga", FALSE, FALSE)
         
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.BindObject")

        ## Equipment
        wndBeltInventorySlot.SetOverInItemEvent(ui.__mem_func__(self.wndInventory.OverInItem))
        wndBeltInventorySlot.SetOverOutItemEvent(ui.__mem_func__(self.wndInventory.OverOutItem))
        wndBeltInventorySlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))
        wndBeltInventorySlot.SetUseSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))                    
        wndBeltInventorySlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.wndInventory.SelectEmptySlot))
        wndBeltInventorySlot.SetSelectItemSlotEvent(ui.__mem_func__(self.wndInventory.SelectItemSlot))

        self.wndBeltInventorySlot = wndBeltInventorySlot
        self.RefreshInfo() ##kaiser


    def RefreshSlot(self):
        getItemVNum=player.GetItemIndex
     
        for i in xrange(item.BELT_INVENTORY_SLOT_COUNT):
            slotNumber = item.BELT_INVENTORY_SLOT_START + i
            self.wndBeltInventorySlot.SetItemSlot(slotNumber, getItemVNum(slotNumber), player.GetItemCount(slotNumber))
            self.wndBeltInventorySlot.SetAlwaysRenderCoverButton(slotNumber, TRUE)
         
            avail = "0"
         
            if player.IsAvailableBeltInventoryCell(slotNumber):
                self.wndBeltInventorySlot.EnableCoverButton(slotNumber)            
            else:
                self.wndBeltInventorySlot.DisableCoverButton(slotNumber)            

        self.wndBeltInventorySlot.RefreshSlot()

    def RefreshInfo(self): ##kaiser
        self.w_lvl = player.GetStatus(player.WEAPON_LEVEL)
        self.w_exp  = player.GetStatus(player.WEAPON_EXP)
        self.w_next_exp  = player.GetStatus(player.WEAPON_NEXT_EXP)
       
        self.WeaponMasteryLevel.SetText(str(self.w_lvl))
        self.WeaponMasteryGauge.SetText(str(self.w_exp) + '/' + str(self.w_next_exp))

    def OnUpdate(self):
        self.RefreshInfo() ##kaiser
 
Maalesef hala aynı sorun var:


Sanırım kaynak kodlarında verilerin aktarımıyla ilgili bir eksiklik veya yanlışlık var. Çünkü halihazırda bulunan player.GetStatus(player.DEF_GRADE) gibi verileri rastgele bir gui içine yazdırmayı denediğimde sorunsuz bir şekilde yazdırdı. Hatta verdiğim kodda ufak bir düzenleme yaparak vermiş olduğum DEF_GRADE özelliğini çektirip yazdırmayı dene. Ve zırh vb. değiştirip yazının güncellenip güncellenmediğine bak. Eğer çalışırsa sorun büyük ihtimalle kaynak tarafındadır.
 
Çözüm
Evet dediğiniz gibi yaptığımda çalışıyor, hatayı artık hata olmayan yerde aramayı bırakıp hata olan kısıma bakabilirim. İki sorunumda sizin sayenizde çözüldü, biraz kaynak kodlarıyla uğraşayım, tekrar teşekkür ederim.
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst