🧩 [VSRO FIX]

Satılan İtemin Geri Gelmesi Fix


🧠 Problem Açıklaması

NPC’ye sattığınız item, return sonrası tekrar geri geliyorsa bu problem Shard tarafındaki stored procedure kaynaklıdır.

SRO_VT_SHARDProgrammability_STRG_DEL_ITEM_NoTX prosedürünü açın, Ctrl + A ile tamamını silip aşağıdaki kodu yapıştırın.

Execute işleminden sonra Shard ve GameServer resetlenmelidir.


🛠️ ÇÖZÜM – SQL FIX

Aşağıdaki SQL sorgusu doğrudan problemi hedef alır ve ek bir işleme gerek kalmadan sorunu çözer.

SQL

USE [SRO_VT_SHARD]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[_STRG_DEL_ITEM_NoTX]
	@DelFromPC_Inv AS TINYINT,
	@CharID AS BIGINT,
	@Slot AS TINYINT
AS

DECLARE @Rvalue INT
DECLARE @ItemToDel BIGINT

IF (@DelFromPC_Inv = 1)
	SELECT @ItemToDel = ItemID FROM _Inventory WHERE CharID = @CharID AND Slot = @Slot
ELSE IF (@DelFromPC_Inv = 2)
	SELECT @ItemToDel = ItemID FROM _InventoryForLinkedStorage WHERE LinkedItemID = @CharID AND Slot = @Slot
ELSE
	SELECT @ItemToDel = ItemID FROM _InvCOS WHERE COSID = @CharID AND Slot = @Slot

IF (@ItemToDel IS NULL OR @ItemToDel = 0)
	RETURN -1

DECLARE @BoundCOS INT
DECLARE @RefItemID INT
SELECT @RefItemID = RefItemID, @BoundCOS = Data FROM _Items WHERE ID64 = @ItemToDel
IF (@@ROWCOUNT = 0)
	RETURN -2

DECLARE @TypeID1 TINYINT
DECLARE @TypeID2 TINYINT
DECLARE @TypeID3 TINYINT

SELECT 
	@TypeID1 = TypeID1,
	@TypeID2 = TypeID2,
	@TypeID3 = TypeID3
FROM _RefObjCommon WHERE ID = @RefItemID

-- PET Kontrolü - vSro.Blog
IF (@TypeID1 = 3 AND @TypeID2 = 2 AND @TypeID3 = 1)
BEGIN
	IF (@BoundCOS <> 0)
	BEGIN
		EXEC @Rvalue = _DeleteCharCOS_NoTX @BoundCOS
		IF (@Rvalue < 0)
			RETURN @Rvalue
	END
END

ELSE IF (@TypeID1 = 3 AND @TypeID2 = 2 AND @TypeID3 = 3)
BEGIN
	IF (@BoundCOS <> 0)
	BEGIN
		IF (NOT EXISTS (SELECT 1 FROM _InventoryForLinkedStorage WHERE LinkedItemID = @ItemToDel))
			RETURN -1000

		IF (EXISTS (
			SELECT 1 FROM _InventoryForLinkedStorage 
			WHERE LinkedItemID = @ItemToDel AND ItemID <> 0
		))
		BEGIN
			UPDATE _ItemPool SET InUse = 0
			FROM _ItemPool IP
			JOIN _InventoryForLinkedStorage ILS ON IP.ItemID = ILS.ItemID
			WHERE ILS.LinkedItemID = @ItemToDel
		END

		DELETE FROM _InventoryForLinkedStorage WHERE LinkedItemID = @ItemToDel
		IF (@@ERROR <> 0)
			RETURN -2
	END
END

IF (@DelFromPC_Inv = 1)
	UPDATE _Inventory SET ItemID = 0 WHERE CharID = @CharID AND Slot = @Slot
ELSE IF (@DelFromPC_Inv = 2)
	UPDATE _InventoryForLinkedStorage SET ItemID = 0 WHERE LinkedItemID = @CharID AND Slot = @Slot
ELSE
	UPDATE _InvCOS SET ItemID = 0 WHERE COSID = @CharID AND Slot = @Slot

IF (@@ERROR <> 0 OR @@ROWCOUNT = 0)
	RETURN -3

IF EXISTS (SELECT 1 FROM _RentItemInfo WHERE nItemDBID = @ItemToDel)
BEGIN
	DELETE FROM _RentItemInfo WHERE nItemDBID = @ItemToDel
	IF (@@ERROR <> 0)
		RETURN -6
END

EXEC @Rvalue = _STRG_FREE_ITEM_NoTX @ItemToDel
IF (@Rvalue < 0)
	RETURN -4

RETURN 1

⚠️ Not: Sorguyu çalıştırmadan önce ilgili tablonun yedeğini almanız önerilir.


✅ Fix Sonucu

  • ✔️ Satılan itemin geri gelme hatası giderilir
  • ✔️ Client DC / Crash problemleri çözülür
  • ✔️ Sistem stabil şekilde çalışır

⚠️ Uyarılar

  • Sadece VSRO 188+ altyapısı için uygundur
  • Farklı sürümlerde kullanılması önerilmez
  • Canlı sunucuda uygulamadan önce test edilmelidir

🧷 Ek Bilgi

Bu fix tek seferliktir. Tekrar çalıştırılmasına gerek yoktur.


🔒 Telif & Paylaşım

Bu konu vSro.Blog için özel olarak hazırlanmıştır. İzinsiz kopyalanması veya başka forumlarda paylaşılması yasaktır.