Best Studio 1
Best Studio
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
InfernoShade 1
InfernoShade
BlackFullMoon 1
BlackFullMoon
Agora Metin2 1
Agora Metin2
PrimeAC 1
PrimeAC
ShadowFon 1
ShadowFon
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Cevaplandı Stok Sınırı

  • Konuyu başlatan Konuyu başlatan alone323
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 5
  • Görüntüleme Görüntüleme 149

alone323

Level 4
TM Üye
Üye
Katılım
1 Kas 2019
Konular
22
Mesajlar
324
Çözüm
1
Online süresi
4d 3h
Reaksiyon Skoru
34
Altın Konu
0
TM Yaşı
6 Yıl 7 Ay 13 Gün
Başarım Puanı
85
MmoLira
1,157
DevLira
0
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

oyunda 64k stok sınırım var 100m yapmak istiyorum ve sandık açma 5k onuda 10m veya 100m yapmak istiyorum yardımcı olabilecek var mı
 

En Çok Reaksiyon Alan Mesajlar

Bu sınırlar tamamen oyunun altyapısından gelen teknik limitler, ayar dosyasıyla falan çözülecek şeyler değil. O yüzden net konuşayım ki boş yere kurcalama yapma.

64K stok sınırı dediğin olay, oyunda item adedinin tutulduğu değişken tipinden geliyor. Yani bu bir “ayar” değil, kod sınırı. 64K (65535) sınırı şuradan gelir: item sayısı 16 bitlik değişkenle tutuluyordur. Bu yüzden ne yaparsan yap o rakamın üstüne çıkmaz.

Bunu 100M yapmak istiyorsan:


  • Server source’ta item count geçen yerlerde kullanılan değişken tipi büyütülmeli
    WORD / uint16 tarzı tanımlar → DWORD / uint32 yapılmalı
    Sadece tek dosya değil, item ile ilgili tüm zincir etkilenir
Yani:


  • item.cpp
    char_item.cpp
    shop / safebox / sandık mantığı
    packet yapıları
hepsi birbiriyle uyumlu olmak zorunda. Sadece “bir yerde değiştirdim” ile olmaz.


Sandık açma 5K limiti ise iki yerden gelir:


  1. Client tarafı
    Sandık açarken girilen adet için Python tarafında bilinçli bir üst sınır vardır. Genelde güvenlik için konmuştur. Bunu artırmazsan, server ne kadar izin verirse versin client zaten o değerin üstünü göndermez.
    Server tarafı
    Server’da da “tek seferde en fazla şu kadar açılır” diye bir kontrol olur. Bu da çoğu files’te 5K civarındadır. Bu sınırı kaldırmadan 10M / 100M mümkün değil.
Burada da aynı mesele var:


  • Sınırı kaldırırsan ama değişken tipi küçük kalırsa yine takılırsın
    Client–server packet’lerinde sayı tipi büyütülmezse veri taşmaz

Özetle şunu bilmen önemli:


  • Bu sınırlar DB’den gelmiyor
    Quest ile çözülemez
    Config ayarı değildir
    Source işi
Source yoksa:


  • 64K stok → değiştirilemez
    Sandık açma → sınırlı şekilde oynanabilir ama sağlıklı olmaz
Source varsa:


  • Client + server + packet birlikte düzenlenmeli
    Aksi halde crash, item silinmesi veya rollback yaşarsın
Eğer elinde source varsa ve hangi files’i kullandığını söylersen, “şu dosyada şu kısım” diye daha net yol gösterebilirim. Yoksa bu iş ayarla çözülecek bir konu değil, onu bilmen yeterli.
Çözüm
Ticaret - 0%
0   0   0
Bu sınırlar tamamen oyunun altyapısından gelen teknik limitler, ayar dosyasıyla falan çözülecek şeyler değil. O yüzden net konuşayım ki boş yere kurcalama yapma.

64K stok sınırı dediğin olay, oyunda item adedinin tutulduğu değişken tipinden geliyor. Yani bu bir “ayar” değil, kod sınırı. 64K (65535) sınırı şuradan gelir: item sayısı 16 bitlik değişkenle tutuluyordur. Bu yüzden ne yaparsan yap o rakamın üstüne çıkmaz.

Bunu 100M yapmak istiyorsan:

  • Server source’ta item count geçen yerlerde kullanılan değişken tipi büyütülmeli
  • WORD / uint16 tarzı tanımlar → DWORD / uint32 yapılmalı
  • Sadece tek dosya değil, item ile ilgili tüm zincir etkilenir
Yani:

  • item.cpp
  • char_item.cpp
  • shop /...
İnt değerler kısıtlaması önce kısıtlamaları kaldırmak gerekiyor mesela 32767 üstünde efsunlu item veya 65.534 üstü değerler (unsigned short sınırı) ki bunu arkadaş çok güzel açıklamış ama mümkün fakat bunun için sistemi tamamen değiştirmek gerek. Stok sınırlarını arttırmak için: server - client src/pack ve sql değişikliği yapmalısın. Uğraştırıcı biraz ama yapılır.

Sql İçin;
Veri tabanındaki item tablosunda adet (count) sütunu genellikle smallint (max 65535) olarak ayarlıdır. Bunu yükseltmelisin.


• Navicat veya HeidiSQL üzerinden player veritabanına gir.


• item tablosuna sağ tıkla -> Design Table.


• count sütununun tipini SMALLINT yerine INT (veya INTEGER) olarak değiştir.


• Kaydet.

Server SRC (client) :


Kodun içinde "count" (adet) değişkeninin tipini WORD veya short yerine int veya long yapman gerekir.


A. common/length.h


Bu dosyada stok sınırını belirleyen bir tanım (macro) vardır. Bunu bulman ve güncellemen lazım (stok sınırın 64k olduğuna göre 65.534 veya 65535 max değerini bulup 2 milyon 5 milyon 10 milyon 100 milyonlara dönüştürmen gereklidir
B. common/tables.h


Server ile DB arasındaki veri transferi sırasında paketlerin boyutunu eşitlemelisin.


• TPlayerItem yapısı (struct) içindeki BYTE count; veya WORD count; satırını bul.


• Bunu int count; veya DWORD count; olarak değiştir.


C. game/src/ içindeki Dosyalar


char_item.cpp, item.h, item.cpp gibi dosyalarda GetCount() ve SetCount() fonksiyonlarının döndürdüğü veri tipini kontrol et. Eğer bunlar WORD veya short ise, onları da int yapmalısın.


3. Client Source (C++) Tarafı


Server'dan gelen büyük rakamları istemcinin (client) doğru okuyabilmesi için paket yapılarını eşitlemelisin.


• UserInterface/GameType.h ve Packet.h dosyalarını aç.


• Server source'da yaptığın gibi TPlayerItem ve TItemData yapılarındaki count değişkenini int veya DWORD olarak güncelle.


• Eğer bunu yapmazsan, server 2 milyon yollar ama client sadece ilk 16 bitini okur, bu da eşyaların kaybolmasına veya yanlış görünmesine sebep olur.


4. Python (Client) Tarafı


Görsel olarak rakamların taşmaması veya düzgün görünmesi için:


• root/uitooltip.py: İtemin üzerine geldiğinde adedini gösteren kısmın çok uzun rakamları desteklediğinden emin ol.


• root/uiinventory.py: Slotların üzerindeki rakam fontunu gerekirse küçült (çünkü 10.000.000 yazısı kutucuğa sığmayabilir).


Packet Alignment


Bu değişikliği yaptığında hem Game hem Client Source'u aynı anda derlemelisin (Build). Eğer sadece birini yaparsan, paket yapıları (struct) birbirine uymaz ve karakter oyuna girdiği anda client çöker (crash) veya eşyalar görünmez. Çünkü int (4 byte) ve short (2 byte) farklı yer kaplar; bu da "paket kayması" dediğimiz hataya yol açar.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst