ecSRO Çözüldü ECSRO Skill Edit Potion ve Muhtemel Global/Reverse Dupe Bug Fix

  • Konuyu Başlatan Konuyu Başlatan zenenet
  • Başlangıç tarihi Başlangıç tarihi

zenenet

.
.
Aktiflik: 3%
Muhafız 100 mesaj
Katılım
12 Eyl 2019
Mesajlar
188
Tepkime puanı
57
Puan
28
Yaş
37
Konum
ist
Thread owner
Merhaba,

Database procedürlerine bakarken inv. item moving procedüründe bir hata yakaladım ve bu hata hepimizin bildiği skill edit potion bugunu ve muhtemelen internette gördüğüm global/pot gibi stackable itemlerin kopyalanmasını engelliyor. Ayrıca yaptığım testte bu stallda görsel olarak oluşan dupe bugunuda fixlemiş görünüyor.Gameserver tarafından aslında skill edit potion kullanımı exchange ekranında kapatmak daha mantıklı bir çözüm olabilir fakat bu Skill edit potion özelinde yapılacak bir fix. Direkt olarak global/reverse/ gibi stackable itemlerin kopyalanmaması için muhtemelen exchange fonksiyonu tamamen elden geçirilmeli.
Prosedürümüz _STRG_MOVEITEM_P2P.

Prosedür de şu alanı arayınız ve siliniz.

Kod:
İçeriği görebilmek için Giriş yap ya da üye ol.

Bu alan exchange bitiminde, inv. slotta bulunan itemi teleport olduktan sonra güncelliyor fakat eğer client yanlış veriyi servera gönderirse, (Örnek olarak 1. slotta bulunan 1 adet global ile 2.slotta bulunan 50 adet arrowun item id manipüle edildiğinde teleport sonrası 50 adet arrow -- > 50 Adet global oluyor. )item adet değerini ona göre güncelliyor. O yüzden bu kısım çok rahat manipüle edilebiliyor. (Skill edit potionda olduğu gibi) Bu kısmı prosedürden sildiğimiz de skill edit potion bugu çözülüyor sadece görsel olarak karşı tarafa gitmiş gibi görünüyor fakat teleport atınca olması gereken değere dönüyor. (Görsel olan kısım için Gameserverın inv. kısmını uptade etmesi gerekiyor?) Fakat bu prosedürü bu şekilde güncellemek oyunda ne gibi hatalara sebep verebilir tam olarak çözemedim. Yaptığım testlerde herhangi bir problemle karşılaşmadım ama Silkroad database ve SQL konusunda tecrübeli olan arkadaşlar muhtemelen daha mantıklı bir açıklama getirirler.
 
DECLARE @Old_Item_Data INT = NULL -- NULL olarak başlat
SELECT @Old_Item_Data = Data FROM _Items WHERE ID64 = @ItemID_From

IF (@Old_Item_Data IS NOT NULL AND @Old_Item_Data <> @Data)
BEGIN
UPDATE _Items SET Data = @Data WHERE ID64 = @ItemID_From
END
Bu kod hatayı düzeltebilir mi?

### **Kodun Amacı:**
`_Items` tablosundaki belirli bir kaydın (**ID64 = @ItemID_From**) `Data` alanını, **yeni değer (@Data)** ile günceller.
Ancak bu güncelleme, **sadece iki koşul sağlanırsa** yapılır:
1. Kayıt tabloda mevcutsa (`@Old_Item_Data` NULL değilse).
2. Mevcut `Data` değeri, yeni değerden farklıysa (`@Old_Item_Data <> @Data`).

---

### **Adım Adım Çalışma Mantığı:**

1. **Değişken Tanımlama:**
```sql
DECLARE @Old_Item_Data INT = NULL
```
- `@Old_Item_Data` adında bir değişken oluşturulur ve başlangıç değeri **NULL** olarak atanır.

2. **Değeri Tablodan Alma:**
```sql
SELECT @Old_Item_Data = Data FROM _Items WHERE ID64 = @ItemID_From
```
- `_Items` tablosundan, **ID64** değeri `@ItemID_From` olan kaydın `Data` alanını alır ve `@Old_Item_Data` değişkenine atar.
- Eğer kayıt bulunamazsa, `@Old_Item_Data` **NULL** kalır.

3. **Koşul Kontrolü:**
```sql
IF (@Old_Item_Data IS NOT NULL AND @Old_Item_Data <> @Data)
```
- **1. Koşul:** Kayıt tabloda varsa (`@Old_Item_Data` NULL değilse).
- **2. Koşul:** Mevcut `Data` değeri, yeni değerden (`@Data`) farklıysa.
- Her iki koşul da sağlanırsa, `UPDATE` işlemi çalışır.

4. **Güncelleme İşlemi:**
```sql
UPDATE _Items SET Data = @Data WHERE ID64 = @ItemID_From
```
- Yalnızca yukarıdaki koşullar sağlandığında, `Data` alanını yeni değerle (`@Data`) günceller.

---

### **Neden Bu Mantık?**
- **Optimizasyon:** Gereksiz `UPDATE` işlemlerini önler (aynı değerle güncelleme yapmaz).
- **Güvenlik:** Kayıt yoksa (`@Old_Item_Data` NULL ise) hiçbir işlem yapılmaz, hata riski ortadan kalkar.
 
Oyla 0
karşı tarafa görsel olarak gidiyorsa şu sıkıntıya yol açar aktif bir serverda çok fazla dolandırıcılık olur bu sayede
 
Oyla 0

Bu konuyu görüntüleyen kullanıcılar

Etiketler
Geri
Üst Alt