stored procedures causing item bug
especially STRG_MOVE_ITEM
this is my STRG_MOVE_ITEM's sql query
Quote:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
--------------------------------------------------------------------------------------------------------------------------
-- PROC #3
-- _STRG_MOVE_ITEM 프로시져를 수정하여 아바타 인벤토리로 아이템 이동 기능을 추가해 주자! - by zone0000 (허승욱)
--------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------
-- _STRG_MOVE_ITEM 아바타 Operation(35)(36) 추가 (허승욱)
-----------------------------------------------------------------
ALTER PROCEDURE [dbo].[_STRG_MOVE_ITEM]
@Operation AS TINYINT,
@UserJID AS INT,
@CharID AS INT,
@GuildID AS BIGINT, -- Operation 39, 40에선 LinkedItemID로 사용.
@Slot_From AS TINYINT,
@Slot_To AS TINYINT,
@Data AS INT, -- 부�*진 장비도 가능하기땜에 0 이 될 수 있다.
@RemoveAndOverwrite AS TINYINT
AS
----------------
-- SP_UPDATE_SLOTS_INV 0
-- SP_UPDATE_SLOTS_CHEST 1
-- SP_DEPOSIT_ITEM 2
-- SP_WITHDRAW_ITEM 3
-- SP_UPDATE_SLOTS_INV_COS 16
-- SP_GUILD_CHEST_UPDATE_SLOT 29
-- SP_GUILD_CHEST_DEPOSIT_ITEM 30
-- SP_GUILD_CHEST_WITHDRAW_ITEM 31
-- SP_MOVE_ITEM_AVATAR_PC 35 -- Avatar 추가
-- SP_MOVE_ITEM_PC_AVATAR 36 -- Avatar 추가
-- SP_PUSH_ITEM_INTO_MAGIC_CUBE 39 -- MagicCube추가
-- SP_POP_ITEM_FROM_MAGIC_CUBE 40 -- MagicCube추가
----------------
IF (@Operation <> 0 AND @Operation <> 1 AND @Operation <> 2 AND @Operation <> 3 AND @Operation <> 16 AND @Operation <> 29 AND @Operation <> 30 AND @Operation <> 31
AND @Operation <> 35 AND @Operation <> 36 -- Avatar 추가
AND @Operation <> 39 AND @Operation <> 40 ) -- MagicCube추가
BEGIN
RETURN -1000
END
-- overwrite 는 오직 inventory 안에�*만 일어날 수 있는 일이다(�*살 자동 reloading)
IF (@RemoveAndOverwrite <> 0 AND @Operation <> 0)
BEGIN
RETURN -1001
END
DECLARE @ItemID_From BIGINT
DECLARE @ItemID_To BIGINT
SET @ItemID_From = 0
SET @ItemID_To = 0
----------------------------------------------------------
-- Step1. Src Slot 과 Dst Slot 의 아이템 얻기 및 존재 무결성 검사
----------------------------------------------------------
-------------- Src Item 얻기
IF (@Operation = 0 OR @Operation = 2 OR @Operation = 30) -- src: inventory
BEGIN
SELECT @ItemID_From = ItemID FROM _Inventory WHERE CharID = @CharID AND Slot = @Slot_From
END
ELSE IF (@Operation = 1 OR @Operation = 3) -- src: chest
BEGIN
SELECT @ItemID_From = ItemID FROM _Chest WHERE UserJID = @UserJID AND Slot = @Slot_From
END
ELSE IF (@Operation = 16)
BEGIN
SELECT @ItemID_From = ItemID FROM _InvCOS WHERE COSID = @CharID AND Slot = @Slot_From
END
ELSE IF (@Operation = 29 OR @Operation = 31)
BEGIN
SELECT @ItemID_From = ItemID FROM _GuildChest WHERE GuildID = @GuildID AND Slot = @Slot_From
END
-- Avatar 추가 ( Avatar -> PC )
ELSE IF (@Operation = 35)
BEGIN
SELECT @ItemID_From = ItemID FROM _InventoryForAvatar WHERE CharID = @CharID AND Slot = @Slot_From
END
-- Avatar 추가 ( PC -> Avatar )
ELSE IF (@Operation = 36)
BEGIN
SELECT @ItemID_From = ItemID FROM _Inventory WHERE CharID = @CharID AND Slot = @Slot_From
END
-- MagicCube 추가( PCInv -> MagicCube )
ELSE IF (@Operation = 39)
BEGIN
SELECT @ItemID_From = ItemID FROM _Inventory WHERE CharID = @CharID AND Slot = @Slot_From
END
-- MagicCube 추가( MagicCube -> PCInv )
ELSE IF (@Operation = 40)
BEGIN
SELECT @ItemID_From = ItemID FROM _InventoryForLinkedStorage WHERE LinkedItemID = @GuildID AND Slot = @Slot_From
END
-------------- Dst Item 얻기
IF (@Operation = 0 OR @Operation = 3 OR @Operation = 31) -- dst: inventory
BEGIN
SELECT @ItemID_To = ItemID FROM _Inventory WHERE CharID = @CharID AND Slot = @Slot_To
END
ELSE IF (@Operation = 1 OR @Operation = 2) -- dst: chest
BEGIN
SELECT @ItemID_To = ItemID FROM _Chest WHERE UserJID = @UserJID AND Slot = @Slot_To
END
ELSE IF (@Operation = 16)
BEGIN
SELECT @ItemID_To = ItemID FROM _InvCOS WHERE COSID = @CharID AND Slot = @Slot_To
END
ELSE IF (@Operation = 29 OR @Operation = 30)
BEGIN
SELECT @ItemID_To = ItemID FROM _GuildChest WHERE GuildID = @GuildID AND Slot = @Slot_To
END
-- Avatar 추가 ( Avatar -> PC )
ELSE IF (@Operation = 35)
BEGIN
SELECT @ItemID_To = ItemID FROM _Inventory WHERE CharID = @CharID AND Slot = @Slot_To
END
-- Avatar 추가 ( PC -> Avatar )
ELSE IF (@Operation = 36)
BEGIN
SELECT @ItemID_To = ItemID FROM _InventoryForAvatar WHERE CharID = @CharID AND Slot = @Slot_To
END
-- MagicCube 추가( PCInv -> MagicCube )
ELSE IF (@Operation = 39)
BEGIN
SELECT @ItemID_To = ItemID FROM _InventoryForLinkedStorage WHERE LinkedItemID = @GuildID AND Slot = @Slot_To
END
-- MagicCube 추가( MagicCube -> PCInv )
ELSE IF (@Operation = 40)
BEGIN
SELECT @ItemID_To = ItemID FROM _Inventory WHERE CharID = @CharID AND Slot = @Slot_To
END
-------------- 무결성 검사
IF (@RemoveAndOverwrite <> 0)
BEGIN
-- 두 슬롯 모두 아이템이 존재해야 한다.
IF (@ItemID_From IS NULL OR @ItemID_To IS NULL)
BEGIN
RETURN -1003
END
IF (@ItemID_From = 0 OR @ItemID_To = 0)
BEGIN
RETURN -1004
END
END
ELSE
BEGIN
-- Source 슬롯에만 아이템이 존재해야 한다.
IF (@ItemID_From IS NULL OR @ItemID_From = 0)
BEGIN
RETURN -1005
END
IF (@ItemID_To IS NOT NULL AND @ItemID_To <> 0)
BEGIN
RETURN -1006
END
END
IF (@Operation = 0)
BEGIN
IF (@Slot_To < 13)
BEGIN
DECLARE @CheckValidity INT
EXEC @CheckValidity = _STRG_CHECKITEM_CANBE_EQUIPED @ItemID_From, @Slot_To
IF (@CheckValidity <= 0)
BEGIN
RETURN @CheckValidity
END
END
END
BEGIN TRANSACTION
----------------------------------------------------------
-- Step2. Storage 업데이트
----------------------------------------------------------
-------------- Src Slot 갱신
IF (@Operation = 0 OR @Operation = 2 OR @Operation = 30)
BEGIN
UPDATE _Inventory SET ItemID = 0 WHERE CharID = @CharID AND Slot = @Slot_From
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -2
END
END
ELSE IF (@Operation = 1 OR @Operation = 3)
BEGIN
UPDATE _Chest SET ItemID = 0 WHERE UserJID = @UserJID AND Slot = @Slot_From
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -2
END
END
ELSE IF (@Operation = 16)
BEGIN
UPDATE _InvCOS SET ItemID = 0 WHERE COSID = @CharID AND Slot = @Slot_From
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -2
END
END
ELSE IF (@Operation = 29 OR @Operation = 31)
BEGIN
UPDATE _GuildChest SET ItemID = 0 WHERE GuildID = @GuildID AND Slot = @Slot_From
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -2
END
END
-- Avatar 추가 ( Avatar -> PC )
ELSE IF (@Operation = 35 )
BEGIN
UPDATE _InventoryForAvatar SET ItemID = 0 WHERE CharID = @CharID AND Slot = @Slot_From
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -2
END
END
-- Avatar 추가 ( PC -> Avatar )
ELSE IF (@Operation = 36 )
BEGIN
UPDATE _Inventory SET ItemID = 0 WHERE CharID = @CharID AND Slot = @Slot_From
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -2
END
END
-- MagicCube 추가( PCInv -> MagicCube )
ELSE IF (@Operation = 39 )
BEGIN
UPDATE _Inventory SET ItemID = 0 WHERE CharID = @CharID AND Slot = @Slot_From
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -2
END
END
-- MagicCube 추가( MagicCube -> PCInv )
ELSE IF (@Operation = 40 )
BEGIN
UPDATE _InventoryForLinkedStorage SET ItemID = 0 WHERE LinkedItemID = @GuildID AND Slot = @Slot_From
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -2
END
END
-------------- Dst Slot 갱신
IF (@Operation = 0 OR @Operation = 3 OR @Operation = 31)
BEGIN
UPDATE _Inventory SET ItemID = @ItemID_From WHERE CharID = @CharID AND Slot = @Slot_To
END
ELSE IF (@Operation = 1 OR @Operation = 2)
BEGIN
UPDATE _Chest SET ItemID = @ItemID_From WHERE UserJID = @UserJID AND Slot = @Slot_To
END
ELSE IF (@Operation = 16)
BEGIN
UPDATE _InvCOS SET ItemID = @ItemID_From WHERE COSID = @CharID AND Slot = @Slot_To
END
ELSE IF (@Operation = 29 OR @Operation = 30)
BEGIN
UPDATE _GuildChest SET ItemID = @ItemID_From WHERE GuildID = @GuildID AND Slot = @Slot_To
END
-- Avatar 추가 ( Avatar -> PC )
ELSE IF (@Operation = 35)
BEGIN
UPDATE _Inventory SET ItemID = @ItemID_From WHERE CharID = @CharID AND Slot = @Slot_To
END
-- Avatar 추가 ( PC -> Avatar )
ELSE IF (@Operation = 36)
BEGIN
UPDATE _InventoryForAvatar SET ItemID = @ItemID_From WHERE CharID = @CharID AND Slot = @Slot_To
END
-- MagicCube 추가( PCInv -> MagicCube )
ELSE IF (@Operation = 39)
BEGIN
UPDATE _InventoryForLinkedStorage SET ItemID = @ItemID_From WHERE LinkedItemID = @GuildID AND Slot = @Slot_To
END
-- MagicCube 추가( MagicCube -> PCInv )
ELSE IF (@Operation = 40)
BEGIN
UPDATE _Inventory SET ItemID = @ItemID_From WHERE CharID = @CharID AND Slot = @Slot_To
END
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -3
END
----------------------------------------------------------
-- Step3. Overwrite 해야 하는 경우 원래 대상 슬롯에 있던 아이템 삭제!
----------------------------------------------------------
IF (@RemoveAndOverwrite <> 0)
BEGIN
DECLARE @Rvalue INT
EXEC @Rvalue = _STRG_FREE_ITEM_NoTX @ItemID_To
IF (@Rvalue < 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -4
END
END
----------------------------------------------------------
-- Step4. 4Byte Item Data 갱신 (기존 값이 변경된 경우만!)
----------------------------------------------------------
DECLARE @Old_ItemData INT
SELECT @Old_ItemData = Data FROM _ITEMS WHERE ID64 = @ItemID_From
IF (@Old_ItemData IS NOT NULL AND @Old_ItemData <> @Data)
BEGIN
UPDATE _Items SET Data = @Data WHERE ID64 = @ItemID_From
IF (@@ROWCOUNT = 0 OR @@ERROR <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -4
END
END
----------------------------------------------------------
-- Step4. COMMIT
----------------------------------------------------------
COMMIT TRANSACTION
RETURN 1
|
whats wrong with it ?